首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

为什么变量跟踪器里sqlcode 为0,仍会执行到raise ex_dan,但是又不执行when ex_dan then里的操作解决办法

2012-01-05 
为什么变量跟踪器里sqlcode 为0,仍会执行到raise ex_dan,但是又不执行when ex_dan then里的操作测试传的参

为什么变量跟踪器里sqlcode 为0,仍会执行到raise ex_dan,但是又不执行when ex_dan then里的操作
测试传的参数
v_unitstr       'G00009 ', 'G00037 '$ 'G00044 '
v_workno         001W0002

create   or   replace   procedure   P_ZDHZ(v_unitstr   in   varchar2,
                                                                      v_workno     in   varchar2,
                                                                      v_retunum   out   number,
                                                                      v_retext     out   varchar2)   is
    i                   int;
    str               varchar2(5000);
    trueunit     varchar2(5000);
    falseunit   varchar2(5000);
    v_zdno         varchar2(100);
    dhrenum       number;
    dhreerr       varchar2(100);
    v_buyunit   varchar2(100);
    v_unit         varchar2(100);
    v_sql           varchar2(5000);
    ex_dan         EXCEPTION;
begin
    trueunit     :=   ' ';
    falseunit   :=   ' ';
    str               :=   v_unitstr;
    i                   :=   instr(str,   '$ ');
    trueunit     :=   trueunit   ||   substr(str,   1,   i   -   1);
    falseunit   :=   falseunit   ||   substr(str,   i   +   1,   LENGTH(str));
    if   trueunit   is   not   null   or   trueunit   <>   ' '   then
        p_mkdh( 'ZT ',   v_zdno,   dhrenum,   dhreerr);
        if   dhreerr   =   'ok '   then
            select   buyunit   into   v_buyunit   from   g_workers   where   workno   =   v_workno;
            if   sqlcode   !=   0   then
                v_retunum   :=   -1;
                v_retext     :=   '取操作员的单位出错 '   ||   sqlerrm;
                raise   ex_dan;
            end   if;
            v_sql:= 'insert   into   y_zd   (primaryno,zdno,buyunit,zdmlno,numbers,branchno,picino,bookid,jsunit,fsnumbers,discount, ';
            v_sql:=v_sql|| 'buylxr,gxmode,zdtype,grade,countno,tyno,fstype,fhyj,inputman,inputdate,ywman,ywdate,tag)   ';


            v_sql:=v_sql|| 'select   F_GET_PRIMARYNO( ' 'ZT ' '), ' ' '||v_zdno|| ' ' ', ' ' '||v_buyunit|| ' ' ',zdmlno,sum(numbers), ' '001W ' ',picino,max(bookid), ' ' '||v_buyunit|| ' ' ', ';
            v_sql:=v_sql|| '0,1,max(buylxr),max(gxmode), ' '0 ' ',max(grade),max(countno),max(tyno),max(fstype),max(fhyj), ' ' '||v_workno|| ' ' ',sysdate,max(ywman),max(ywdate), ' '4 ' ' ';
            v_sql:=v_sql|| '   from   y_zd_temp   where   picino   =   (select   picino   from   y_pici   where   defaults   =   ' '1 ' ')   and   buyunit   in   ( '||trueunit|| ')   group   by   picino,   zdmlno ';
         
          EXECUTE   IMMEDIATE   v_sql;
       
    v_retunum   :=   sqlcode;       ----想看sqlcode值,所以赋给了v_retunum,此时变量跟踪   v_retunum   为0  
            if   sqlcode   !=   0   then       ----执行这里,然后竟然跳到raise   ex_dan;
                v_retunum   :=   -1;
                v_retext     :=   '插入汇总后单位记录出错 '   ||   sqlerrm;
                raise   ex_dan;     ---就算是有异常抛出,下一步也应该执行exception           when   ex_dan   then,但是并没有,直接执行v_retext     :=   '订单汇总成功 ';             end   if;
        else
            v_retunum   :=   -1;
            v_retext     :=   '生成订单号存储过程出错。 '||   sqlerrm;
        end   if;
    end   if;


    v_retext     :=   '订单汇总成功 ';       ---执行这里,之后就到最后一句了。


exception
    when   ex_dan   then
        v_retunum   :=   -1;
        v_retext     :=   sqlerrm   ||   v_retext;
        ROLLBACK;
    when   others   then
      v_retunum   :=   -1;
        v_retext     :=   sqlerrm   ||   v_retext;
        ROLLBACK;
end   P_ZDHZ;       ----执行这里了。。

我用测试这个过程

[解决办法]

探讨
我晕到。
v_retunum   :=   0;
if   0   !=   0   then
v_retunum   :=   -1;
v_retext     :=   '插入汇总后单位记录出错 '   ||   sqlerrm;
raise   ex_dan;
end   if;
写成这样,都能执行到raise   ex_dan;
这到底是什么原因咯

[解决办法]
楼主能够确定执行的SQL正确么,就是
EXECUTE IMMEDIATE v_sql; 
的V_SQL的内容正确么
当V_SQL的SQL不能正确执行的时候,SQLCODE会被赋值的
DBMS_OUTPUT出来看看


热点排行