Oracle Procedure 没有正常工作?
Oracle Procedure does not work as it should?
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."
我执行的两条数据,一条应该插入一条数据到table,另一条应该调用DBMS_OUTPUT。但是 none 他们成功了。
您声明了变量 discontinued PRODUCT.DISCONTINUED%TYPE;
而没有用值对其进行初始化,因此它的值是 NULL。
然后在该过程中,您将在 IF 语句
中检查此变量的值
但是 NULL 既不是 Y 也不是 N,因此该过程什么都不做。
您需要获取 product
table 停产的产品,然后在 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
:variable/parameter 的名称与 table 的列名称不同。
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."
我执行的两条数据,一条应该插入一条数据到table,另一条应该调用DBMS_OUTPUT。但是 none 他们成功了。
您声明了变量 discontinued PRODUCT.DISCONTINUED%TYPE;
而没有用值对其进行初始化,因此它的值是 NULL。
然后在该过程中,您将在 IF 语句
中检查此变量的值
但是 NULL 既不是 Y 也不是 N,因此该过程什么都不做。
您需要获取 product
table 停产的产品,然后在 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
:variable/parameter 的名称与 table 的列名称不同。