这不是一个正常的数据库功能。 然而,你们不是第一个要求这样做的人,也不是像那个人。
解决办法需要两点。 第一是数据词典;Oracle数据库支持反省,但它确实提出了一套看法,使我们对数据库物体的元数据。 在这种情况下,我们需要<代码>用户_tab_columns,这将给我们一个表格的栏目。 第二件是动态的,是能够在操作时间组装,然后执行。 这样做有两种方法,但通常可以 re。
以下法典是概念的证明。 它包含四个参数:
- the name of table you want to search
- the name of that table s primary key
column
- the primary key value you want to
restrict by
- the value you want to search for.
它是粗略的,因此,你可能需要把产出提炼或使方案更加灵活。
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> 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>