根据输入参数对更新 sql 脚本进行条件处理

Posted

技术标签:

【中文标题】根据输入参数对更新 sql 脚本进行条件处理【英文标题】:conditional handling of update sql script depending on input parameter 【发布时间】:2014-04-02 14:41:21 【问题描述】:

我是 SQL 新手,使用 Oracle 11。我需要编写一个 sql 脚本,根据输入参数是否为空来使用不同的更新命令。

我需要这样的东西

['&' 后跟参数名称是我看到参数在其他此类中使用的方式 我们项目的脚本]

IF &PRG_ID IS NULL
   UPDATE PROGRAM_TABLE P SET HANDLED_IND = 'Y' WHERE EXISTS
      (SELECT 1 FROM HANDLED_PROGRAM H WHERE H.PROGRAM_ID = P.PROGRAM_ID);
ELSE
   UPDATE PROGRAM_TABLE P SET HANDLED_IND = 'Y' WHERE 
     P.PROGRAM_ID = &PRG_ID AND EXISTS
       (SELECT 1 FROM HANDLED_PROGRAM H WHERE H.PROGRAM_ID = P.PROGRAM_ID);
END IF;

【问题讨论】:

【参考方案1】:

类似的东西(未经测试):

   UPDATE PROGRAM_TABLE P SET HANDLED_IND = 'Y' WHERE EXISTS
      (SELECT 1 FROM HANDLED_PROGRAM H WHERE H.PROGRAM_ID = P.PROGRAM_ID)
      AND (&PRG_ID IS NULL OR P.PROGRAM_ID = &PRG_ID);

但考虑到这种变化可能会导致 PRG_ID 具有确定值的情况下的性能下降。

【讨论】:

谢谢 Dmitry,考虑到性能,使用 2 个查询是否合理,例如 UPDATE PROGRAM_TABLE P SET HANDLED_IND = 'Y' WHERE EXISTS (SELECT 1 FROM HANDLED_PROGRAM H WHERE H.PROGRAM_ID = P.PROGRAM_ID ) AND (&PRG_ID 为空); UPDATE PROGRAM_TABLE P SET HANDLED_IND = 'Y' WHERE EXISTS (SELECT 1 FROM HANDLED_PROGRAM H WHERE H.PROGRAM_ID = P.PROGRAM_ID) AND &PRG_ID 不为 NULL 且 P.PROGRAM_ID = &PRG_ID; 并非如此。如果您由于 (&PRG_ID IS NULL OR P.PROGRAM_ID = &PRG_ID) 而遇到性能问题,我会保留您的原始代码 - 如果您在 PL/SQL 中使用更新语句,这看起来不错。

以上是关于根据输入参数对更新 sql 脚本进行条件处理的主要内容,如果未能解决你的问题,请参考以下文章

脚本填报表的条件查询

根据输入参数使用内连接或外连接 - 不使用动态 sql

根据Oracle sql中的条件生成假脱机

shell脚本之awk工具的使用

MyBatis从入门到精通:MyBatis动态Sql之if标签的用法

如何将条件日期参数传递给表输入步骤?