考虑转换您的程序,如下所示:
SQL> set serveroutput on; SQL> CREATE OR REPLACE PROCEDURE ex3(p_inv_id IN inventory.inv_id%type, p_change IN NUMBER, p_new_price OUT inventory.inv_price%type, p_qoh OUT inventory.inv_qoh%type) AS BEGIN UPDATE inventory SET inv_price = inv_price * ( 1 + (p_change / 100) ) WHERE inv_id = p_inv_id RETURNING inv_price, inv_qoh INTO p_new_price, p_qoh; DBMS_OUTPUT.PUT_LINE('hello '|| p_new_price); END; / SQL> CREATE OR REPLACE PROCEDURE use_ex3(p_inv_id inventory.inv_id%type, p_change NUMBER) AS v_new_price inventory.inv_price%type; v_qoh inventory.inv_qoh%type; v_value NUMBER(10, 2); BEGIN ex3(p_inv_id, p_change, v_new_price, v_qoh); v_value := v_new_price * v_qoh; DBMS_OUTPUT.PUT_LINE('value is: '|| v_value); END;
核心问题是
的 缺少过滤器 WHERE inv_id = p_inv_id 在里面 UPDATE 声明。 即不仅限于一个 inv_id 强>
WHERE inv_id = p_inv_id
UPDATE
inv_id
此外,考虑到以下问题将使您的代码更好:
SET
inv_price = inv_price * ( 1 + (p_change / 100) )
inventory.<column_name>%type
v_new_price
out
p_new_price
SELECT
RETURNING INTO
别忘了用 set serveroutput on 打印出结果
set serveroutput on
我认为排除这是一个好习惯 commit 在个人计划中 单位为数据的一致性提供交易完整性 获得DML的表格。首选只保留一个 commit 在来电者里面 在所有陈述和程序单元的末尾申请。
commit