使用 Case 语句更新程序

Posted

技术标签:

【中文标题】使用 Case 语句更新程序【英文标题】:Update procedure with Case statement 【发布时间】:2014-06-17 18:40:48 【问题描述】:

我需要创建一个包含 case 语句或 IF 语句的更新过程:

create or replace procedure "PROC_TEMP_UPDATE"
is
begin
update temp_update
set error_desc = 
CASE WHEN (indicator = NULL AND date1 != NULL)
     THEN error_desc = 'Enter an Indicator before Date1.' end,
CASE WHEN (NVL(date1, date '1800-01-01') > NVL(date2, date '1800-01-01'))
     THEN 'Date1 cannot be greater than Date2.' 
END
end proc_temp_update;

谁能帮我解决这个问题?

谢谢 史蒂文 编辑: 我试过的其他代码可能重复的例子:

create or replace procedure "PROC_TEMP_UPDATE"
is begin
update temp_update
set error_desc = 

CASE WHEN (route_ind = NULL AND date1 != NULL)
    THEN error_desc = 'Enter a Route Indicator before a Date1.',
WHEN (NVL(date1, date '1800-01-01') > NVL(date2, date '1800-01-01'))
    THEN 'Date1 cannot be greater than Date2.' 
else 'Error'
END
end proc_temp_update;

【问题讨论】:

UPDATE with CASE and IN - Oracle的可能重复 除了IS 而不是AS,您还有什么问题? 我认为这是***.com/questions/5170864/…的副本 我已经尝试过类似可能重复发布的 URL。我收到错误,例如:缺少关键字第 4 行,在期望时遇到符号文件结尾第 13 行(开始、结束、大小写、.....) 建议另一种方法来做到这一点?我正在使用 Oracle APEX,我只需要能够遍历每条记录并验证数据的代码。我有很多日期列需要检查以确保它们的顺序正确。 嗯,你为什么要在你的数据库中维护这个?这看起来应该是 application 代码,没有理由在数据库中做这种事情。特别是对于处理时间相关的东西。尽管即使这样也没有多大意义 - 你在做什么,你必须在日期代表的任何东西(可能是开始日期......)之前指示某种路线指示符? 【参考方案1】:

我尝试编译您的原始代码,但在 case 语句的结构方式上遇到了一些问题。我也不认为您打算将“日期”一词作为 NVL 中字符串的一部分,对吗?如果您尝试转换日期,请找出日期格式并使用TO_DATE 函数来执行该操作..

CREATE OR REPLACE PROCEDURE "PROC_TEMP_UPDATE"
IS
BEGIN
   UPDATE temp_update
      SET err_desc =
             CASE 
                WHEN date1 IS NOT NULL AND indicator1 IS NULL
                THEN
                   'Enter an Indicator before Date1.'
                WHEN NVL (date1, '1800-01-01') > NVL (date2, '1800-01-01')
                THEN
                   'Date1 cannot be greater than Date2.'
             END;
END proc_temp_update;

另一种方法是重新考虑您的策略,并在您的 UPDATE 子句之前构建字符串,如下所示:

CREATE OR REPLACE PROCEDURE "PROC_TEMP_UPDATE" (date_from DATE, date_to DATE)
IS
   err_desc_msg   VARCHAR2 (500);
   e_update_msg   EXCEPTION;

   tmp_date       DATE;
BEGIN
   IF date_from IS NULL OR date_to IS NULL
   THEN
      err_desc_msg := 'Enter a valid date range';
      RAISE e_update_msg;
   END IF;

   IF date_from > date_to
   THEN
      err_desc_msg := 'date_from cannot be greater than date_to';
      RAISE e_update_msg;
   END IF;

   --or swap the dates
   IF date_from > date_to
   THEN
      tmp_date := date_to;
      date_to := date_from;
      date_from := tmp_date;

      err_desc_msg := 'swapped dates';
      RAISE e_update_msg;
   END IF;
EXCEPTION
   WHEN e_update_msg
   THEN
      UPDATE temp_update
         SET err_desc = err_desc_msg;
END proc_temp_update;

【讨论】:

第一组代码处理了一个错误,但我仍然收到错误:编译失败,第 7 行 (14:21:49) PL/SQL: ORA-00905: missing keywordCompilation failed ,第 4 行 (14:21:49) PL/SQL: SQL 语句被忽略 对于第一个代码:我删除了“Case err_desc”并将其替换为“case”并且代码编译良好。 很好,很高兴我能帮上忙。我用你的评论更新了我的例子

以上是关于使用 Case 语句更新程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 case 语句从 SELECT 更新记录。 (mysql)

在 case 语句中更新值并设置局部变量

ORA-00904 使用 CASE 语句更新表时标识符无效

T-SQL:在 UPDATE 语句中使用 CASE 根据条件更新某些列

Sql server 未在查询中使用嵌套 case 语句更新记录

SQL语句,使用case when 实现批量更新数据