带有 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 上使用带有JOINUPDATE 语句,如下所示:

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 条件的 HSQLDB 问题

pl sql & java - 创建动态查询

where 条件中的可选参数 - 如何提高性能 - PL/SQL

在 PL/SQL 存储过程中将多个变量传递给 WHERE 条件

PL/SQL:根据条件更新另一个表时未找到数据

PL/SQL查询中的空值问题