我有以下表名称模板,例如,一对夫妇,名字和数字相同:fmj.backup_semaforo_geo_THENUMBER,例如:
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输出的情况下实现这一目标?
谢谢。
大概您当前的查询正在获取ORA-00904: "CALLE": invalid identifier,因为子查询没有名为的列CALLE。不幸的是,您不能在运行时那样为查询提供表名,而必须诉诸于动态SQL。
ORA-00904: "CALLE": invalid identifier
CALLE
这样的事情将遍历所有表,并且对于每个表都会CALLE从每个表中获取所有值,然后您就可以遍历这些表。我曾经DBMS_OUTPUT显示过它们,假设您是在SQL * Plus或其他可以处理的事情中执行的;但您可能想对他们做其他事情。
DBMS_OUTPUT
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; /