2016-01-05 2 views
1

, когда следующий код работает заявление исключения не растет автоматически сервер базы данных, это произойдет, когда я ввожу неправильно userid значение или если значение null, я не хочу использовать RAISE LOGIN_DENIED; явно в моем коде, так что вы думаете? я что-то упускаю?исключения не воспитывалось в хранимой процедуре

CREATE OR REPLACE PROCEDURE user_auth(
 
    userid IN st_az.st_name%type , 
 
    pass OUT st_az.st_pass%type , 
 
    message OUT varchar2 , 
 
    err_msg OUT varchar2 ) IS 
 
BEGIN 
 
    message:= 'login is done successfully'; 
 
    err_msg:= 'Login Denied .. Please Try Again!'; 
 
    SELECT st_pass INTO pass FROM st_az WHERE st_name = userid ; 
 
    dbms_output.put_line(message); 
 
EXCEPTION 
 
    WHEN LOGIN_DENIED THEN 
 
    dbms_output.put_line(err_msg); 
 
END user_auth;

+1

Там нет Логин попытка в ваш код. – Drumbeg

+0

Если ошибка входа в систему, то сохраненный код никогда не будет выполняться, так как безопасность входа не позволила вам зайти так далеко. –

ответ

1

Ваш исходный код этого вопроса нуждается в некоторой модификации. Фактический параметр, который соответствует формальному параметру OUT, должен быть переменной; он не может быть константой или выражением.

Теперь, если вы не хотите использовать LOGIN_DENIED, вы можете либо попробовать использовать NO_DATA_FOUND, либо просто обобщенный OTHERS в блоке исключений. Код может быть как this--

CREATE OR REPLACE 
PROCEDURE user_auth(
    userid IN st_az.st_name%type , 
    pass OUT st_az.st_pass%type , 
    MESSAGE OUT VARCHAR2 , 
    err_msg OUT VARCHAR2) 
AS 
    message1  VARCHAR2(50); 
    err_message1 VARCHAR2(50); 
BEGIN 
    message1 := 'login is done successfully'; 

    err_message1:= 'Login Denied .. Please Try Again!'; 

    SELECT st_pass INTO pass FROM st_az WHERE st_name = userid ; 

    MESSAGE:= message1; 

    dbms_output.put_line(MESSAGE); 

EXCEPTION 
WHEN OTHERS THEN 
    err_msg:= err_message1; 

    dbms_output.put_line(err_msg); 
END user_auth; 

Теперь тестирование выше кода: -

create table st_az(st_name varchar2(10),st_pass varchar2(10)); 

insert into st_az values ('aa','aa'); 
insert into st_az values ('bb','bb'); 
commit; 

Создание анонимного блока и вызова процедуры: -

DECLARE 
    MESSAGE VARCHAR2(50); 
    err_msg VARCHAR2(50); 
    pass VARCHAR2(10); 
BEGIN 
    user_auth('cc',pass,MESSAGE,err_msg); 
END; 
3

Если вы хотите найти информацию в st_az таблицы и вызвать ошибку, когда нет такой строки, вам нужно NO_DATA_FOUND за исключением

CREATE OR REPLACE PROCEDURE user_auth(
    userid IN st_az.st_name%type , 
    pass OUT st_az.st_pass%type , 
    message OUT varchar2 , 
    err_msg OUT varchar2 ) IS 
BEGIN 
    message:= 'login is done successfully'; 
    err_msg:= 'Login Denied .. Please Try Again!'; 
    SELECT st_pass INTO pass FROM st_az WHERE st_name = userid ; 
    dbms_output.put_line(message); 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    dbms_output.put_line(err_msg); 
END user_auth; 
Смежные вопросы