带有 where 条件的 PL/SQL 更新查询作为带有一些空值的选择查询
Posted
技术标签:
【中文标题】带有 where 条件的 PL/SQL 更新查询作为带有一些空值的选择查询【英文标题】:PL/SQL Update query with where condition as a select query with some null values 【发布时间】: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 ...?还是在游标语句中只限制为非空值?或在您的语句中将值排序为最后一个空值? 我写了 '.....' 暗示还有其他姓氏。 一些示例数据在这里会有很大帮助。我不明白你在说什么循环提前退出。退出条件(顺便说一下,不是 “转义序列”)只考虑游标状态,而不是你的更新,所以如果你说它由于更新而提前退出,那么我看不出如何发布的代码可能会发生这种情况。 【参考方案1】:我知道,在光标 t_lcpc
中,您应该只选择 phone_number
不为空的那些。
这样就可以了,您只会得到那些填写了phone_number
的人。
只是好奇你为什么要使用过程,什么时候可以用简单的更新语句来做到这一点!
【讨论】:
实际上这是一个示例,我有很多值需要插入到选择条件中。如果满足条件,我也必须更新其他表。【参考方案2】:在我看来,你可以使用这样的东西:
BEGIN
FOR r IN ( SELECT phone_number FROM customers WHERE last_name IN ( 'SINGH', 'RATHORE', 'GUPTA', 'KUMAR', 'JAIN' ))
LOOP
IF ( r.phone_number IS NOT NULL ) THEN
EXECUTE IMMEDIATE q'[update deals set country = "INDIA" where phone_number = :var1]'
USING r.phone_number;
END IF;
END LOOP;
END;
【讨论】:
【参考方案3】:我看到的最简单的方法是在phone_number
上使用带有JOIN
的UPDATE
语句,如下所示:
UPDATE ( SELECT deals.country as OLD, 'INDIA' as NEW
FROM deals
JOIN customers
ON deals.phone_number = customers.phone_number
WHERE customers.last_name IN ('SINGH', 'RATHORE', 'GUPTA','KUMAR','JAIN'....)
AND deals.country != 'INDIA'
) t
SET t.OLD = t.NEW
希望我能帮上忙!
【讨论】:
以上是关于带有 where 条件的 PL/SQL 更新查询作为带有一些空值的选择查询的主要内容,如果未能解决你的问题,请参考以下文章
where 条件中的可选参数 - 如何提高性能 - PL/SQL