0

これらのテーブルの行を更新するためにカーソルを使用するプログラムを作成しました。これがプログラムです。

DECLARE
   -- Local variables here
   CURSOR s
   IS
      (SELECT UNIQUE *
         FROM Sellers
        WHERE ID_Seller NOT IN (SELECT ID_Seller
                                  FROM Sellers NATURAL JOIN Sales));

   s_rec   Sellers%ROWTYPE;
BEGIN
   -- Test statements here
   OPEN s;

   LOOP
      FETCH s INTO s_rec;

      EXIT WHEN s%NOTFOUND;
      DBMS_OUTPUT.put_line (s_rec.ID_Seller);
      DBMS_OUTPUT.put_line (s_rec.Salary);
      updateSalary (s_rec.ID_Seller, s_rec.Salary - 50);
   END LOOP;

   CLOSE s;
END;

これは updateSalary プロシージャです。

CREATE OR REPLACE PROCEDURE updateSalary (ID_S        IN VARCHAR2,
                                          newSalary   IN FLOAT)
IS
BEGIN
   UPDATE Sellers s
      SET s.salary = newSalary
    WHERE s.ID_Seller = ID_S;
END updateSalary;

プログラムを実行すると、更新コマンドでスタックします。手続きの何が悪い?

4

2 に答える 2

0

カーソル内のテーブルを更新するには、カーソルを「FOR UPDATE」モードで開く必要があり、クエリに「FOR UPDATE」を追加します。

(SELECT UNIQUE *
     FROM Sellers
    WHERE ID_Seller NOT IN (SELECT ID_Seller
                              FROM Sellers NATURAL JOIN Sales) FOR UPDATE);
于 2013-06-09T05:44:56.053 に答える
0
You need to add **FOR UPDATE** IN CURSOR TO UPDATE THE TABLE
于 2013-11-12T08:39:54.920 に答える