0

次のテーブル名テンプレートがあります。同じ名前で最後に番号が付いたものがいくつかあります: 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 出力を取得せずにそれを達成するにはどうすればよいですか?

ありがとう。

4

2 に答える 2

2

ORA-00904: "CALLE": invalid identifierサブクエリには という列がないため、おそらく現在のクエリは を取得していますCALLE。残念ながら、そのような実行時にクエリにテーブル名を提供することはできず、動的 SQLに頼る必要があります。

このようなものは、すべてのテーブルをループし、それぞれについて、それぞれからすべての値を取得し、CALLEループすることができます。DBMS_OUTPUTSQL*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;
/
于 2012-09-11T15:34:47.783 に答える
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;
于 2012-09-11T15:20:50.473 に答える