【问题标题】:Gettig error PLS-00364出现错误 PLS-00364
【发布时间】:2016-05-10 13:28:21
【问题描述】:

我正在尝试创建一个存储过程,其中我将 select 语句传递给 for 循环,并且我正在使用在运行时传递并出现以下错误的动态表:

第 23 行 PLS-00364:循环索引变量“我”使用无效
第 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');

【问题讨论】:

  • 您在第一个动态插入中有不平衡的单引号,但不确定您希望它是什么样子,因为第二个也是错误的 - 值太多...
  • 是的,你是对的..第二个插入的值确实比定义的列多。

标签: oracle plsql


【解决方案1】:

你想要的是一个 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;

【讨论】:

  • 我在使用上面的代码时遇到错误 LINE 17 PLS-00324: cursor attribute may not be applied to non-cursor 'CLREF' LINE 17 PL/SQL: SQL Statement denied LINE 16 PL/SQL:SQL 语句被忽略 LINE 16 PLS-00330:类型名称或子类型名称的使用无效
  • 我把它声明为 c1ref 而不是 CLREF ..也许有错字?
  • 谢谢我做了一个小改动 TYPE c1ref is REF CURSOR;到 c1ref SYS_REFCURSOR;之后它就可以工作了,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多