使用 if/else 的过程
Posted
技术标签:
【中文标题】使用 if/else 的过程【英文标题】:Procedure with if/else 【发布时间】:2018-03-11 23:05:00 【问题描述】:我需要创建一个接受大于 0 且小于 1 的数字作为折扣金额的过程。如果用户在我的参数之外输入一个数字,我还需要创建一个异常。
我创建了以下过程,但它无法编译,我不确定我哪里出错了。有什么想法吗?
CREATE OR REPLACE
PROCEDURE prod_disc
(p_disc IN DECIMAL)
IS
DECLARE
my_excep EXCEPTION;
BEGIN
UPDATE
xx_product
SET p_discount = (p_discount + p_disc)
WHERE p_qoh >= (p_min * 2);
IF p_disc > 0 OR p_disc < 1 THEN
RAISE my_excep;
END IF;
EXCEPTION
WHEN my_excep THEN
DBMS_OUTPUT.PUT_LINE('Error: Value must be greater than 0 and less than 1');
END;
/ 显示错误; ORA-24344: 编译错误成功 /
【问题讨论】:
错误是什么? 它无法编译。我正在使用 Oracle apex 并获得“编译错误成功” 我将编辑您的问题,然后运行它以显示错误。 请添加/然后输入显示错误;然后 /。请运行它,然后它会显示错误。 嗨 Giles - 您检查合法值的逻辑应该首先出现在您的代码中 - 如果值不正确,则执行 UPDATE 没有意义 【参考方案1】:DECLARE
是多余的 - 删除它。
另外,不要使用DBMS_OUTPUT.PUT_LINE
,而是使用RAISE_APPLICATION_ERROR
,因为没有人会看到前者的结果(除非他在支持这种输出的工具中运行。后者会被看到无处不在。
已修复,您的代码可能如下所示(我没有检查其逻辑):
CREATE OR REPLACE PROCEDURE prod_disc (p_disc IN DECIMAL)
IS
my_excep EXCEPTION;
BEGIN
UPDATE xx_product
SET p_discount = (p_discount + p_disc)
WHERE p_qoh >= (p_min * 2);
IF p_disc > 0
OR p_disc < 1
THEN
RAISE my_excep;
END IF;
EXCEPTION
WHEN my_excep
THEN
raise_application_error (
-20000,
'Error: Value must be greater than 0 and less than 1');
END;
/
【讨论】:
看来它正在以我尝试的任何值引发我的异常。它编译正确,但我尝试执行它 BEGIN prod_disc(0.2);结尾;例如 0.2 介于 0 和 1 之间,因此会引发异常。如果参数小于0且大于1,则应将条件倒置并提高它。 哦,呃……新手错误!让我试试看能不能解决问题。 全部修复!感谢您的帮助!【参考方案2】:请删除;在 EXCEPTION 子句中
OLD:
EXCEPTION;
WHEN my_excep THEN
DBMS_OUTPUT.PUT_LINE('Error: Value must be greater than 0 and less than 1');
NEW:
EXCEPTION
WHEN my_excep THEN
DBMS_OUTPUT.PUT_LINE('Error: Value must be greater than 0 and less than 1');
【讨论】:
修正了例外条款。【参考方案3】:删除“DECLARE”关键字 您可以在 'IS' 关键字之后声明变量,因为它是作为过程/函数的声明部分构建的,而无需放置关键字 'DECLARE'
【讨论】:
以上是关于使用 if/else 的过程的主要内容,如果未能解决你的问题,请参考以下文章