2016-11-23 8 views
0

私はPL/SQLを初めて使用しています。このパッケージを作成しようとしていますが、これまでにかなりの問題が発生しました。PLS-00330パッケージ本体の型名またはサブタイプ名の無効な使用

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であると私は、関連する他のanwsersを読み取ることにより、理由を把握することができていませんこの問題へ

答えて

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を呼び出すと、コードのどの場所でも、パラメータ、タイプなどがわかりやすくなります

+0

ありがとう、私はあなたのアドバイスに従います – moondaisy

関連する問題