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