2016-05-10 81 views
0

私はループのためにselect文を渡しているストアドプロシージャを作成しようとしていると私は、実行時に渡すと、エラーの下になっている動的テーブルを使用しています:GettigエラーPLS-00364

LINE 23 PLS-00364: loop index variable 'I' use is invalid
LINE 19 PL/SQL: ORA-00942: table or view does not exist

私が使用してプロシージャを呼び出す
CREATE OR REPLACE PROCEDURE CREATE_TEST(TBL_NM IN VARCHAR2) 
IS 

SRC_ID NUMBER(38); 
SQL_Q VARCHAR2(250); 
DEL_F VARCHAR2(250); 

BEGIN 



    FOR I in (SELECT DEL_IND FROM TBL_NM) 
    LOOP 
     SRC_ID := SRC_FILE_ID_SEQ.NEXTVAL; 

     IF I.DEL_IND = 0 
     THEN 
      execute immediate 'INSERT INTO TEST_HIST ' || ' (a,b,c,d,e,DEL_IND) ' || 
      ' SELECT a,b,c,d,e, '|| 0 || ' || ' FROM ' || TBL_NM; 

     ELSIF I.DEL_IND = 1 
     THEN 

      execute immediate 'INSERT INTO JESTX_IGNR ' || ' (a,b,c,d,e,DEL_IND,SRC_ID_NO) ' || 
      ' SELECT a,b,c,d,e, '|| 2 ||' , '|| SRC_ID || ' FROM ' || TBL_NM; 

     END IF ; 

    END LOOP; 
    COMMIT; 

END; 

:あなたは動的SQLを使用したループのカーソルを使用することはできませんよう

EXEC CREATE_TEST('abc'); 
+0

の下

試し秒が間違っすぎるので、あなたは、それが見えるようにしたいのかわからない - あなたをはい... –

+0

値が多すぎ2番目のインサートは定義された列よりも多くの値を持っています。 – cableload

答えて

0

何をしたいは、REF CURSORです。

列DEL_INDの正確なデータ型はわかりません。それに応じて宣言してください。 Hereは、Oracle REF CURSORSに関するさらに詳しい情報です。あなたが最初の動的挿入中にアンバランスな単一引用符を持っていますが、

CREATE OR REPLACE PROCEDURE CREATE_TEST(TBL_NM IN VARCHAR2) 
IS 
TYPE c1ref is REF CURSOR; 
SRC_ID NUMBER(38); 
SQL_Q VARCHAR2(250); 
DEL_F VARCHAR2(250); 
DEL_IND NUMBER(5); 
BEGIN 

    vsql_text := 'select DEL_IND from ' || TBL_NM; 

    open c1ref for vsql_text; 

    LOOP 
     SRC_ID := SRC_FILE_ID_SEQ.NEXTVAL; 
     fetch c1ref into DEL_IND; 
     exit when c1ref%NOTFOUND; 
     IF (DEL_IND = 0) 
     THEN 
      execute immediate 'INSERT INTO TEST_HIST ' || ' (a,b,c,d,e,DEL_IND) ' || 
      ' SELECT a,b,c,d,e, '|| 0 || ' || FROM ' || TBL_NM; 

     ELSIF (DEL_IND = 1) 
     THEN 

      execute immediate 'INSERT INTO JESTX_IGNR ' || ' (a,b,c,d,e,DEL_IND) ' || 
      ' SELECT a,b,c,d,e, '|| 2 ||' , '|| SRC_ID || ' FROM ' || TBL_NM; 

     END IF ; 

    END LOOP; 
    CLOSE c1ref; 
    COMMIT; 

END; 
+0

上記のコードを使用しているときにエラーが発生していますLINE 17 PLS-00324:cursor属性が非カーソル 'CLREF'に適用されない LINE 17 PL/SQL:SQL文が無視されるLINE 16 PL/SQL:SQLステートメントが無視されました LINE 16 PLS-00330:タイプ名またはサブタイプ名の無効な使用 –

+0

これはCLRFではなくc1refとして宣言していました。おそらくタイプミスがありますか? – cableload

+0

私は1つの小さな変更をしました。タイプc1refはREF CURSORです。 SYS_REFCURSORをc1refに設定します。その後、それは働いている、 –

関連する問題