0

私はストアドプロシージャを作成して、テーブルからIDの束を選択し、結果セットをカーソルに保存してから、カーソルをループし、カーソルでフォーカスされているIDに基づいてテーブルテーブルの行を更新しています。さらにいくつかの条件文を追加することを計画していますが、これまでのところ..

CREATE OR REPLACE PROCEDURE CHANGE_PESONAL_DETAILS
AS

CURSOR
person_cur
IS

select b.id
    from blah1 b
        inner join blah2 b2 on b.id = b2.fkid;
person_rec person_cur%ROWTYPE;

BEGIN
FOR person_rec in person_cur

LOOP

dbms_output.put_line
(
person_rec.id
);

UPDATE blah1 set Details = DetailsLineOne || ' ' || DetailsLineTwo WHERE id = person_rec.id;

END LOOP;
COMMIT;

END;

私がここに持っているものはうまくコンパイルされますが、実行されると、更新は行われません。カーソルに何があるかを確認するために出力行に追加しましたが、何も出力されません。

カーソルを設定するための私のSelectステートメントは、それ自体で正常に実行され、期待するすべてのデータを返しますが、上記で実行した場合は何も返されません。Beginの後のすべてが実行されていないかのようですが、前述のように、Selectがそれ自体で結果を返す理由はわかりません。

たぶん、カーソルを移入するという文脈では、何かが異なった振る舞いをしているのでしょうか?どんなアドバイスも素晴らしいでしょう。

4

2 に答える 2

1

カーソルとループのない手順を確認してください。

CREATE OR REPLACE PROCEDURE CHANGE_PESONAL_DETAILS
AS
BEGIN
UPDATE blah1 set Details = DetailsLineOne || ' ' || DetailsLineTwo WHERE id IN (select b.id
    from blah1 b inner join blah2 b2 on b.id = b2.fkid);
END;

ループを使用して確認する

CREATE OR REPLACE PROCEDURE CHANGE_PESONAL_DETAILS
AS
CURSOR person_cur IS
  select b.id
    from blah1 b
        inner join blah2 b2 on b.id = b2.fkid;

  person_rec person_cur%ROWTYPE;
BEGIN
    OPEN person_cur;
    LOOP
      FETCH person_cur INTO person_rec;
      EXIT WHEN person_cur%NOTFOUND;

      UPDATE blah1 set Details = DetailsLineOne || ' ' || DetailsLineTwo WHERE id = person_rec.id;
    END LOOP;
    CLOSE person_cur;
END;
于 2013-03-14T10:52:00.700 に答える
0

カーソル内の列にアクセスするために使用される変数rowtypeでカーソルを使用する場合、カーソルを宣言することはできません。for loopfor loop

したがって、rowtype宣言を削除して同様に試し、さらにSET SERVEROUT ON手順を実行して結果を確認する前にコマンドを含めます(印刷可能なステートメント)

CREATE OR REPLACE PROCEDURE CHANGE_PESONAL_DETAILS
AS

CURSOR person_cur IS
     select b.id from blah1 b inner join blah2 b2 on b.id = b2.fkid;
BEGIN
     FOR person_rec in person_cur LOOP
          dbms_output.put_line(person_rec.id);
          UPDATE blah1 set Details = DetailsLineOne || ' ' || DetailsLineTwo WHERE id = person_rec.id;
     END LOOP;
     COMMIT;
END;
于 2013-03-14T10:49:35.010 に答える