-2

我正在尝试使用一个过程验证创建一个包 MSGG_SESSION,该过程接受两个 VARCHAR2 参数作为用户名和密码。为当前人员 ID 放置一个包私有 NUMBER 变量。如果“authenticate”匹配 MSGG_USER 中的用户名和密码,则将匹配的 PERSON_ID 放入新变量中。当我把它放到 oracle sql developer 中时,我得到了错误。我已经创建了一个表 MSGG_SESSION 并且一个 MSGG_USER 表已经存在。(PRIV-NUMBER 是我当前人 ID 的包裹私人号码变量)

CREATE OR REPLACE PACKAGE MSGG_SESSION
IS

    PROCEDURE AUTHENTICATE (USERNAME IN VARCHAR2, PASSWORD IN VARCHAR2);
    FUNCTION AUTHENTICATED_USER RETURN VARCHAR2;
END MSGG_SESSION;
/

CREATE OR REPLACE PACKAGE BODY MSGG_SESSION
IS
    PRIV_NUMBER VARCHAR2(100);

    PROCEDURE AUTHENTICATE (USERNAME_TO_AUTH IN VARCHAR2, PASSWORD_TO_USE IN VARCHAR2)
    IS
    BEGIN
        PRIV_NUMBER := NULL;
        SELECT USERNAME
            INTO PRIV_NUMBER
        FROM
            USER_PASSWORD
        WHERE
            lower(username) = lower(username_to_auth) and password = password_to_use;
    exception
        when NO_DATA_FOUND then
            raise NOT_AUTHENTICATED;
        when others then
            raise;
    END AUTHENTICATE;

    FUNCTION GET_USER_ID
    RETURN VARCHAR2
    is
    begin
        return priv_number;
    end get_user_id;

END MSGG_SESSION;
/
4

1 回答 1

0

你做错了几件事:

  • 包规范中声明的过程必须在名称、数量和参数数据类型上与包主体中的过程相匹配
  • 如果您要引发异常,则必须声明它

查看代码中的注释:

规格:

SQL> CREATE OR REPLACE PACKAGE MSGG_SESSION IS
  2    -- parameter names must be changed so that they match those in package body, which
  3    -- is a better option as table columns are named USERNAME and PASSWORD
  4    PROCEDURE AUTHENTICATE (USERNAME_to_auth IN VARCHAR2, PASSWORD_to_use IN VARCHAR2);
  5    FUNCTION AUTHENTICATED_USER RETURN VARCHAR2;
  6  END MSGG_SESSION;
  7  /

Package created.

Body:如果什么都没找到,为什么还要提出自己的异常?我的意思是,它自己有什么问题NO_DATA_FOUNDNOT_AUTHENTICATED异常带来什么好处?

SQL> create or replace package body msgg_session is
  2    priv_number varchar2(100);
  3
  4    procedure authenticate (username_to_auth in varchar2, password_to_use in varchar2)
  5    is
  6      -- you didn't declare it
  7      not_authenticated exception;
  8    begin
  9      select username
 10          into priv_number
 11        from user_password
 12      where lower(username) = lower(username_to_auth)
 13        and password = password_to_use;
 14    exception
 15      when no_data_found then
 16        -- now goes the clumsy part of code
 17        begin
 18          raise not_authenticated;
 19        exception
 20          when not_authenticated then
 21            raise_application_error(-20000, 'Not authenticated');
 22        end;
 23      when others then
 24        raise;
 25    end authenticate;
 26
 27    -- it exists in the specification, so it must exist in body
 28    function authenticated_user
 29      return varchar2
 30    is
 31    begin
 32      return null;
 33    end;
 34
 35    -- it is local to body (and can't be used out of it)
 36    function get_user_id
 37      return varchar2
 38    is
 39    begin
 40      return priv_number;
 41    end get_user_id;
 42  end msgg_session;
 43  /

Package body created.

SQL>
于 2019-09-18T21:01:08.353 回答