使用 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)
T-SQL:在 UPDATE 语句中使用 CASE 根据条件更新某些列