Gettig错误PLS-00364

时间:2016-05-10 13:28:21

标签: oracle plsql

我试图创建一个存储过程,我将select语句传递给for循环,并且我使用动态表,它在运行时传递并低于错误:

  

LINE 23 PLS-00364:循环索引变量' I'使用无效
     LINE 19 PL / SQL:ORA-00942:表或视图不存在

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;

我使用以下方法调用该程序:

EXEC CREATE_TEST('abc');

1 个答案:

答案 0 :(得分:0)

你想要的是一个REF CURSOR,因为你不能使用带有动态sql的游标循环。

我不知道您的列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;