Oracle通过部分名称在一组表中进行选择

时间:2016-03-04 19:06:28

标签: oracle

我试图从一组表中选择信息。最初,我有

 SELECT table_name,
                    to_number(
                    extractvalue(
                    xmltype(
                    dbms_xmlgen.getxml('select count(*) c '|| ' from ' ||owner||'.'||table_name))
                    ,'/ROWSET/ROW/C')) count
                    from all_tables
                    where table_name like 'PAY0%' OR  table_name like 'PAY1%'

然后使用

循环遍历代码中的所有表
 foreach(table_name in tables){
    SELECT CUST_NUMBER 
    FROM #table_name#
}

现在我尝试通过执行以下操作将两者结合起来,以便从每个表中获取cust_number,但它会说'" CUST_NUMBER":无效的标识符& #39;

select CUST_NUMBER 
                    from  ( SELECT table_name,
                            to_number(
                            extractvalue(
                            xmltype(
                            dbms_xmlgen.getxml('select count(*) c '|| ' from ' ||owner||'.'||table_name))
                            ,'/ROWSET/ROW/C')) count
                            from all_tables
                            where table_name like 'PAY0%' OR  table_name like 'PAY1%') PayTables

我知道问题是第一个查询获取表名而不是数据,但我不知道如何在不单独循环的情况下获取数据。

1 个答案:

答案 0 :(得分:2)

如果我正确理解您的需求,以下内容可能有所帮助:

declare
    vSQL varchar2(32767);
    type tabNum is table of number;
    vResult tabNum;
begin
    select listagg( 'select cust_number from ' || owner || '.' || table_name,
                    ' UNION ALL '
                  ) within group ( order by null)
    into vSQL
    from dba_tables
    where table_name like 'PAY0%' OR  table_name like 'PAY1%';    
    --
    dbms_output.put_line(vSQL);
    --
    execute immediate vSQL bulk collect into vResult;
    --    
    for i in vResult.first .. vResult.last loop
        dbms_output.put_line(vResult(i));
    end loop;
end;

它动态构建一个SQL语句,从所有符合条件的表中提取值;在示例中,我运行语句将结果提取到结构中,但您可以打开游标,或者做任何您需要的操作。