为啥我不能在 plsql 的一个 sql 命令中使用 current of 并返回 into?
Posted
技术标签:
【中文标题】为啥我不能在 plsql 的一个 sql 命令中使用 current of 并返回 into?【英文标题】:Why can't i use current of and returning into in one sql command in plsql?为什么我不能在 plsql 的一个 sql 命令中使用 current of 并返回 into? 【发布时间】:2014-04-09 22:30:25 【问题描述】:我尝试使用 cursor 和 update sql 命令更新书的价格。我在一个更新命令中使用了 current of 并返回 into 并出现错误:ORA-00933: SQL command not properly end.
我不得不更改我的更新,我写了 id = id_zet。它修复了它,但我不明白,为什么下面的代码是错误的。因此我的问题是:为什么我不能在 plsql 的一个 sql 命令中使用 current of 并返回 into?
SET serveroutput ON;
DECLARE
CURSOR books IS
SELECT title, id_publisher
FROM book
FOR UPDATE OF price;
price book.price%TYPE;
id_zet publisher.id%TYPE;
BEGIN
SELECT id INTO id_zet FROM publisher WHERE company_name = 'Zet';
FOR k IN books LOOP
IF k.id_publisher = id_zet THEN
UPDATE book SET book.price = 1.1*book.price WHERE CURRENT OF books RETURNING book.price INTO price;
ELSE
UPDATE book SET book.price = 1.05*book.price WHERE CURRENT OF books RETURNING book.price INTO price;
END IF;
DBMS_OUTPUT.PUT_LINE(k.title || ' ' || price);
END LOOP;
END;
【问题讨论】:
试图给你找个好理由,但我能找到的只有这些(Dragon 评论):tek-tips.com/viewthread.cfm?qid=1380163 【参考方案1】:据我所知,唯一的原因是甲骨文没有实现它。在您的情况下,它很容易解决。
DECLARE
CURSOR books IS
SELECT title, id_publisher, price
FROM book
FOR UPDATE OF price;
price book.price%TYPE;
id_zet publisher.id%TYPE;
BEGIN
SELECT id INTO id_zet FROM publisher WHERE company_name = 'Zet';
FOR k IN books LOOP
IF k.id_publisher = id_zet THEN
price := k.price *1.1;
ELSE
price := k.price *1.05;
END IF;
UPDATE book
SET book.price = price
WHERE CURRENT OF books ;
DBMS_OUTPUT.PUT_LINE(k.title || ' ' || price);
END LOOP;
END;
像这样在 CURSOR LOOP 中逐行更新并不是一种特别有效的工作方式。
你可以换成
UPDATE book
SET book.price = price * decode(id, id_zet, 1.1, 1.05);
【讨论】:
【参考方案2】:这个有用吗?根据 Oracle,它的作用完全相同:
CURSOR books IS
SELECT title, id_publisher, ROWID as aROW
FROM book
FOR UPDATE OF price;
price book.price%TYPE;
id_zet publisher.id%TYPE;
BEGIN
SELECT id INTO id_zet FROM publisher WHERE company_name = 'Zet';
FOR k IN books LOOP
IF k.id_publisher = id_zet THEN
UPDATE book SET book.price = 1.1*book.price WHERE ROWID = k.aROW RETURNING bookprice INTO price;
ELSE
UPDATE book SET book.price = 1.05*book.price WHERE ROWID = k.aROW RETURNING book.price INTO price;
END IF;
DBMS_OUTPUT.PUT_LINE(k.title || ' ' || price);
END LOOP;
END;
【讨论】:
以上是关于为啥我不能在 plsql 的一个 sql 命令中使用 current of 并返回 into?的主要内容,如果未能解决你的问题,请参考以下文章
用plsql编辑sql文件的时候会产生一个临时文件,能不能设置,让他不产生这个临时文件?
为啥plsql develope 打开.sql文件时会生成后缀名为.~sql文件
windows下, sql plus 远程 连接oracle 不行,但是用客户端, plsql developer远程就可以, 这是为啥啊?