sql - Oracle 中的动态更新查询

标签 sql oracle plsql sql-update

我正在尝试为一个表创建一个标准的 UPDATE 查询。但是,如果满足某些条件,一些列应该包含在 UPDATE 语句中/从中排除。

例如:

 UPDATE TBL_PROJECT SET
     REVISION_COUNT = V_REVISION_COUNT
    ,PRIMARY_BRANCH = IN_PRIMARY_BRANCH
    ,PROJECT_STATUS = IN_PROJECT_STATUS
    ...
  WHERE PROJECT_ID = IO_PROJECT_ID
  AND   REVISION_COUNT = IO_REVISION_COUNT
  RETURNING REVISION_COUNT INTO IO_REVISION_COUNT';

但是,该表有两列用于提交人和批准人。因此,如果状态设置为已提交或已批准,我希望更新这些列。例如。

IF IN_PROJECT_STATUS = 'SUB'
  UPDATE TBL_PROJECT SET
    SUBMITTED_DATE = SYSDATE
ELSIF IN_PROJECT_STATUS = 'APP'
  UPDATE TBL_PROJECT SET
    APPROVED_DATE = SYSDATE
END;

我还需要返回 REVISION_COUNT 和受影响的行数 (rowcount) 以检查更新是否成功。

编写此查询的最佳方式是什么?我假设动态查询优于 if-elsif-else 语句,整个查询在每个 block 中几乎重复。

最佳答案

您可以编写一个UPDATE,并使用DECODE(或CASE)仅在in_project_status匹配:

...
, submitted_date = DECODE( in_project_status, 'SUB', SYSDATE, submitted_date )
, approved_date  = DECODE( in_project_status, 'APP', SYSDATE, approved_date )
...

这将避免重复的 UPDATE

关于sql - Oracle 中的动态更新查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2320310/

相关文章:

oracle - 根据参数记录错误

mysql - 从每个用户的表中获取最后 5 行

sql - 使用内连接更新,更新两个表中的 2 列

c# - SQL 语句未选择

SQL 如何使用 Count 和 Group By WXY 和 Z

oracle - 封装规范中的程序

oracle - 级联 LOVS - 默认值

JavaFX 替代品作为 Java 和 Linux 思维编码器?

asp.net - Oracle Managed Dataacess EF6 自定义 edm 映射不适用

oracle - 运行 Sqoop 导入和导出时如何找到最佳映射器数量?