当以下代码运行时,当我输入错误的userid
值或值为null
时,数据库服务器不会自动上升异常语句,我不想使用{ {1}}明确地在我的代码中,所以你怎么看?我错过了什么吗?
RAISE LOGIN_DENIED;
答案 0 :(得分: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;
答案 1 :(得分:1)
您原来的问题代码需要进行一些修改。与OUT形式参数对应的实际参数必须是变量;它不能是常数或表达式。
现在,如果您不想使用LOGIN_DENIED
,则可以在异常块中尝试使用NO_DATA_FOUND
或简单的通用OTHERS
。
代码可能是这样的 -
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;