sql - 如何编译包含 if & elsif 语句的程序?
问题描述
再会,
我正在尝试创建以下过程,该过程将根据工作类别更新表(annouce_form),另外我想知道是否可以在一个过程中包含多个更新命令:
CREATE OR REPLACE PROCEDURE UPDATE_ANNOUCMENT_FORM (
p_annoucment_id IN annouce_form.ANNOUCMENT_ID%TYPE,
p_current_doc IN annouce_form.CURRENT_DOC%TYPE,
p_current_other IN annouce_form.current_other%TYPE,
p_job_category IN REGISTRATION_FORM.JOB_CATEGORY%TYPE
)
IS
BEGIN
--first update
IF p_job_category = 'Medical' THEN
UPDATE annouce_form
SET CURRENT_DOC = p_current_doc + 1
WHERE ANNOUCMENT_ID = p_annoucment_id;
ELSIF p_job_category != 'Medical' THEN
SET CURRENT_OTHER = p_current_other + 1
WHERE ANNOUCMENT_ID = p_annoucment_id;
end if;
--second update
UPDATE annouce_form
SET CURRENT_OTHER = p_current_other + 1
WHERE ANNOUCMENT_ID = p_annoucment_id;
COMMIT;
END;
在 SQL 开发人员工具中编译后收到以下错误:
Procedure UPDATE_ANNOUCMENT_FORM compiled
LINE/COL ERROR
--------- -------------------------------------------------------------
19/1 PL/SQL: SQL Statement ignored
19/5 PL/SQL: ORA-00922: missing or invalid option
20/1 PLS-00103: Encountered the symbol "WHERE" when expecting one of the following:
( begin case declare else elsif end exit for goto if loop mod null pragma raise return
select update while with <an identifier> <a double-quoted delimited-identifier> <a
bind variable> << continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge
Errors: check compiler log
解决方案
好吧,这是错误的:
--first update
IF p_job_category = 'Medical' THEN
UPDATE annouce_form
SET CURRENT_DOC = p_current_doc + 1 ;
ELSIF p_job_category != 'Medical' THEN
SET CURRENT_OTHER = p_current_other + 1; --> this is
WHERE ANNOUCMENT_ID = p_annoucment_id; --> wrong
end if;
我想应该是
IF p_job_category = 'Medical'
THEN
UPDATE annouce_form
SET CURRENT_DOC = p_current_doc + 1;
ELSIF p_job_category != 'Medical'
THEN
UPDATE annouce_form --> probably like this
SET CURRENT_OTHER = p_current_other + 1
WHERE ANNOUCMENT_ID = p_annoucment_id;
END IF;
但你应该知道得更好。
推荐阅读
- html - Bootstrap 和 Angular 未捕获的 TypeError
- c++ - 打印出浮点数的内部十六进制
- spring-boot - spring boot @Autowired 来自另一个模块的 bean
- sql-server - 输入到 SQL Server 后日期时间更改
- astronomy - 将拟合文件数据和/或标题复制到新的拟合文件中
- docker - 在 Docker 容器中启动 Windows 服务
- tsql - 操作数类型冲突:日期与 int / NOT IN 子查询不兼容
- c# - Naudio C#:如何准确地将秒表与音频播放进度同步?
- javascript - 浏览器重新加载选项卡关闭区分调用事件
- oracle - 我有运行时错误任何机构都可以检查功能以及缺少什么