我正在寻找一种逻辑,以查找与相应表一起在过程块内使用的所有列名。我们有100个proc,因此手动列出所有清单将非常困难。
例如: proc之一中的动态查询是
v_sql := ' insert into table1
select a.column1 , b.column1 from srctbl1 a,srctbl2 b where a.id=b.id'
execute immediate v_sql
有没有办法获得
这样的结果table column
srctbl1 column1
srctbl1 id
srctbl2 column1
srctbl2 id
答案 0 :(得分:0)
我必须发布答案,因为无法格式化注释中的代码。 @RamaSh,虽然从表面上看联接似乎是一个可行的解决方案,但实际上并非如此。将all_source连接到all_tab_columns无效。
请考虑以下单个静态查询。在该查询中,没有table_name.column.name的单个引用,因为表都是别名并且别名引用了列,并且某些“列”根本不在查询范围之内。此外,在all_source中,该语句需要13行。现在使用3000-4000线包尝试图像。
select customer, account_number
, purchases_total, payments_total, purchased_total - payments_total net_change
from (
select cust.name customer, cust.account_number
, sum(pur.amt) purchased_total, sum(pay.amount) payments_total
from customers cust
join customer_orders pur on (pur.cust_id = cust.cust_id)
join customer_payments pay on (pay.cust_id = cust.cust_id)
where trunc(pur.activity_date) > trunc(sysdate-31)
and trunc(pay.activity_date) > trunc(sysdate-31)
group by cust.name, cust.account_number
)
order by purchased_total - payments_total desc;
这甚至还没有开始解决立即执行动态sql的问题,也没有开始解决可能更复杂的dbms_sql。
答案 1 :(得分:0)
使这样的过程从过程代码中查找列确实是一项艰巨的任务,因为查询可以包含很多关键字,而不仅仅是select和from,我可以告诉你的是,您可以找到过程中使用的表,下面的过程将引用新创建的表temp123456中的表名称:
set serveroutput on;
declare
cursor c1 is select distinct(name) from user_source
where type='PROCEDURE';
begin
execute immediate 'create table temp123456 as select
select
referenced_owner,
referenced_name,
referenced_type
from
dba_dependencies
where rownum<1';
for i in c1
loop
insert into temp123456(referenced_owner,
referenced_name,
referenced_type)
select
referenced_owner,
referenced_name,
referenced_type
from
dba_dependencies
where
name= i.name;
and
owner = 'SCHEMA_OWNER'
order by
referenced_owner, referenced_name, referenced_type;
end loop;
end;