为什么变量跟踪器里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; ----执行这里了。。
我用测试这个过程
[解决办法]