使用Case语句更新过程

时间:2014-06-17 18:40:49

标签: sql database oracle case procedure

我需要制作包含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;

1 个答案:

答案 0 :(得分:1)

我尝试编译原始代码,并且在case语句的结构方式上遇到了一些问题。我也不认为你的意思是' DATE'作为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;