2012-09-11 38 views
0

我有以下的表名模板,有几个具有相同的名称和一些底:fmj.backup_semaforo_geo_THENUMBER,例如:如何从all_tables中选择表格?

select * from fmj.backup_semaforo_geo_06391442 
select * from fmj.backup_semaforo_geo_06398164 
... 

可以说,我需要从每个表中选择一列这与 'fmj.backup_semaforo_geo_%' 过滤成功,我想这一点:

SELECT calle --This column is from the backup_semaforo_geo_# tables 
    FROM (SELECT table_name 
     FROM all_tables 
    WHERE owner = 'FMJ' AND table_name LIKE 'BACKUP_SEMAFORO_GEO_%'); 

但我得到的all_tables表名数据:

TABLE_NAME 
---------- 
BACKUP_SEMAFORO_GEO_06391442 
BACKUP_SEMAFORO_GEO_06398164 
... 

如何在不获取all_tables输出的情况下实现这一目标?

谢谢。

+0

这是正确的你已经得到属于FMj用户的所有表。你期望看到什么结果? –

+0

现在,我现在是正确的,但我需要的: SELECT table_name的 FROM ALL_TABLES WHERE所有者=“FMJ”和表名LIKE“BACKUP_SEMAFORO_GEO_%” 来输出串匹配的查询表,所以我可以追加一条到外查询,以便最终我得到的东西,如: SELECT卡勒 - 这列从backup_semaforo_geo_#表 FROM BACKUP_SEMAFORO_GEO_06391442,BACKUP_SEMAFORO_GEO_06398164 ... 我现在读它,看看我认为它走错了路... – MauJFernandez

回答

2

想必你当前的查询越来越ORA-00904: "CALLE": invalid identifier,因为子查询没有一个叫CALLE列。不幸的是,你不能在运行时为查询提供表名,并且必须求助于dynamic SQL

这样的事情将循环遍历所有的表格,并且每个表格都会从每个表格中获得所有值,即CALLE,然后您可以循环。我使用DBMS_OUTPUT来显示它们,假设你在SQL * Plus中执行此操作或者可以处理该操作;但你可能想要与他们做别的事情。

set serveroutput on 

declare 
    -- declare a local collection type we can use for bulk collect; use any table 
    -- that has the column, or if there isn't a stable one use the actual data 
    -- type, varchar2(30) or whatever is appropriate 
    type t_values is table of table.calle%type; 
    -- declare an instance of that type 
    l_values t_values; 
    -- declare a cursor to generate the dynamic SQL; where this is done is a 
    -- matter of taste (can use 'open x for select ...', then fetch, etc.) 
    -- If you run the query on its own you'll see the individual selects from 
    -- all the tables 
    cursor c1 is 
     select table_name, 
      'select calle from ' || owner ||'.'|| table_name as query 
     from all_tables 
     where owner = 'FMJ' 
     and table_name like 'BACKUP_SEMAFORO_GEO%' 
     order by table_name; 
begin 
    -- loop around all the dynamic queries from the cursor 
    for r1 in c1 loop 
     -- for each one, execute it as dynamic SQL, with a bulk collect into 
     -- the collection type created above 
     execute immediate r1.query bulk collect into l_values; 
     -- loop around all the elements in the collection, and print each one 
     for i in 1..l_values.count loop 
      dbms_output.put_line(r1.table_name ||': ' || l_values(i)); 
     end loop; 
    end loop; 
end; 
/
+0

令人印象深刻,非常感谢! – MauJFernandez

0

可能是PLSQL程序中的动态SQL;

for a in (SELECT table_name 
      FROM all_tables 
      WHERE owner = 'FMJ' AND table_name LIKE 'BACKUP_SEMAFORO_GEO_%') 
LOOP 
    sql_stmt := ' SELECT calle FROM' || a.table_name; 
    EXECUTE IMMEDIATE sql_stmt; 
    ... 
    ... 
END LOOP;