oracle包麻烦

时间:2012-04-12 00:51:26

标签: sql oracle oracle10g

我对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:

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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'的值?我知道你现在只是在讨厌,所以只是一些想法。