存储过程中不会引发异常

时间:2016-01-05 13:17:41

标签: oracle stored-procedures plsql

当以下代码运行时,当我输入错误的userid值或值为null时,数据库服务器不会自动上升异常语句,我不想​​使用{ {1}}明确地在我的代码中,所以你怎么看?我错过了什么吗?

RAISE LOGIN_DENIED;

2 个答案:

答案 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;