簡體   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