2017-02-14 8 views
1

異なる環境に存在するテーブルからテーブルにデータを挿入する必要があります。 envリストは、my_envテーブルから取得されます。PLSQL:tovable名を動的に維持しながら、別のテーブルにmayvsの1つのテーブルを挿入する

DECLARE 
WRK_STS VARCHAR2(2) := 'PP'; 
MY_ENV VARCHAR2(50) := ''; 
WRK_ENV NUMBER(6)  := 0; 
BEGIN 
    FOR t in (SELECT DISTINCT(envid) FROM MY_ENV ORDER BY  ENVID ASC) 
    LOOP 
    WRK_ENV := WRK_ENV+1; 
    MY_ENV := 'ENV_' || t.envid || '.table002'; 
    INSERT INTO MYTAB101(DATE,STS, MYENV, nAME, DESCR, MYTYPE) 
    SELECT null, ' || WRK_STS|| ',' || WRK_ENV || ',NAME, DESCR,MYTYPE from ' || MY_ENV; 
    END LOOP; 
EXCEPTION 
/*Handle exception*/ 
END; 
/
COMMIT; 

しかし、私はエラーが取得しています:

ORA-06550:行15、列61:PLを私の場合のためにENVSの数は、ENV名iは下のように書きましたので、ダイナミックになりそう異なります/ SQL:ORA-00942:表またはビューが存在しませんORA-06550:行12、列3:PL/SQL:SQL文が無視される06550. 00000 - "行%s、列%s:\ n%s" *原因通常はPL/SQLコンパイル・エラーです。 *アクション:コミット。

私は直接それが

「ENV368.table002から」同じように動作したenv名を入力すると、誰かがここで間違っているものを提案することができますか?

ありがとうございました!

+1

。 EXECUTE IMMEDIATEを使用する必要があります – OldProgrammer

+0

私はすぐにexceuteを試みました: EXECUTE IMMEDIATE 'INSERT INTO MYTAB101(DATE、STS、MYENV、NAME、DESCR、MYTYPE) SELECT NULL、' || WRK_STS || '、' || WRK_ENV || '、NAME、DESCR、MYTYPEから' || MY_ENV; これもエラー – Mishti

+0

です。エラーは何ですか? – OldProgrammer

答えて

0

テストされていないが、私は一般的なフォーマットは次のようなものであることを期待する:ことはできません

declare 
    l_wrk_stats varchar2(2) := 'PP'; 
    l_my_env varchar2(50); 
    l_wrk_env number(6) := 0; 
    l_sql  varchar2(500); 
begin 
    for r in (
     select distinct envid 
     from my_env 
     order by envid 
    ) 
    loop 
     l_wrk_env := l_wrk_env + 1; 
     l_my_env := 'ENV_' || r.envid || '.table002'; 
     l_sql := 
      'insert into mytab101 (date, sts, myenv, name, descr, mytype)' || chr(10) || 
      'select null, :b1, :b2, name, descr, mytype from ' || l_my_env; 

     execute immediate l_sql using l_wrk_stats, l_wrk_env; 
    end loop; 

exception 
    when others then 
     raise_application_error(-20000, 'Command failed: ' || l_sql, true); 
end; 
+0

Thannks !!出来た。 – Mishti

+0

2テーブルの結合にこのクエリを使用できますか?私はtable002とtable001を持っています。次に、それを修正します: 'mytab101(日付、sts、myenv、名前、descr、mytype)に挿入' '| chr(10)|| 'select null、:b1、:b2、a.name、a.descr、b.mytype from' || l_my_env a、l_my_env2 b || 'where a.name = b.name'; 上記は1つ上の作業ですか? – Mishti

0

アンダースコアは「ENV_」という文字列でもありますので、下記をご覧持っている:

MY_ENV := 'ENV_' || t.envid || '.table002'; 

を私はあなたのケースのためにそれがあるべきだと思う:

MY_ENV := 'ENV' || t.envid || '.table002'; 
0

ここでの主なアイデアは、使用することです動的SQLおよびEXECUTEを使用すると、要件を満たすことができます。あなたのブロックを少し修正しました。私は私と一緒に仕事場を持っていないので、私はそれをテストしていない。それが役に立てば幸い。

DECLARE 
    WRK_STS VARCHAR2(2) := 'PP'; 
    MY_ENV VARCHAR2(50) := ''; 
    WRK_ENV NUMBER(6) := 0; 
TYPE ENV 
IS 
    TABLE OF VARCHAR2(100); 
    env_tab env; 
BEGIN 
    EXECUTE IMMEDIATE 'SELECT DISTINCT(envid) FROM '||MY_ENV||' ORDER BY ENVID' BULK COLLECT INTO env_tab; 
    FOR i IN env_tab.FIRST..env_tab.LAST 
    LOOP 
    WRK_ENV := WRK_ENV+1; 
    MY_ENV := 'ENV_' || ENV_TAB(I) || '.table002'; 
    EXECUTE IMMEDIATE ' INSERT INTO MYTAB101  
    (date,STS, MYENV, nAME, DESCR, MYTYPE  
    )  
     SELECT NULL,  
     WRK_STS,  
     wrk_env,  
     ''NAME'',  
     ''DESCR'',  
     ''MYTYPE''  
FROM ' || MY_ENV; 
    END LOOP; 
    COMMIT; 
EXCEPTION 
WHEN OTHERS THEN 
    NULL; --when others should not be used 
END; 
/
関連する問題