使用 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 的过程的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程技术怎么就那么不规范?if else if 再多个else if就不能用了?

oracle 存储过程里的if else

MySQL存储过程语法错误:if else

在mysql中用if…else语句判断当天是不是为星期天?

在 SQL 中使用 IF/ELSE 重复 CASE 块

if - else 语句