列出proc中使用的所有列以及各自的表名

时间:2019-08-15 06:30:12

标签: sql oracle plsql

我正在寻找一种逻辑,以查找与相应表一起在过程块内使用的所有列名。我们有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

2 个答案:

答案 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;