【问题标题】:Update multiple rows in cursor更新游标中的多行
【发布时间】:2019-07-09 21:12:16
【问题描述】:

我正在尝试逐步完成这个程序。就像下面的代码一样,我想在使用光标更新表库存后打印旧价格并打印新价格。

使用游标更新多行数据,创建一个程序,接受一个数字代表价格上涨的百分比。该过程将显示旧价格、新价格,并使用新价格更新数据库。

CREATE OR REPLACE PROCEDURE p5 
AS
CURSOR invent_cur IS
SELECT inv_price
FROM inventory;
v_inv_price inventory.inv_price%TYPE;
BEGIN
OPEN invent_cur;
LOOP
FETCH invent_cur INTO v_inv_price;
EXIT WHEN invent_cur%NOTFOUND;

IF (v_inv_price <= 0)
THEN
UPDATE inventory
set inv_price = inv_price*10;
DBMS_OUTPUT.PUT_LINE(v_inv_price);
END IF;

END LOOP;
CLOSE invent_cur;
END;
/

【问题讨论】:

  • 请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Overflow 上发帖,您已授予不可撤销的权利,在 CC BY-SA 3.0 license 下,Stack Overflow 可以分发该内容。根据 Stack Overflow 政策,任何破坏行为都将被撤销。如果您想了解更多关于删除帖子的信息,请查看How does deleting work?

标签: database oracle plsql oracle11g plsqldeveloper


【解决方案1】:

围绕你的更新声明试试这个:

CREATE OR REPLACE PROCEDURE p5 (in_pc IN number)
AS
CURSOR invent_cur IS
SELECT inv_price
FROM inventory
WHERE inv_price > 0 
FOR UPDATE;
v_inv_price inventory.inv_price%TYPE;
BEGIN
OPEN invent_cur;
LOOP
FETCH invent_cur INTO v_inv_price;
EXIT WHEN invent_cur%NOTFOUND;

DBMS_OUTPUT.PUT_LINE('before: '||v_inv_price);
v_inv_price := v_inv_price * in_pc ;

UPDATE inventory
set inv_price = v_inv_price
WHERE CURRENT OF invent_cur;

DBMS_OUTPUT.PUT_LINE('after: '||v_inv_price);

END LOOP;

为了执行:

SET serveroutput ON
exec p5(10);
commit; -- to save the changes

【讨论】:

  • 嗨,我试过了,但它没有 wrkd,你能建议任何其他选择吗
  • @user10997164 请查看修改后的答案
  • @user10997164 出于好奇为什么 IF (v_inv_price
  • 我用 urs 替换了我的更新声明。但仍然没有值显示为输出。当我使用 select * from inventory 检查输出时,它显示为所有价格更新的相同值
  • IF (v_inv_price
猜你喜欢
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多