繁体   English   中英

存储过程中未引发异常

[英]exception is not raised in stored procedure

当以下代码正在运行时,数据库服务器不会自动引发异常语句,当输入错误的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; 

如果要在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; 

您问题的原始代码需要进行一些修改。 对应于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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM