急!如何在ORACLE8i 数据库的存储过程中得知一条SQL语句执行是否成功!

时间:2021-01-22 06:01:02
执行成功用什么判断。
例如:PB 中的 SQLCODE 一样,还是其它!
不成功返加什么?
成功返回什么?
删除多少行返回什么?

12 个解决方案

#1


我一般用
show errors

#2


如果你想在存储过程中返回错误信息可以这样定义存储过程:
DECLARE
  Person_no  varchar (18);
  Person_age integer;
  Err_validation exception;          --自定义错误,人员年龄小于18岁
BEGIN
     SELECT age
       INTO person_age
      FROM person
         WHERE person_no =person_no;
      If person_age < 18 Then
        RAISE err_validation;       --使用自定义的错误标志
      End If;
EXCEPTION
     WHEN err_validation THEN
       RAISE_APPLICATION_ERROR (20000,'当前人员年龄小于18周岁!'); --自定义
    WHEN no_data_found THEN
       RAISE_APPLICATION_ERROR (20001,'未发现此人员! ');    --预定义
     WHEN others THEN
       RAISE_APPLICATION_ERROR (20002,'未知错误!');   --未定义错误
END;
/

在PB调用可以检测sqlca.sqldbcode的值
If sqlca.sqldbcode=20001 Then
    ..
ElseIf sqlca.sqldbcode=20002 Then
    ..
Else
    ..
End If

注意:ORACLE中自定义错误号范围为(-20000至-20999)!

#3


谢谢!但我按你的方法做怎么不能正确执行。
我想知道有没有查看存储过程执行的工具,或怎么去做。
If sqlca.sqldbcode=20001 Then
    ..
ElseIf sqlca.sqldbcode=20002 Then
    ..
Else
    ..
End If
请问上面的..是否全是用户自定义的信息还是也有存储过程中定义的信息。如果我只显示用户定义的信息应该怎么办? 
我执行时总是出现这样的情况: 
本应该出现的提示却没有提示,而提示超出系统定义的参数范围。



#4


哦,我知道了,我给你的例子代码有点问题,自定义的错误号只能是负值!
看到我给你的提示吗(注意:ORACLE中自定义错误号范围为(-20000至-20999)!
)ORACLE自定义的错误号只能在这个范围!!!

调试存储过程的工具PL/SQL Developer,我手里有,不过5M多呢,怕你的信箱放不下
去www.51soft.com上面去看看一定有这个工具的下载

#5


另外顺便问一下你有没有关于ORACLE 的帮助,能够很方便的查到函数存储过程等的用法,也可以介绍一下网站!

#6


create or replace procedure sp_del_user_privileges (p_function_id in varchar2,p_maker_id in varchar2,p_user_id varchar2) as
/*
**  Procedure   : sp_del_user_privileges
**  Description : according to pass in reference to delete the relative record in 
**                user_privileges. at the same as insert reclative record into 
**                table profchg_log
**
**
**  Parameters:   p_function_id  --the function id 
**                p_maker_id     --deal with maker action of maker id
**                p_user_iad      --user id
**
**  Result Set:   delete the relative record and insert a new record into log table
**
**  Return    :   none
**
**  Modification History :
**  
**  Date                 By                            Change Description
************************************************************************************
**  2003-02-28           Alan li                       Creation
**
*/

--declare var
v_seq_no  number(10);         --auto produce
v_last_upd_date date;           
v_function_desc varchar(50);
v_source_name varchar2(30);     --client or account
v_count   number(2);
my_exception exception;

Begin 
        
      --confirm if exist the current condition of record,no exist then return 
      select count(FUNCTION_ID) INTO v_count from USER_PRIVILEGES where FUNCTION_ID =p_function_id 
                                  and   USER_ID ='gfhgfh';
      if v_count is null or v_count = 0 
      then 
         RAISE  my_exception; --I will make the current exception trigger
       --return ;
      end if;
      
      EXCEPTION 
      when my_exception then
      DBMS_OUTPUT.PUT_LINE('dfdsfdsfdsf');
      RAISE_APPLICATION_ERROR (-20000,'test only');
      return;
      when no_data_found then
      RAISE_APPLICATION_ERROR(-20001,'no data found');
      return;
      when others then
      RAISE_APPLICATION_ERROR(-20002,'Others error info!');
      return;
     /* 
     --get relative info(group_id and source_name)
     select SOURCE_NAME into v_source_name from USER_PRIVILEGES
     where FUNCTION_ID = p_function_id and USER_ID = p_user_id;
      
      --get function_desc
      select nvl(FUNCTION_DESC,'') into v_function_desc from FUNCTIONS 
      where FUNCTION_ID = p_function_id;
      
      --get sequence and system date
      select UBS_SEQU_NO.NEXTVAL, sysdate into v_seq_no, v_last_upd_date from dual;
      
      --record the user delete info : insert relative info into table profchg_log
      insert into PROFCHG_LOG(ID,USER_ID,CHG_DESC,MAKER_ID,LAST_UPD_DT)
      values(v_seq_no,p_user_id,'Delete function access:'||v_function_desc,
      p_maker_id,v_last_upd_date);
      
       -- according pass in reference to delete relative info
      delete from USER_PRIVILEGES where FUNCTION_ID =p_function_id 
                                  and   USER_ID =p_user_id; 
      return ;
      */
End;



在SQL PLUS 中执行:

execute sp_del_user_privileges('tadf','dsf','sdfsdf')

提示:

BEGIN sp_del_user_privileges('tadf','dsf','sdfsdf'); END;

*
ERROR 位于第 1 行:
ORA-20000: test only
ORA-06512: 在"CTONG.SP_DEL_USER_PRIVILEGES", line 48
ORA-06512: 在line 1


实际上是触发:RAISE_APPLICATION_ERROR (-20000,'test only'); 但是为什么会出现上面这样的提示:

另外存储过程可以有返回值吗?



#7


DBMS_OUTPUT.PUT_LINE('dfdsfdsfdsf'); 为什么不能正常的显示出来!

#8


我现在的机器上没有安装ORACLE,所以没办法测试你说的错误:(
不过好象不能在存储过程、函数和触发器中使用PUT_LINE吧

至于存储过程的返回值问题,可以说存储过程和函数的区别就在这里,存储过程是没有返回值 的,但是可以使用OUT类型的参数来模拟返回值,但是强烈推荐在有返回值的时候使用函数,因为在DB2中带有OUT类型的存储过程在PB是无法接收的!!!
至于相关的网站,我常去的是www.oradb.net

#9


to:lyzalan() 
1. DBMS_OUTPUT.PUT_LINE('dfdsfdsfdsf'); 为什么不能正常的显示出来!
   要显示,需要在SQL*PLUS中先执行set serveroutput on

2.ERROR 位于第 1 行:
ORA-20000: test only
ORA-06512: 在"CTONG.SP_DEL_USER_PRIVILEGES", line 48
ORA-06512: 在line 1

出现exception,Oracle就认为是出错,只不过你可以通过exception来捕获而已。

#10


To Lastdrop 
你的方法我试过啦!可以显示,但我的实质问题没有解决,我定义的异常在PB 脚本中没有得到解决,不能正常返回异常处理的部分?

TO Alwaystar 
可以在存储过程中使用DBMS_OUTPUT.PUT_LINE('DDFSDF')
但是在SQL PLUS 中执行时要用 set serveroutput on
才可以显示

#11


我定义的异常在PB 脚本中没有得到解决,不能正常返回异常处理的部分?
哪部分没有返回,还是都没有返回,能说的具体一些吗?

我只是觉得
EXCEPTION 
     when my_exception then
      DBMS_OUTPUT.PUT_LINE('dfdsfdsfdsf');
      RAISE_APPLICATION_ERROR (-20000,'test only');

在exception中又通过RAISE_APPLICATION_ERROR报异常的用法可能有问题,你直接将
      DBMS_OUTPUT.PUT_LINE('dfdsfdsfdsf');
      RAISE_APPLICATION_ERROR (-20000,'test only');
这部分放在RAISE  my_exception; 处,替换RAISE  my_exception; 试试。

#12


To: LastDrop 
    你是正确的,是我的原因,两种方法都可以。(即定义异常和直接触发异常都行。)
    非常感谢你!

顺便说一句,你是一个非常优秀的人才,你的名字告诉我你很谦虚,这正是你优秀的根本,我们要不断的学习,才不落伍。我在珠海工作,你呢?

#1


我一般用
show errors

#2


如果你想在存储过程中返回错误信息可以这样定义存储过程:
DECLARE
  Person_no  varchar (18);
  Person_age integer;
  Err_validation exception;          --自定义错误,人员年龄小于18岁
BEGIN
     SELECT age
       INTO person_age
      FROM person
         WHERE person_no =person_no;
      If person_age < 18 Then
        RAISE err_validation;       --使用自定义的错误标志
      End If;
EXCEPTION
     WHEN err_validation THEN
       RAISE_APPLICATION_ERROR (20000,'当前人员年龄小于18周岁!'); --自定义
    WHEN no_data_found THEN
       RAISE_APPLICATION_ERROR (20001,'未发现此人员! ');    --预定义
     WHEN others THEN
       RAISE_APPLICATION_ERROR (20002,'未知错误!');   --未定义错误
END;
/

在PB调用可以检测sqlca.sqldbcode的值
If sqlca.sqldbcode=20001 Then
    ..
ElseIf sqlca.sqldbcode=20002 Then
    ..
Else
    ..
End If

注意:ORACLE中自定义错误号范围为(-20000至-20999)!

#3


谢谢!但我按你的方法做怎么不能正确执行。
我想知道有没有查看存储过程执行的工具,或怎么去做。
If sqlca.sqldbcode=20001 Then
    ..
ElseIf sqlca.sqldbcode=20002 Then
    ..
Else
    ..
End If
请问上面的..是否全是用户自定义的信息还是也有存储过程中定义的信息。如果我只显示用户定义的信息应该怎么办? 
我执行时总是出现这样的情况: 
本应该出现的提示却没有提示,而提示超出系统定义的参数范围。



#4


哦,我知道了,我给你的例子代码有点问题,自定义的错误号只能是负值!
看到我给你的提示吗(注意:ORACLE中自定义错误号范围为(-20000至-20999)!
)ORACLE自定义的错误号只能在这个范围!!!

调试存储过程的工具PL/SQL Developer,我手里有,不过5M多呢,怕你的信箱放不下
去www.51soft.com上面去看看一定有这个工具的下载

#5


另外顺便问一下你有没有关于ORACLE 的帮助,能够很方便的查到函数存储过程等的用法,也可以介绍一下网站!

#6


create or replace procedure sp_del_user_privileges (p_function_id in varchar2,p_maker_id in varchar2,p_user_id varchar2) as
/*
**  Procedure   : sp_del_user_privileges
**  Description : according to pass in reference to delete the relative record in 
**                user_privileges. at the same as insert reclative record into 
**                table profchg_log
**
**
**  Parameters:   p_function_id  --the function id 
**                p_maker_id     --deal with maker action of maker id
**                p_user_iad      --user id
**
**  Result Set:   delete the relative record and insert a new record into log table
**
**  Return    :   none
**
**  Modification History :
**  
**  Date                 By                            Change Description
************************************************************************************
**  2003-02-28           Alan li                       Creation
**
*/

--declare var
v_seq_no  number(10);         --auto produce
v_last_upd_date date;           
v_function_desc varchar(50);
v_source_name varchar2(30);     --client or account
v_count   number(2);
my_exception exception;

Begin 
        
      --confirm if exist the current condition of record,no exist then return 
      select count(FUNCTION_ID) INTO v_count from USER_PRIVILEGES where FUNCTION_ID =p_function_id 
                                  and   USER_ID ='gfhgfh';
      if v_count is null or v_count = 0 
      then 
         RAISE  my_exception; --I will make the current exception trigger
       --return ;
      end if;
      
      EXCEPTION 
      when my_exception then
      DBMS_OUTPUT.PUT_LINE('dfdsfdsfdsf');
      RAISE_APPLICATION_ERROR (-20000,'test only');
      return;
      when no_data_found then
      RAISE_APPLICATION_ERROR(-20001,'no data found');
      return;
      when others then
      RAISE_APPLICATION_ERROR(-20002,'Others error info!');
      return;
     /* 
     --get relative info(group_id and source_name)
     select SOURCE_NAME into v_source_name from USER_PRIVILEGES
     where FUNCTION_ID = p_function_id and USER_ID = p_user_id;
      
      --get function_desc
      select nvl(FUNCTION_DESC,'') into v_function_desc from FUNCTIONS 
      where FUNCTION_ID = p_function_id;
      
      --get sequence and system date
      select UBS_SEQU_NO.NEXTVAL, sysdate into v_seq_no, v_last_upd_date from dual;
      
      --record the user delete info : insert relative info into table profchg_log
      insert into PROFCHG_LOG(ID,USER_ID,CHG_DESC,MAKER_ID,LAST_UPD_DT)
      values(v_seq_no,p_user_id,'Delete function access:'||v_function_desc,
      p_maker_id,v_last_upd_date);
      
       -- according pass in reference to delete relative info
      delete from USER_PRIVILEGES where FUNCTION_ID =p_function_id 
                                  and   USER_ID =p_user_id; 
      return ;
      */
End;



在SQL PLUS 中执行:

execute sp_del_user_privileges('tadf','dsf','sdfsdf')

提示:

BEGIN sp_del_user_privileges('tadf','dsf','sdfsdf'); END;

*
ERROR 位于第 1 行:
ORA-20000: test only
ORA-06512: 在"CTONG.SP_DEL_USER_PRIVILEGES", line 48
ORA-06512: 在line 1


实际上是触发:RAISE_APPLICATION_ERROR (-20000,'test only'); 但是为什么会出现上面这样的提示:

另外存储过程可以有返回值吗?



#7


DBMS_OUTPUT.PUT_LINE('dfdsfdsfdsf'); 为什么不能正常的显示出来!

#8


我现在的机器上没有安装ORACLE,所以没办法测试你说的错误:(
不过好象不能在存储过程、函数和触发器中使用PUT_LINE吧

至于存储过程的返回值问题,可以说存储过程和函数的区别就在这里,存储过程是没有返回值 的,但是可以使用OUT类型的参数来模拟返回值,但是强烈推荐在有返回值的时候使用函数,因为在DB2中带有OUT类型的存储过程在PB是无法接收的!!!
至于相关的网站,我常去的是www.oradb.net

#9


to:lyzalan() 
1. DBMS_OUTPUT.PUT_LINE('dfdsfdsfdsf'); 为什么不能正常的显示出来!
   要显示,需要在SQL*PLUS中先执行set serveroutput on

2.ERROR 位于第 1 行:
ORA-20000: test only
ORA-06512: 在"CTONG.SP_DEL_USER_PRIVILEGES", line 48
ORA-06512: 在line 1

出现exception,Oracle就认为是出错,只不过你可以通过exception来捕获而已。

#10


To Lastdrop 
你的方法我试过啦!可以显示,但我的实质问题没有解决,我定义的异常在PB 脚本中没有得到解决,不能正常返回异常处理的部分?

TO Alwaystar 
可以在存储过程中使用DBMS_OUTPUT.PUT_LINE('DDFSDF')
但是在SQL PLUS 中执行时要用 set serveroutput on
才可以显示

#11


我定义的异常在PB 脚本中没有得到解决,不能正常返回异常处理的部分?
哪部分没有返回,还是都没有返回,能说的具体一些吗?

我只是觉得
EXCEPTION 
     when my_exception then
      DBMS_OUTPUT.PUT_LINE('dfdsfdsfdsf');
      RAISE_APPLICATION_ERROR (-20000,'test only');

在exception中又通过RAISE_APPLICATION_ERROR报异常的用法可能有问题,你直接将
      DBMS_OUTPUT.PUT_LINE('dfdsfdsfdsf');
      RAISE_APPLICATION_ERROR (-20000,'test only');
这部分放在RAISE  my_exception; 处,替换RAISE  my_exception; 试试。

#12


To: LastDrop 
    你是正确的,是我的原因,两种方法都可以。(即定义异常和直接触发异常都行。)
    非常感谢你!

顺便说一句,你是一个非常优秀的人才,你的名字告诉我你很谦虚,这正是你优秀的根本,我们要不断的学习,才不落伍。我在珠海工作,你呢?