Несколько вещей, которые вы сделали неправильно:
- процедуры, объявленные в спецификации пакета ДОЛЖНЫ , совпадают с процедурами в теле пакета по имени, числу и типам данных их параметров
- если вы вызываете исключение, вы должны объявить его
См. Комментарии в коде:
Спецификация:
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.
Тело: почемуВы поднимаете свое собственное исключение, если ничего не найдено?Я имею в виду, что не так с NO_DATA_FOUND
?Какую выгоду приносит NOT_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>