【问题标题】:Equivalent merge output in oracleoracle中的等效合并输出
【发布时间】:2017-11-11 23:25:11
【问题描述】:

我正在学习 oracle sql 和 pl/sql,我想知道 Oracle 中是否有等效的子句 'merge=output' 或获得相同结果的简单有效的方法。

链接到对 sql server 'merge,output' 语句的良好解释。 link

--sql server merge
    MERGE  #c_new AS trg
     USING #c_base AS src
        ON trg.Num_id = src.Num_id
    WHEN MATCHED )
    THEN
       UPDATE SET
          trg.Name = src.Name
         ,trg.Name_type = src.Name_type
    WHEN NOT MATCHED BY trg
    THEN
       INSERT (Num_id, Name, Name_type)
       VALUES (Num_id, src.Name, src.Name_type)
    WHEN NOT MATCHED BY src THEN DELETE
    ------------output clause from here---------------
     OUTPUT
       $ACTION,
       inserted.Name   NewName,
       deleted.Name    PrevName,
       inserted.Name_type  NewName_type,
       deleted.Name_type  PrevName_type

返回(如“查询”)

$action  NewName  PrevName  NewName_type  PrevName_type
INSERT   Abc1               Tp1
DELETE            Abc2                    Tp2
UPDATE   Abc4     Abc3      Tp4           Tp3

是 Oracle 中的等效子句 'merge=output' 还是获得相同结果的简单有效方法

【问题讨论】:

  • edit 您的问题并添加一些示例数据和基于该数据的预期输出。 Formatted textno screen shots。不要在 cmets 中发布代码或附加信息
  • 我的问题是关于 oracle 语法我或多或少知道如何从 sql server 实现合并输出之类的效果,但是如果在 oracle 中存在合并中的 clausle outup 或简单的方法,我找不到信息.我可以添加示例数据,但我认为这不是修复数据的好方法。在添加的链接中公开了从合并输出语句 sql 服务器返回数据的形式
  • 我不知道“合并输出”应该是什么(可能许多其他使用 Oracle 的人也不知道)。您需要告诉我们您要解决的问题。可能是您在 SQL Server 中采用的方法在 Oracle 中不可用,或者该问题可以在 Oracle 中以完全不同的方式解决。最好的方法是描述实际问题并举例说明。您不能指望精通 Oracle 的人了解有关 SQL Server 的一切。
  • 好的,感谢您的回答,我添加了一些数据,但在我看来,如果您学习并询问语法是准备示例虚拟问题的不好方法,因为“statment”可以以非常不同的方式使用。此外,我认为 Oracle 'specjalist' 不需要了解有关 sql server 的所有信息,但对于与编程接触的人来说,找到并理解 'merge,从 sql server 输出' 在基本版本中不会超过 2 分钟:)
  • DML 语句不返回 Oracle 中的结果集。这听起来是个不错的功能。

标签: sql sql-server oracle plsql


【解决方案1】:

我所知道的最接近的 Oracle 等效项是 RETURNING 子句,但显然不支持 MERGE 语句:

“是的,合并不支持返回 [...] 如果你想要这个 功能,提交增强请求”

https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:9528727800346317168

当前的文档确实提到了能够记录错误,但这显然不是你(或我)所追求的:-(

error_logging_clause 让您可以捕获 DML 错误和日志 受影响行的列值并将它们保存在错误日志中 表。

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/MERGE.html#GUID-5692CCB7-24D9-4C0E-81A7-A22436DC968F

【讨论】:

    猜你喜欢
    • 2020-07-26
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 2019-12-25
    • 2015-07-09
    相关资源
    最近更新 更多