2014-10-23 3 views
13

Kann mir jemand helfen, meine pl/sql-Prozedur in ein Paket zu packen? Ich habe versucht, und ich bin zu kämpfen mit ihm:Oracle-Fehler PLS-00323: Unterprogramm oder Cursor ist in einer Paketspezifikation deklariert und muss im Paketkörper definiert werden

Das ist, was ich habe, für mein Paket Spezifikation:

CREATE OR REPLACE PACKAGE film_pkg 
IS 
title VARCHAR2(100); 
PROCEDURE get_films(fname VARCHAR2); 
END film_pkg; 

-- 

Das ist mein Paket Körper, wo im in die Probleme bei der Ausführung:

CREATE OR REPLACE PACKAGE BODY film_pkg 
IS 
    PROCEDURE get_films (fname IN  film.title%TYPE, 
         r_date  OUT film.release_date%TYPE, 
         dur   OUT film.duration%TYPE) 
    AS 
    BEGIN 
     SELECT release_date, duration 
     INTO r_date, dur 
     FROM FILM 
     WHERE title = fname; 
    EXCEPTION 
     WHEN NO_DATA_FOUND 
     THEN 
     r_date := ''; 
     dur := ''; 
    END get_films; 
END film_pkg; 

wenn mir jemand die Fehler beheben helfen könnte ich es zu schätzen wissen würde:

Error(4,11): PLS-00323: subprogram or cursor 'GET_FILMS' is declared in a package specification and must be defined in the package body 

Antwort

26

Ihre Kopf- und Körper Verfahren defi nition nicht übereinstimmen

in der Kopfzeile Sie haben:

PROCEDURE get_films(fname VARCHAR2); 

Während im Körper:

PROCEDURE get_films(fname IN film.title%type, 
    r_date OUT film.release_date%type, dur OUT film.duration%type) 

Sie wahrscheinlich die Header-Definition mit den zwei zusätzlichen OUT params nur aktualisieren müssen ?

Zusammengefasst

  • die Header-Definition Sicherstellen, dass alle Parameter des Körpers Implementierung entspricht (Anzahl der Parameter, die Namen der Parameter, die Reihenfolge der Parameter und die Parametertypen)
  • Per Alex Kommentar , mischen Sie nicht den benutzerdefinierten Typ (film.title%type) mit dem Basistyp (VARCHAR2). Wählen Sie das eine oder das andere.
+0

Als ich versuchte, dass ich den Fehler in der pkg-Stelle bekam: Fehler (4,11): PLS-00323: Unterprogramm oder Cursor 'GET_FILMS' ist in einer Paketspezifikation deklariert und muss im Paket Körper – SqlNoob

+1

@SqlNoob definiert werden - "% type" ist in Ordnung, aber Sie müssen genau die gleiche Deklaration verwenden, Sie können nicht mischen und zusammenpassen, auch wenn Sie wissen, dass sie gleich sind; hast du die spec 'fname IN film gemacht?title% type auch, oder lass das als 'varchar'? Die gesamte Erklärung muss identisch sein. (Und Sie können die Größe für einen Parameter nicht angeben, daher würde 'varchar2 (50 Byte)' einen Fehler verursachen). –

-2

„Unterprogramm oder Cursor‚M115_EDIT‘wird in einer Package-Spezifikation deklariert und muss in dem Gehäusekörper definiert werden“

ich diesen Fehler bekam, während ich auf meinem Projekt.Die Grunde arbeite dafür das war Ein Parametername innerhalb der Prozedur, der im Textkörper definiert wurde, stimmt nicht mit dem entsprechenden Parameternamen im Textkörper überein.

my specification:

my body

mein market_code Parameter im Körper unterschiedlich ist, wenn sie mit der Spezifikation verglichen, wo sie definiert ist als sub_market_code.error aufgrund dieser Differenz aufgetreten ist. Ich habe den Parameter sub_market_code in der Spezifikation in market_code geändert, so dass er mit dem Body übereinstimmt und das oben genannte Problem gelöst wurde.

eindeutig 2 Parameter, die in Ihrem Körper Implementierung der Prozedur 'r_date' und 'dur' erwähnt werden, sind nicht in der Spezifikation definiert. Fehler ist aufgrund dieses Unterschieds zwischen dem Körper und der Spezifikation.

Verwandte Themen