为啥我不能在 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 比 SQL*Plus 慢

plsql导入dmp的问题

为啥plsql develope 打开.sql文件时会生成后缀名为.~sql文件

windows下, sql plus 远程 连接oracle 不行,但是用客户端, plsql developer远程就可以, 这是为啥啊?

PLSQL - 游标不能在动态 sql 中使用