如何从oracle中的查询中选择表名

时间:2015-12-04 12:30:56

标签: oracle

select SRI_PACK_INDEX_VAL 
from (select TABLE_NAME 
      from all_tables 
      where table_name like '%SE_RAO_INDEX_04_12_2015%');

您好,  上面的查询在oracle中不起作用。任何人都可以帮我解决这个问题

2 个答案:

答案 0 :(得分:1)

您无法从这样的表中动态选择,因为Oracle的解析器在获取之前无法弄清楚它需要知道哪些表需要读取。如果要进行动态提取,则需要执行动态sql。有点像(原谅任何轻微的语法错误 - 我现在远离我的数据库

declare
   index_val number; -- i am assuming it is a number, change as appropriate
 begin
   -- I'm doing this in a loop if there are multiple tables that meet your name mask. 
   -- If there will only be one, then just select it into a variable and use it that way instead
   for tab_name in (SELECT TABLE_NAME 
                     from all_tables 
                     where table_name like '%SE_RAO_INDEX_04_12_2015%')
    loop
        execute immediate 'select SRI_PACK_INDEX_VAL from '||tab_name.table_name 
        into index_val;
         -- do your stuff with it
    end loop;
 end;

现在,如果select只返回一行,则可以正常工作。如果你带回多行,那么你必须以不同的方式处理它。在这种情况下,您要么想要执行一个pl / sql块并在那里嵌入您的结果处理,要么立即执行批量收集到一个数组an example on how to do that is here.

答案 1 :(得分:0)

select
    extractvalue(
        xmltype(
            dbms_xmlgen.getxml(
                'select sri_pack_index_val a from '||owner||'.'||table_name
            )
        ), '/ROWSET/ROW/A'
    ) sri_pack_index_val 
from all_tables
where table_name like '%SE_RAO_INDEX_04_12_2015%';

此查询基于Laurent Schneider的帖子。这是SQLFiddle演示。

这是在SQL中创建动态SQL的一个巧妙技巧,但它有一些潜在的问题。它可能不如Michael Broughton所示的典型动态SQL方法快。在尝试将其用于大型生产查询时,我遇到了一些奇怪的错误。

我建议仅使用此方法进行即席查询。