PL/SQL 如何实现条件 select
PL/SQL How to implement conditional select
我有一个小问题,我认为我可以简单地解决,结果我无法弄清楚。
我有以下查询:
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;
我想在这里实现的是,如果不满足一个或所有 where 条件,则为变量 v_start_of_invoice 赋值“0”。
简而言之,我不希望脚本失败,但如果所有 where 条件都匹配,我希望变量被设置为某个值,否则我想分配值 0。
我敢肯定有很多方法,但我需要检查什么是实现该目标的最佳方法。
提前致谢
M.
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;
您似乎对异常块的实际作用有误解。首先,您无法避免异常。如果您使用 "select into",则仅当恰好 1 行被 return 时,查询才会成功。否则,当查询 returns 0 行时,PLSQL 将在内部引发 NO_DATA_FOUND,而当查询 returns 多于 1 行时,PLSQL 将在内部引发 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 则 return 0 否则 v_start_of_invoice 。请注意 INTO 变量的值不是 select 生成错误,除非您在异常块中设置它。
我有一个小问题,我认为我可以简单地解决,结果我无法弄清楚。 我有以下查询:
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;
我想在这里实现的是,如果不满足一个或所有 where 条件,则为变量 v_start_of_invoice 赋值“0”。 简而言之,我不希望脚本失败,但如果所有 where 条件都匹配,我希望变量被设置为某个值,否则我想分配值 0。 我敢肯定有很多方法,但我需要检查什么是实现该目标的最佳方法。 提前致谢 M.
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;
您似乎对异常块的实际作用有误解。首先,您无法避免异常。如果您使用 "select into",则仅当恰好 1 行被 return 时,查询才会成功。否则,当查询 returns 0 行时,PLSQL 将在内部引发 NO_DATA_FOUND,而当查询 returns 多于 1 行时,PLSQL 将在内部引发 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 则 return 0 否则 v_start_of_invoice 。请注意 INTO 变量的值不是 select 生成错误,除非您在异常块中设置它。