2017-05-15 154 views
0

我想从具有ID字段的所有列中获取数据库中的所有ID。 我的剧本至今是:获取数据库中的所有ID

BEGIN 
FOR tname IN (select table_name from all_tab_columns where column_name = 'ID' and owner='PACC_USER') LOOP 
    EXECUTE IMMEDIATE 
    'select unique id from ' || tname; 
END LOOP; 
End; 

我得到的错误PLS-00306: wrong number or types of arguments in call to '||'。究竟是什么问题?欢迎任何帮助:)

+4

'tname'是一个记录。你需要'tname.table_name'。你的下一个问题将是如何处理结果。 –

回答

2

在您的代码中tname是一个引用游标结果集的记录,即一个名称空间而不是一个属性。解决这个问题是这样的:

BEGIN 
    FOR tname IN (select table_name 
        from all_tab_columns 
        where column_name = 'ID' and owner='PACC_USER') 
    LOOP 
     EXECUTE IMMEDIATE 
     'select unique id from ' || tname.table_name ; 
    END LOOP; 
End; 

人们希望列名为ID将返回唯一行而不需要unique关键字,但我们生活在乱世。您的代码需要将结果选择到某些内容:PL/SQL不是T-SQL,它需要目标变量。所以让我们再改进一下你的代码。

declare 
    ids_nt sys.dbms-debug_vc2coll; 
BEGIN 
    FOR tname IN (select table_name 
        from all_tab_columns 
        where column_name = 'ID' and owner='PACC_USER') 
    LOOP 
     EXECUTE IMMEDIATE 
      'select unique id from ' || tname.table_name 
      bulk collect into ids_nt; 
     dbms_output.put_line('IDS for table '|| tname.table_name); 
     for idx in ids_nt.first() .. ids_nt.last loop 
      dbms_output.put_line(ids_nt(idx)); 
     end loop; 
    END LOOP; 
End; 

也许这不是你想用ID做的事情。如果是这样,请编辑您的问题以阐明您的意图。

-2

从all_tab_column中选择column_name,表名,其中up​​per(column_name)= upper('Id');