pl/sql : 执行立即更新?

Posted

技术标签:

【中文标题】pl/sql : 执行立即更新?【英文标题】:pl/sql : execute immediate update? 【发布时间】:2015-12-21 03:49:17 【问题描述】:
     V_SQL4 := 'UPDATE EMP_TABLE m
     Set m.name = mft.name,
         m.age = mft.age,
         m.dept = mft.dept,
   Where m.id = mft.id and 
         (m.name != mft.name Or
         m.age != mft.age Or
         m.dept != mft.dept )';

DBMS_OUTPUT.PUT_LINE(V_SQL4);

EXECUTE IMMEDIATE V_SQL4;

如何在语句中将临时表EMP_TMP声明为mft

【问题讨论】:

【参考方案1】:

如果我查看需求,我看不到 PL/SQL 的需求 这。更好的方法是使用 Merge。我图解了一个 下面的例子。如果动态 SQL 不是硬的和绑定的,你可以使用这个 也。让我知道这是否有帮助。

MERGE INTO EMP_TABLE m USING EMP_TMP mft 
ON (m.id = mft.id AND (m.name != mft.name OR m.age != mft.age OR m.dept != mft.dept))
WHEN MATCHED THEN
  UPDATE SET 
  m.name = mft.name, 
  m.age = mft.age, 
  m.dept = mft.dept;

【讨论】:

【参考方案2】:

这个 SO post 有一个类似问题的答案。

在您的情况下,查询将转换如下

V_SQL4 := 'UPDATE EMP_TABLE m
 SET (name, age, dept) = (SELECT mft.name
                                ,mft.age
                                ,mft.dept
                            FROM EMP_TMP mft
                           WHERE m.id = mft.id
                             AND m.name != mft.name Or
                             AND m.age != mft.age Or
                             AND m.dept != mft.dept 
                         )
WHERE EXISTS (
               SELECT 1
                 FROM EMP_TMP mft
                WHERE m.id = mft.id
           )';

【讨论】:

以上是关于pl/sql : 执行立即更新?的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL DDL 立即执行

PL/SQL - dbms 输出立即执行的结果

从 pl/sql 块内立即执行的数据假脱机

pl/sql - to_date 不适用于执行立即参数

执行立即错误:PL/SQL:数字或值错误:字符到数字转换错误

Oracle pl sql 动态使用子句