为什么可以';在plsql中,我是否在一个sql命令中使用current of和return to?
我尝试使用游标和UPDATESQL命令更新图书的价格。我在一个更新命令中使用了current of和return to,出现错误:ORA-00933:SQL命令未正确结束 我不得不改变我的更新,我写了id=id_zet。它修复了它,但我不明白,为什么下面的代码是错误的。因此,我的问题是:为什么我不能在plsql中的一个sql命令中使用current of和returning to为什么可以';在plsql中,我是否在一个sql命令中使用current of和return to?,sql,oracle,plsql,cursor,Sql,Oracle,Plsql,Cursor,我尝试使用游标和UPDATESQL命令更新图书的价格。我在一个更新命令中使用了current of和return to,出现错误:ORA-00933:SQL命令未正确结束 我不得不改变我的更新,我写了id=id_zet。它修复了它,但我不明白,为什么下面的代码是错误的。因此,我的问题是:为什么我不能在plsql中的一个sql命令中使用current of和returning to SET serveroutput ON; DECLARE CURSOR books IS SEL
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;
据我所知,唯一的原因是Oracle没有实现它。在你的情况下,这很容易解决
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;
在这样的游标循环中逐行更新并不是一种特别有效的工作方式
你可以换成
UPDATE book
SET book.price = price * decode(id, id_zet, 1.1, 1.05);
这个能用吗?根据甲骨文的说法,它的做法完全相同:
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;
试图为你找到一个好的理由,但这是我能找到的全部(龙的评论):