2012-04-12 10 views
1

私はOracleパッケージには新しく、なぜコンパイル/実行されないのか誰かが説明できるかどうか疑問に思っていました。 oracleパッケージの問題

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'); 

は、私はそれが今、私はちょうどそれを呼び出す方法を把握する必要があり、コンパイル必要があり、これまでにあなたの助けをいただき、ありがとうございます。行は、私はYを返すようにしたいし、それが見つからない場合、私は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

答えが得られたら、投稿を編集して新しい質問をしないでください。 SOはQ&Aサイトではありません。スレッドごとに1つの質問、1つの質問につき1つの回答(理想的には1つ)です。それでは、新しい質問をしてください(適切な場合は、古い質問にリンクしてください)。その意味を変更するように質問を編集すると、人が混乱し、スレッドが汚染されます。 – APC

答えて

5

login_ck_pfが機能していない手順であるので、あなたは戻り値を代入するための変数を提供する必要があるとしている

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

を返すようにしたいあなたが最初のパッケージ仕様を作成する必要が発見された場合は、あなたの体(実装)をコンパイルすることができます。

CREATE OR REPLACE PACKAGE login_pkg IS 

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

END; 
/

あなたが使用のために露出したいプロシージャ、関数、定数、タイプ、などの署名(インタフェース、API)を定義する場合、パッケージの仕様です。パッケージ本体には、これらの定義が実装されています。仕様は本体なしでも存在できますが、本体は仕様なしでは存在できません。仕様に定義されているすべてのものを本体に実装する必要があります。身体の中に追加の手技を定義しなくても、身体内で使用するための「私的な」手続きとして機能し、外的な使用には使用できません。

私たちはそこにいるのですが、身体にはいくつかのことがあります。 lv_id_numまたはpv_id_numがどこにも使用されていないのがわかります。行が見つからない場合は、 "if sql%found"のコードブロックもヒットするか、または例外ハンドラに直接行きますか?例外ハンドラが呼び出された場合、値を 'N'に戻しますか?私はあなたがこの時点でハッキングしていることを知っているので、いくつかのアイデアだけです。あなたがこれを行うことができ、また

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

+0

出力は、パッケージが実行され、コンパイルされたことを示します。問題は明らかに@DanAの言うとおりです:LOGIN_CK_PFは関数として定義されていますが、OPはプロシージャであるかのようにOPを呼び出しようとしています。 – APC

+0

@ APCこの応答は、仕様がないためにパッケージがコンパイルされなかったオリジナルの質問のバージョンに対応しています。 – Glenn

+0

申し訳ありませんが、私は、営業担当者が質問を編集したことを認識しませんでした。あなたの答えを簡単に編集して、私があなたを傷つけないようにしてください。 – APC