2012-04-12 12 views
1

Ich bin sehr neu zu Oracle-Paketen und fragte mich, ob jemand erklären könnte, warum dies nicht kompilieren/ausführen wird.Orakel-Paket Problem

CREATE OR REPLACE PACKAGE login_pkg IS 
FUNCTION login_ck_pf 
    (p_user IN VARCHAR2, 
    p_pass IN VARCHAR2) 
    RETURN CHAR; 
END; 
/
CREATE OR REPLACE PACKAGE BODY login_pkg IS 
FUNCTION login_ck_pf 
    (p_user IN VARCHAR2, 
    p_pass IN VARCHAR2) 
    RETURN CHAR 
    IS 
    lv_ck_txt CHAR(1) := 'N'; 
    lv_id_num NUMBER(5); 
BEGIN 
    SELECT idShopper 
    INTO lv_id_num 
    FROM bb_shopper 
    WHERE username = p_user 
    AND password = p_pass; 
    IF SQL%FOUND THEN 
    lv_ck_txt := 'Y'; 
    lv_id_num := lv_id_num; 
    END IF; 
    RETURN lv_ck_txt; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    DBMS_OUTPUT.PUT_LINE('Invalid Login'); 
    lv_ck_txt := 'N'; 
    return lv_ck_txt; 
END; 
END; 
/
show errors; 

execute login_pkg.login_ck_pf('gma1', 'goofy'); 

Vielen Dank für Ihre Hilfe bisher, ich habe es kompilieren jetzt muss ich nur noch herausfinden, wie man es nennen. Wenn die Zeile gefunden wird, ich möchte ein Y zurückzukehren und wenn es nicht gefunden wird, ich N.

PACKAGE login_pkg compiled 
PACKAGE BODY login_pkg compiled 
No Errors. 

Error starting at line 35 in command: 
execute login_pkg.login_ck_pf('gma1', 'goofy') 
Error report: 
ORA-06550: line 1, column 7: 
PLS-00221: 'LOGIN_CK_PF' is not a procedure or is undefined 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 
+0

Sobald Sie eine Antwort erhalten haben, bearbeiten Sie Ihren Beitrag nicht, um eine neue Frage zu stellen. SO ist eine Q & A Site, kein Forum. Es ist eine Frage pro Thread und (idealerweise) eine Antwort pro Frage. Also frage einfach eine neue Frage (verlinke mit der alten Frage, wenn es angemessen ist). Bearbeiten Sie Ihre Frage, um ihre Bedeutung zu verstehen, verwirrt Menschen und verschmutzt den Thread. – APC

Antwort

5

Da login_ck_pf eine Funktion und kein Verfahren ist, Sie gehen zu müssen, eine Variable, um die Rückgabewert zuzuweisen:

DECLARE 
    v_ret CHAR(1); 
BEGIN 
    v_ret := login_pkg.login_ck_pf('gma1','goofy'); 
    DBMS_OUTPUT.PUT_LINE(v_ret); 
END; 
/

Alternativ können Sie dies tun:

SELECT login_pkg.login_ck_pf('gma1','goofy') FROM dual; 
4

Sie müssen zurückkehren wollen zunächst die Package-Spezifikation erstellen, dann können Sie Ihren Körper (Implementierung) kompilieren:

CREATE OR REPLACE PACKAGE login_pkg IS 

FUNCTION login_ck_pf 
    (p_user IN VARCHAR2, 
    p_pass IN VARCHAR2) 
    RETURN CHAR; 

END; 
/

Die Package-Spezifikation ist, wo Sie die Signaturen (Schnittstelle, api) der Prozeduren, Funktionen, Konstanten, Typen definieren, etc, die Sie für die Verwendung aussetzen möchten. Der Paketkörper hat die Implementierung dieser Definitionen. Eine Spezifikation kann ohne einen Körper existieren, aber ein Körper kann ohne eine Spezifikation nicht existieren. Alles, was in der Spezifikation definiert ist, muss im Körper implementiert werden. Sie können zusätzliche Prozeduren im Körper definieren, ohne sie in die Spezifikation einzubeziehen, und diese fungieren dann als "private" Prozeduren zur Verwendung innerhalb des Körpers und nicht für die externe Verwendung.

Ich denke, während wir dabei sind, gibt es ein paar andere Dinge im Körper. Ich sehe nicht, dass lv_id_num oder pv_id_num irgendwo verwendet werden. Wenn eine Zeile nicht gefunden wird, wird der Codeblock mit "if sql% found" sogar getroffen oder Sie gehen direkt zum Exception-Handler? Möchten Sie einen Wert von 'N' zurückgeben, wenn der Ausnahmebehandler aufgerufen wird? Ich weiß, dass du an diesem Punkt nur herumhackst, also nur ein paar Ideen.

+0

Die Ausgabe zeigt, dass das Paket ausgeführt und kompiliert wurde. Das Problem ist eindeutig, wie @DanA sagt: LOGIN_CK_PF ist als eine Funktion definiert, aber das OP versucht, es so zu nennen, als wäre es eine Prozedur. – APC

+0

@APC Diese Antwort war auf die ursprüngliche Version der Frage, wo das Paket nicht kompiliert wurde, weil es keine Spezifikation gab. – Glenn

+0

Sorry, ich wusste nicht, dass das OP ihre Frage bearbeitet hat. Bitte machen Sie eine unbedeutende Änderung an Ihrer Antwort, damit ich Sie abmelden kann. – APC