PLS-00330 在包体上无效使用类型名称或子类型名称
PLS-00330 invalid use of type name or subtype name on package body
我是 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
上,我无法通过阅读与此问题相关的其他答案来弄清楚原因
您在使用变量和类型方面遇到了一些问题;尝试这样编辑:
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
,在代码的每个地方都很容易理解什么是参数,什么是类型,等等
我是 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
上,我无法通过阅读与此问题相关的其他答案来弄清楚原因
您在使用变量和类型方面遇到了一些问题;尝试这样编辑:
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
,在代码的每个地方都很容易理解什么是参数,什么是类型,等等