【发布时间】:2019-09-18 10:03:17
【问题描述】:
我想更新一个表,我已经为它编写了一个 pl/sql,我使用游标进行选择查询,选择查询的数据用作更新查询的有效值。问题是选择查询有时可能会返回 NULL 作为有效值,而 loop(cursor) 的转义序列是在遇到 null 时。如何在选择查询返回某个值时运行更新查询,并在返回 null 时跳过,然后在没有更多数据时结束游标。
select 语句是这样的
select phone_number from customers where last_name = 'SINGH';
现在可能有一些客户没有提供他们的电话号码
并且更新查询在游标的循环内
DECLARE
p_no customers.phone_number%type;
CURSOR t_lcpc is
select phone_number from customers where last_name in('SINGH', 'RATHORE', 'GUPTA','KUMAR','JAIN');
BEGIN
OPEN t_lcpc;
LOOP
FETCH t_lcpc into p_no;
EXIT WHEN t_lcpc%notfound;
execute immediate q'[update deals set country = "INDIA" where phone_number = :var1]' using p_no;
END LOOP;
CLOSE t_lcpc;
END;
我通常使用的转义序列是EXIT WHEN t_lcpc%notfound;,但如果选择查询没有返回任何值(例如“GUPTA”),那么它将退出而不更新其余的姓氏。
表客户
First_Name | Last_Name | Phone_Number | Book
ATUL | SINGH | 3241234 | 'Let Us C'
Aaman | RATHORE | 431343 | 'Cook Book for dummies'
Rahul | GUPTA | (null) | 'Network Security'
Rajnish | KUMAR | 234345 | 'guide to Australia'
Baibhav | JAIN | 123234 | 'TT for dummies'
我希望交易表像这样更新
Phone_Number | Country | Offers
3241234 | INDIA | new books
431343 | INDIA | new books
234345 | INDIA | new books
123234 | INDIA | new books
脚本应该只在 select 查询返回值时更新,在返回 (null) 时跳过,当 select 语句没有更多数据时,光标应该结束。 我在 Oracle 引擎上运行这个脚本。
【问题讨论】:
-
我在 Oracle 中不是那么好,但你为什么不把 'EXIT WHEN t_...' 替换为 if p_no is not null then execute ...?还是在游标语句中只限制为非空值?或在您的语句中将值排序为最后一个空值?
-
我写了 '.....' 暗示还有其他姓氏。
-
一些示例数据在这里会有很大帮助。我不明白你在说什么循环提前退出。退出条件(顺便说一下,不是 “转义序列”)只考虑游标状态,而不是你的更新,所以如果你说它由于更新而提前退出,那么我看不出如何发布的代码可能会发生这种情况。