【问题标题】:PLS-00330 invalid use of type name or subtype name on package bodyPLS-00330 在包体上无效使用类型名称或子类型名称
【发布时间】:2016-11-23 23:14:37
【问题描述】:

我是 PL/SQL 的新手,我正在尝试创建这个包,到目前为止我遇到了很多问题。

create or replace PACKAGE Pkg IS
   TYPE motivos IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
   PROCEDURE Proc(lote IN VARCHAR2, e IN NUMBER, obs IN VARCHAR2, motives IN motivos);
END Pkg;
/
CREATE OR REPLACE PACKAGE BODY Pkg IS
    PROCEDURE Proc(lote IN VARCHAR2, e IN NUMBER, obs IN VARCHAR2, motives IN motivos) AS
    exist NUMBER(2);
    BEGIN
        SELECT count(*) INTO exist
        FROM Lote l
        WHERE l.numero=lote;

        IF exist>0 THEN
            UPDATE Lote SET empleadoDescarte=e, observacionesDescarte=obs, fechaDescarte=sysdate WHERE numero=lote;
      COMMIT;

            FOR motivo IN motivos           
            LOOP    
                Insert into MOTIVO (NROLOTE, MOTIVO) values (lote,motivo);
            END LOOP;           
      COMMIT;

            DBMS_OUTPUT.PUT_LINE('Ok.');
        ELSE
            DBMS_OUTPUT.PUT_LINE('Error.');
        END IF;     
    END;
END Pkg;
/

当我将它作为脚本运行时,它给了我以下错误:

Error(13,4): PL/SQL: Statement ignored
Error(13,18): PLS-00330: invalid use of type name or subtype name

问题出在exist 上,通过阅读与此问题相关的其他回答我无法弄清楚原因

【问题讨论】:

    标签: oracle plsql oracle-sqldeveloper


    【解决方案1】:

    您在如何使用变量和类型方面存在一些问题;尝试以这种方式编辑:

    CREATE OR REPLACE PACKAGE BODY Pkg IS
        PROCEDURE Proc(
                       lote       IN VARCHAR2,
                       e          IN NUMBER,
                       obs        IN VARCHAR2,
                       motives    IN motivos
                      ) AS
            exist                                   NUMBER(2);
        BEGIN
            SELECT COUNT(*)
              INTO exist
              FROM Lote l
             WHERE l.numero = lote;
    
            IF exist > 0
            THEN
                UPDATE Lote
                   SET empleadoDescarte         = e,
                       observacionesDescarte    = obs,
                       fechaDescarte            = SYSDATE
                 WHERE numero = lote;
    
                COMMIT;
    
                FOR i IN motives.first .. motives.last
                LOOP
                    INSERT INTO MOTIVO(NROLOTE, MOTIVO)
                         VALUES (lote, motives(i));
                END LOOP;
    
                COMMIT;
    
                DBMS_OUTPUT.PUT_LINE('Ok.');
            ELSE
                DBMS_OUTPUT.PUT_LINE('Error.');
            END IF;
        END;
    END Pkg;
    /
    

    此外,更好的命名约定可能有助于轻松查看此类问题;例如,如果你调用你的 IN 参数 p_XXX 和你的类型 ty_XXX,那么在代码的每个地方都很容易理解什么是参数、类型等等

    【讨论】:

    • 谢谢,我会听从你的建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多