我有一个小问题,我认为我可以简单地解决,事实证明我无法弄明白。 我有以下查询:
SELECT custom_field
INTO v_start_of_invoice
FROM BILL
WHERE BIMA_TRACKING_ID = v_previous_BIMAtrackingID
AND BSCO_CODE_ID = 'PRPAYMENT'
AND PREP_SEQ_NUM = 0
AND ITEM_CAT_CODE_ID = 1
AND PARTITION_KEY = v_prev_partition
AND SUBPARTITION_KEY = v_prev_subpartition;
我想在这里实现的是给变量v_start_of_invoice赋值" 0"如果不满足一个或所有where条件。 简单来说,我不希望脚本失败,但是如果所有where条件都匹配,我希望变量设置为某个值,否则我想分配值0。 我确信有很多方法,但我需要检查一下可能是实现这一目标的最佳方法。 许多事先提前 M.
答案 0 :(得分:0)
begin
SELECT custom_field
INTO v_start_of_invoice
FROM BILL
WHERE BIMA_TRACKING_ID = v_previous_BIMAtrackingID
AND BSCO_CODE_ID = 'PRPAYMENT'
AND PREP_SEQ_NUM = 0
AND ITEM_CAT_CODE_ID = 1
AND PARTITION_KEY = v_prev_partition
AND SUBPARTITION_KEY = v_prev_subpartition;
exception WHEN NO_DATA_FOUND THEN
v_start_of_invoice := 0;
end;
答案 1 :(得分:0)
您似乎对异常块实际执行的操作存在误解。首先,你无法避免异常。如果使用“select into”,则只有在返回完整的1行时,查询才会成功。否则PLSQL将在查询返回0行时在内部引发NO_DATA_FOUND,并在返回多于1行时TOO_MANY_ROWS。异常块告诉PLSQL生成错误时该怎么做。基本上,异常块说明对特定错误采取的操作以及是继续错误处理还是丢弃错误。 (检查RAISE和RAISE_APPLICATION_ERROR语句。)
请记住,块可以嵌套。考虑到这一点,在外部区块的背景下,@are提供的解决方案正是您想要的。结构变为:
Begin
.
.
.
begin
place @are's code here.
end ;
-- Continue your code here: The Error has been handled and execution continues as though the exception never happened.
.
.
.
end;
至于“NVL(v_start_of_invoice,0);”如果v_start_of_invoice为NULL则返回0,否则返回v_start_of_invoice。注意INTO变量的值不是select生成错误,除非你在异常块中设置它。