0
create or replace TRIGGER log_worlds BEFORE UPDATE OR INSERT ON worlds
DECLARE
ac VARCHAR2(50);
tab VARCHAR2(50);
world VARCHAR2(50);
BEGIN
IF UPDATING THEN
ac:='Aktualizacja';
END IF;
IF INSERTING THEN
ac:='Nowe';
END IF;
tab:='WORLDS';
world:='world_';
world:=world||cast(NEW_WORLD.NEXTVAL as VARCHAR2(10));
INSERT INTO log(ACTION_DATE,ACTION,TAB_NAME,ADDED_WORLD) VALUES(SYSDATE,ac,tab,world);
INSERT INTO worlds(WORLD_NAME) VALUES(world);
END;

誰かがこれを手伝ってくれますか、エラー情報は14行目ですか? このトリガーは、APEX アプリケーションがテーブルに対して DML を発行するときに、ログ テーブルに新しい値を追加し、worlds テーブルの主キー値を変更することになっています。

4

3 に答える 3

1

即時の構文エラーは、 が作成したシーケンスであると仮定NEW_WORLDすると、次のようにする必要があることです。

SELECT world ||
         cast( new_world.nextval as varchar2(10) )
  INTO world
  FROM dual;

でシーケンスを直接参照するのではなく、CAST.

ただし、トリガーが何をすべきかは私にはわかりません。少なくとも、無限ループが発生します。すべてのINSERTonによってトリガーが起動され、トリガーが起動されるonWORLDSが生成されます。最大再帰深度を超えると、Oracle は最終的にエラーを発生させます。?の値を変更するステートメント レベルのトリガーではなく、行レベルのトリガーとしてこれを意図した可能性があります。その場合、おそらく次のようなものが必要になるでしょうINSERTWORLDS:new.world_name

create or replace TRIGGER log_worlds 
  BEFORE UPDATE OR INSERT ON worlds
  FOR EACH ROW
DECLARE
  ac VARCHAR2(50);
  tab VARCHAR2(50);
  world VARCHAR2(50);
BEGIN
  IF UPDATING THEN
    ac:='Aktualizacja';
  END IF;
  IF INSERTING THEN
    ac:='Nowe';
  END IF;
  tab:='WORLDS';
  world:='world_';
  select world || cast(new_world.nextval as varchar2(10)
    into world
    from dual;
  INSERT INTO log(ACTION_DATE,ACTION,TAB_NAME,ADDED_WORLD) 
    VALUES(SYSDATE,ac,tab,world);
  :new.world_name := world;
END;

world_nameこれは、実際には主キーではないことを前提としています。が主キーの場合world_name、行が更新されたときに主キーの値を変更しても意味がありませんINSERT

于 2012-05-24T12:43:40.723 に答える
1

ここにこの行があると思います:

world:=world||cast(NEW_WORLD.NEXTVAL as VARCHAR2(10));

それを次のように置き換えると:

world := world||to_char(NEW_WORLD.NEXTVAL);

それはうまくいくはずです。

ところで: 割り当てで呼び出しを直接使用してnextvalも、11.x より前のバージョンでは機能しません (ここでの x の値についてはわかりません)。

10.x では、変数を宣言してから以下を使用する必要があります。

SELECT to_char(new_world.nextval)
   into world_num;
world := world || world_num;
于 2012-05-24T12:44:25.443 に答える
1

表示されるエラーは、すぐには見つけられないコードの構文エラーを示唆しています。ただし、トリガーがオンになっているのと同じテーブルのトリガー内で DML ステートメント (select、insert、update、delete) を実行することは Oracle では許可されないため、別のエラーが予想されます。トリガーはテーブル ワールドにあるため、トリガー内のテーブル ワールドにレコードを挿入することはできません。

于 2012-05-24T12:31:35.603 に答える