1

Oracle のオブジェクト リレーショナル機能を使用していますが、メンバー プロシージャで発生したオブジェクトへの変更を永続化するのに問題があります。まず、抽象スーパータイプがあります:

CREATE TYPE fantasy_action AS OBJECT (
action_id      NUMBER,
time_completed DATE,
NOT INSTANTIABLE MEMBER PROCEDURE execute(SELF IN OUT NOCOPY fantasy_action)
NOT INSTANTIABLE NOT FINAL;

これは私の型宣言の一部です (対応するテーブルも作成されています)。

CREATE TYPE fantasy_trade UNDER fantasy_action (
...[other variables]...
OVERRIDING MEMBER PROCEDURE execute(SELF IN OUT NOCOPY fantasy_trade));

そして、私が抱えている問題は、メンバー手順のこの部分にあります:

CREATE OR REPLACE TYPE BODY fantasy_trade AS
     OVERRIDING MEMBER PROCEDURE execute( SELF IN OUT NOCOPY fantasy_trade ) IS
     current_week NUMBER;
     player1_plays NUMBER;
     player2_plays NUMBER;
  BEGIN
     ...
     time_completed := current_date;
     ...
  END;
END;

最後に、単純な PL/SQL ループを使用してプロシージャを呼び出しています。

DECLARE
   action fantasy_action;
  BEGIN
     FOR x IN (SELECT DEREF(action) as action FROM fantasy_scheduledaction WHERE time <= current_date AND DEREF(action).time_completed is null) LOOP
     x.action.execute();
END LOOP;
END;

残りの手順が完了したことを確認した後でも、time_completed フィールドは null のままです。何が問題なのでしょうか? SELF.time_completed を無駄に使用しようとしましたが、プロシージャ内の他のすべての変数は適切に参照されています。この変数がスーパータイプからのものであるという事実と関係がありますか? それとも、逆参照されたポインターを介してプロシージャを呼び出している可能性がありますか? どんな助けでも大歓迎です。

4

1 に答える 1

1

UTL_REF.UPDATE_OBJECT を使用してみてください。

DECLARE
    action fantasy_action;
BEGIN
    FOR x IN
    (
        SELECT DEREF(action) as action_deref, action action_ref
        FROM fantasy_scheduledaction
        WHERE time <= current_date
            AND DEREF(action).time_completed is null
    ) LOOP
        x.action_deref.execute();
        utl_ref.update_object(x.action_ref, x.action_deref);
    END LOOP;
END;
/
于 2012-12-08T20:22:24.463 に答える