這不是數據庫功能正常的片。然而,你不是第一個問過這個問題的人,或者類似的東西。
的解決方案需要兩件事情。首先是數據字典; Oracle數據庫不支持Reflection,但它帶有一組視圖,它們爲我們提供了有關數據庫對象的元數據。在這種情況下,我們需要user_tab_columns
,它會給我們給定表的列。第二件事是動態SQL;這是在運行時組裝SQL查詢並執行它的能力。有幾種方法可以做到這一點,但通常使用ref遊標就足夠了。
以下代碼是概念驗證。它有四個參數:
- 您要搜索
- 該表的主鍵 列的名稱表的名稱
- 要 主鍵值由
- 值您限制想要搜索。
現在已經過時了,所以您可能需要編輯它以整理輸出或使程序更加靈活。
create or replace procedure search_cols
(tname in user_tables.table_name%type
, pk_col in user_tab_columns.column_name%type
, pk in number
, val in number)
is
firstcol boolean := true;
stmt varchar2(32767);
result varchar2(32767);
rc sys_refcursor;
begin
stmt := 'select ';
<<projection>>
for lrec in (select column_name from user_tab_columns
where table_name = tname
and column_name != pk_col
and data_type = 'NUMBER'
order by column_id)
loop
if not firstcol then
stmt := stmt || chr(10) || '||'',''||';
else
firstcol := false;
end if;
stmt := stmt || ' case when '|| lrec.column_name||' = '|| val ||
' then '''|| lrec.column_name || ''' else null end';
end loop projection;
stmt := stmt || chr(10)|| ' from '||tname||' where '|| pk_col || ' = '|| pk;
-- dbms_output.put_line(stmt);
open rc for stmt;
fetch rc into result;
close rc;
dbms_output.put_line(tname || '::' || val || ' found in '||result);
end search_cols;
/
正如您所看到的,動態SQL很難閱讀。調試起來比較困難:)因此,有一種方法來顯示最終聲明是一個好主意。
總之,這裏的結果:
SQL> set serveroutput on size unlimited
SQL> exec search_cols('T23', 'ID', 111, 10)
T23::10 found in ,COL_B,COL_C,
PL/SQL procedure successfully completed.
SQL> exec search_cols('T23', 'ID', 222, 10)
T23::10 found in COL_A,,,
PL/SQL procedure successfully completed.
SQL>
來源
2010-01-26 16:18:26
APC
是的,這是我知道的事情必須在那裏。謝謝! – 2010-01-27 05:19:11