这不是数据库功能正常的片。然而,你不是第一个问过这个问题的人,或者类似的东西。
的解决方案需要两件事情。首先是数据字典; 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