2014-10-23 4 views
13

Qualcuno può aiutarmi a inserire la mia procedura pl/sql in un pacchetto? Ho provato e sto lottando con esso:Errore Oracle PLS-00323: il sottoprogramma o il cursore sono dichiarati in una specifica del pacchetto e devono essere definiti nel corpo del pacchetto

Questo è quello che ho, per la mia specifica del pacchetto:

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

-- 

Questo è il mio corpo del pacchetto in cui im ​​incorrere in problemi:

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; 

se qualcuno potrebbe aiutarmi a correggere gli errori sarei grato:

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

risposta

26

l'intestazione e corpo della procedura defi definizioni non corrispondono

Nell'intestazione, si ha:

PROCEDURE get_films(fname VARCHAR2); 

Mentre nel corpo:

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

Probabilmente solo bisogno di aggiornare la definizione di intestazione con i due params supplementari OUT ?

di riassumere

  • Verificare la definizione di intestazione corrisponde a tutti i parametri di attuazione del corpo (numero di parametri, i nomi dei parametri, l'ordine dei parametri ei tipi di parametri)
  • Come per il commento di Alex , non combinare il tipo personalizzato (film.title%type) con il tipo di base (VARCHAR2). Scegli uno o l'altro.
+0

Quando ho provato ho ricevuto l'errore nel corpo del pacchetto: Errore (4,11): PLS-00323: il sottoprogramma o il cursore "GET_FILMS" è dichiarato in una specifica del pacchetto e deve essere definito nel corpo del pacchetto – SqlNoob

+1

@SqlNoob - '% type' va bene, ma devi usare esattamente la stessa dichiarazione, non puoi mescolare e abbinare anche se sai che sono uguali; hai fatto le specifiche 'fname IN film.titolo% type' troppo, o lasciare che come 'varchar'? L'intera dichiarazione deve essere identica. (E non è possibile specificare la dimensione per un parametro, quindi 'varchar2 (50 byte)' causerebbe un errore). –

-2

"sottoprogramma o il cursore 'M115_EDIT' viene dichiarato in una specifica pacchetto e deve essere definito nel corpo del pacchetto"

ho ottenuto questo errore mentre stavo lavorando sulla mia ragione project.The per questo è stato il un nome di parametro che si trovava all'interno della procedura definita nel corpo non corrispondeva al nome del parametro corrispondente nel corpo.

my specification:

my body

mia parametro market_code è diversa nel corpo quando confrontato con la specifica in cui è definito come sub_market_code.error verificato a causa di questa differenza. ho modificato il parametro sub_market_code nella specifica in market_code in modo che corrisponda al corpo e questo ha risolto il problema sopra menzionato.

chiaramente 2 parametri menzionati nell'implementazione del corpo della procedura "r_date" e "dur" non sono definiti nella specifica. L'errore è dovuto a questa differenza tra il corpo e le specifiche.

Problemi correlati