1

私はオラクルパッケージに非常に慣れていないので、なぜこれがコンパイル/実行されないのか誰かが説明できるかどうか疑問に思っていました。

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:
4

2 に答える 2

5

login_ck_pfは関数であり、プロシージャではないため、戻り値を割り当てるための変数を指定する必要があります。

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

または、次のようにすることもできます。

SELECT login_pkg.login_ck_pf('gma1','goofy') FROM dual;
于 2012-04-12T03:50:27.643 に答える
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」の値を返しますか?この時点でハッキングしているだけなので、いくつかのアイデアがあります。

于 2012-04-12T00:57:16.147 に答える