Stored procedures 使用if/else的程序

Stored procedures 使用if/else的程序,stored-procedures,plsql,oracle-apex,Stored Procedures,Plsql,Oracle Apex,我需要创建一个接受大于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_di

我需要创建一个接受大于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;
创建或替换
程序生产盘
(p_盘为十进制)
是
声明
我的例外;
开始
更新
xx_产品
设置p_折扣=(p_折扣+p_盘)
其中p_qoh>=(p_min*2);
如果p_盘>0或p_盘<1,则
提出我的建议;
如果结束;
例外情况
那我什么时候离开呢
DBMS_OUTPUT.PUT_LINE('错误:值必须大于0且小于1');
结束;
/ 显示错误; ORA-24344:编译错误成功
/请删除;例外条款

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');

删除“DECLARE”关键字
您可以在“IS”关键字之后声明变量,因为它是作为过程/函数的声明部分构建的,而无需放置关键字“declare

declare
是多余的-删除它

另外,不要使用
DBMS\u OUTPUT.PUT\u LINE
,而是使用
RAISE\u APPLICATION\u ERROR
,因为没有人会看到前者的结果(除非他在支持这种输出的工具中运行。后者将随处可见)

修复,您的代码可能如下所示(我不检查其逻辑):

创建或替换过程生产盘(十进制生产盘)
是
我的例外;
开始
更新xx_产品
设置p_折扣=(p_折扣+p_盘)
其中p_qoh>=(p_min*2);
如果p_盘>0
或p_盘<1
然后
提出我的建议;
如果结束;
例外情况
当我的妈妈
然后
引发应用程序错误(
-20000,
'错误:值必须大于0且小于1';
结束;
/

错误是什么?它没有编译。我正在使用Oracle apex并获得“编译错误成功”我将编辑您的问题,然后运行它以显示错误。请添加/然后输入show errors;然后/。请运行它,然后它将显示错误。嗨,Giles-检查合法值的逻辑应该首先出现在您的代码中-没有point在执行更新时,如果值不正确,请修复exception子句。它似乎正在使用我尝试的任何值引发my exception。它编译正确,但我尝试执行它BEGIN prod_disc(0.2);END;例如,0.2介于0和1之间,因此引发异常。如果参数小于0且大于1,则应颠倒条件并引发异常。噢,糟了……新手错误!让我试试看是否解决了问题。所有问题都解决了!感谢您的帮助!
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;
/