oracle - 当查询返回值并且没有“EXCEPTION WHEN NO_DATA_FOUND THEN”时传递数据(Oracle 11g)
问题描述
我创建了一个更新t_ritm
表的过程。首先,我从表中选择rrcd_qnty
了一个产品 ID(这是我的产品数量) 。t_rrcd
然后我更新表中的 rrcd_qnty
值t_ritm
。
这是我的程序:
procedure update_ritm_new_rate(p_oid in varchar2, p_ritm_rate in varchar2, p_euser in varchar2)
is
nrate varchar2(4);
begin
SELECT rrcd_rate into nrate
FROM (select oid, t_rrcd.rrcd_rate
from t_rrcd
where rrcd_ritm= p_oid
ORDER BY oid DESC )
WHERE rownum <= 1
ORDER BY rownum DESC ;
EXCEPTION
WHEN NO_DATA_FOUND THEN nrate := 0;
update t_ritm
set ritm_rate = nrate, euser = p_euser, edat = sysdate
where oid = p_oid;
commit;
end update_ritm_new_rate;
我的一些产品 id 数量是null
. 所以我得到了No_Data_Found
错误。但是,他们成功更新了何时以及哪个产品 id 具有 Quantity 值。为了避免 No_Data_Found
我使用EXCEPTION WHEN NO_DATA_FOUND THEN nrate := 0;
它解决了我的no_Data_Found
错误。但是当产品 id 具有数量值时,它们不会更新。
我已经搜索了很多这个问题,但没有得到好的解决方案。No_Data_Found
避免错误的最佳实践应该是什么?如果我没有收到任何No_Data_Found
错误,我可以传递我的价值吗?
预先感谢
解决方案
那是因为 - 如果你SELECT
返回一些东西,它永远不会到达UPDATE
,因为它隐藏在EXCEPTION
处理程序后面。
因此,将它 ( SELECT
) 包含在它自己的BEGIN-END
块中,然后将其UPDATE
取出,以便NRATE
使用使用的任何值执行它。
PROCEDURE update_ritm_new_rate (p_oid IN VARCHAR2,
p_ritm_rate IN VARCHAR2,
p_euser IN VARCHAR2)
IS
nrate VARCHAR2 (4);
BEGIN
BEGIN --> this
SELECT rrcd_rate
INTO nrate
FROM ( SELECT oid, t_rrcd.rrcd_rate
FROM t_rrcd
WHERE rrcd_ritm = p_oid
ORDER BY oid DESC)
WHERE ROWNUM <= 1
ORDER BY ROWNUM DESC;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
nrate := 0;
END; --> this
UPDATE t_ritm
SET ritm_rate = nrate, euser = p_euser, edat = SYSDATE
WHERE oid = p_oid;
COMMIT;
END update_ritm_new_rate;
推荐阅读
- node.js - 带有blob发送的Nodejs Expressjs中的CORS失败
- javascript - array.filter 似乎根本不起作用?
- terraform - parameters_content 值无法反序列化
- python - 如何找出时间是否在字典中链接?
- javascript - 从 getCookie() 函数获取并获取单个值
- excel - 使用列值作为条件发送电子邮件
- python - 如何在车辆路径问题中添加时间窗口?
- python - 找不到 Tmp 脚本文件 - Airflow - FileNotFoundError: [Errno 2] 没有这样的文件或目录
- sql - 用于从不同表中获取信息的 SQL 查询
- gitlab-ci - 使用 Gitlab CI 在 Cypress.io 上的一个条目中对并行运行进行分组