Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';在plsql中,我是否在一个sql命令中使用current of和return to?_Sql_Oracle_Plsql_Cursor - Fatal编程技术网

为什么可以';在plsql中,我是否在一个sql命令中使用current of和return 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

我尝试使用游标和UPDATESQL命令更新图书的价格。我在一个更新命令中使用了current of和return to,出现错误:ORA-00933:SQL命令未正确结束

我不得不改变我的更新,我写了id=id_zet。它修复了它,但我不明白,为什么下面的代码是错误的。因此,我的问题是:为什么我不能在plsql中的一个sql命令中使用current of和returning to

  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;

试图为你找到一个好的理由,但这是我能找到的全部(龙的评论):