【问题标题】:Oracle Procedure does not work as it should?Oracle 程序不能正常工作?
【发布时间】:2020-07-04 08:50:08
【问题描述】:
SPOOL /Users/gongjiaxi/Desktop/solution2
SET ECHO ON
SET FEEDBACK ON
SET LINESIZE 100
SET PAGESIZE 200
SET SERVEROUTPUT ON
create PROCEDURE INSERT_ORDER_DETAIL(order_id ORDER_DETAIL.ORDER_ID%TYPE,
                                     product_name ORDER_DETAIL.PRODUCT_NAME%TYPE,
                                     unit_price ORDER_DETAIL.UNIT_PRICE%TYPE,
                                     quantity ORDER_DETAIL.QUANTITY%TYPE,
                                     discount ORDER_DETAIL.DISCOUNT%TYPE)
    IS
    discontinued PRODUCT.DISCONTINUED%TYPE;
BEGIN
    IF discontinued = 'N' THEN
        INSERT INTO ORDER_DETAIL(ORDER_ID, PRODUCT_NAME, UNIT_PRICE, QUANTITY, DISCOUNT)
        VALUES (order_id, product_name, unit_price, quantity, discount);
    end if;
    IF discontinued = 'Y' THEN
        DBMS_OUTPUT.PUT_LINE('The product is not availiable');
    end if;
end;
/
EXECUTE INSERT_ORDER_DETAIL(1000,'Chai',18.00,1002,0.9);
EXECUTE INSERT_ORDER_DETAIL(1000,'Alice Mutton', 39.00,1000,0.8);

SPOOL OFF

但结果是

Procedure INSERT_ORDER_DETAIL compiled

SQL> EXECUTE INSERT_ORDER_DETAIL(1000,'Chai',18.00,1002,0.9);

PL/SQL procedure successfully completed.

SQL> EXECUTE INSERT_ORDER_DETAIL(1000,'Alice Mutton', 39.00,1000,0.8);

PL/SQL procedure successfully completed."

我执行的两条数据中的一条应该将一条数据插入到表中,另一条应该调用 DBMS_OUTPUT。但是没有一个成功。

【问题讨论】:

  • 我有点困惑。我要实现的是通过Product的dicontinued属性判断是否往Order_detail中插入数据。以及如何修改它谢谢
  • 你只检查IF discontinued = 'N' OR 'Y' 但条件是什么?您从哪里获得产品是否停产的信息? PL/SQL 程序不是有远见的。

标签: oracle plsql sqlplus


【解决方案1】:

您需要从product 表中获取产品是否已停产,然后在IF 条件下使用它。

...
...
IS
    discontinued PRODUCT.DISCONTINUED%TYPE;
BEGIN
Select discontinued -- this is column name from your product table
Into discontinued -- this is a variable declared in your procedure
From product 
where name = product_name;
-- name is column name of the product table
-- product_name is input parameter of the procedure

IF discontinued = 'N' THEN
...
...

Suggestion: 为变量/参数使用与表的列名不同的名称。

【讨论】:

  • 感谢您的建议,我已经修改了我的代码并且它运行良好。我还有一个问题是如何使用游标来实现这个功能。
【解决方案2】:

你声明了变量discontinued PRODUCT.DISCONTINUED%TYPE; 没有用值初始化它,所以它的值是NULL。
然后在过程中检查 IF 语句中此变量的值
但 NULL 既不是 Y 也不是 N,所以程序什么也不做。

【讨论】:

  • 我有点困惑。我要实现的是通过Product的dicontinued属性判断是否往Order_detail中插入数据。以及如何修改它谢谢
猜你喜欢
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
相关资源
最近更新 更多