2017-09-18 30 views
0

こんにちは私のプロジェクトでは、別のリンクデータベースからデータをコピーして新しいステージングテーブルを作成しています。私はテーブルSTG_ABC_EMPTABLE、STG_ABC_DEPTTABLE、..........などの名前を付けましたが、私が引っ張っているソースDBはemployee_EMP、department_DEPTのような名前になっています。私はそれをそのままテーブルを挿入し、挿入時にいくつかの列を追加するPL/SQLブロックを作成しようとしています。私はすべてのソーステーブルをループして余分な列を追加してターゲットにデータを挿入することができるステートメントを思いつくことはできません。また、私のテーブルは、各テーブルの2つの余分な列を持つソーステーブルから作成されます。また、STG_ABC_EMPTABLEにemployee_EMP、STG_ABC_DEPTTABLEにdepartment_DEPTを挿入する方法もわかりません。ここには私が思いついたものがありますが、それを完了しようとしていました。別のリンクデータベースで複数のテーブルを使用して複数のテーブルにデータを挿入しよう

set SERVEROUTPUT ON; 
DECLARE 
cursor c1 IS 
select distinct A.table_name as table_name_S,B.table_name as table_name_T from [email protected]_link A inner join (select distinct table_name from all_tab_columns where table_name like 'STG_%') B 
ON A.table_name LIKE '%' || substr(B.table_name,9,3) || '' where A.owner in('source'); 
v_count number; 
time_rec timestamp; 
c_source_GC varchar2(28) := 'XYZ'; 
BEGIN 
v_count:=0; 
for items in c1 
LOOP 
Execute immediate 'insert into '|| items.table_name_T || 
'(select ' || items.table_name_S || '.*,' 
|| c_source_GC || ' as SOURCE_SYSTEM, 
current_timestamp as DATE_LOADED_TIMESTAMP 
from gntc.' || items.table_name_S ||'@db_link)'; 
v_count:= sql%Rowcount; 
dbms_output.put_line('Number of rows inserted '||v_count||' into '|| items.table_name_T); 
END LOOP; 

commit; 
end; 
+0

コードはまったく動作していますが、エラー/誤った動作は何ですか? –

+0

@TedFilippidisカーソルを使用してコードを更新しました。「ORA-00904:「XYZ」:無効な識別子 ORA-06512:行13」 – Auguster

+0

動的SQLの構文エラーについては、生成されたSQL文ブロック内でローカルの 'exec_sql'プロシージャを定義し、生成されたSQLをそれに渡します。どちらもデバッガに優しいものです。 –

答えて

1

このコードを試してください。

set SERVEROUTPUT ON; 

declare 
    cursor c1(p_source varchar2) is 
     select 
       a.table_name as table_name_s, 
       listagg(a.column_name, ', ') within group (order by a.column_id) columns 
       (select b.table_name from all_tables b where b.table_name like 'STG_ABC_%' and substr(b.table_name,9,3) = substr(a.table_name, instr(a.table_name, '_') + 1, 30)) table_name_t 
     from [email protected]_link a 
     where a.owner = (p_source) 
     group by a.table_name; 

    v_count number; 
    time_rec timestamp; 

    c_source_gc varchar2(28) := 'XYZ'; 

begin 
    v_count := 0; 
    for items in c1('SOURCE') loop 
     if items.table_name_t is null then 
      dbms_output.put_line('No target table found for source '||items.table_name_s); 
     else 
      execute immediate 'insert into '|| items.table_name_t ||' ('||items.columns||', source_system, date_loaded_timestamp) 
           select '||items.columns||', '''||c_source_gc||''', systimestamp 
           from '||items.table_name_s||'@db_link' 
      v_count:= sql%rowcount; 
      dbms_output.put_line('Number of rows inserted '||v_count||' into '|| items.table_name_t); 
     end if; 
    end loop; 

    commit; 
end; 
+0

おかげさまで大変助かりました。 – Auguster