4

私は次のスクリプトを持っています:

ALTER TABLE ODANBIRM 
ADD (OBID NUMBER(10, 0) );
----------------------------------------------------------------------------
CREATE OR REPLACE TRIGGER TR_OB_INC 
BEFORE INSERT ON ODANBIRM
FOR EACH ROW 
BEGIN
  SELECT SEQ_OB.NEXTVAL INTO :NEW.OBID FROM DUAL;
END;

-----------------------------------------------------------------------------

DECLARE
CURSOR CUR IS
SELECT ROWID AS RID FROM ODANBIRM;

  RC CUR%ROWTYPE;
BEGIN
  OPEN CUR;

 LOOP
  FETCH CUR INTO RC;

    EXIT WHEN CUR%NOTFOUND;

  UPDATE ODANBIRM SET OBID=SEQ_OB.NEXTVAL WHERE ROWID=RC.RID;
   END LOOP;

 CLOSE CUR;
  COMMIT;
 END;

ご覧のとおり、3つの異なるスクリプトがあります(破線で区切ります)。これを実行すると、最初のスクリプトは実行されますが、トリガーを作成する2番目のスクリプトは、「シンボル「DECLARE」に遭遇しました」と失敗します。トリガー作成スクリプトを削除してもエラーは発生せず、最初と最後のスクリプトは問題なく実行されます。エラーが発生せずにすべてを実行するにはどうすればよいですか?

編集:次に、2番目のスクリプトは次のようになっている必要があることに気付きました。

UPDATE ODANBIRM SET OBID=SEQ_OB.NEXTVAL;

したがって、この単純なことをループで実行することは、時間の無駄であり、非効率的です。効率を上げるには、できるだけ多くのSQLを使用し、PLSQLをできるだけ少なくする必要があると聞いたことがあります。いい考えだと思います。

4

2 に答える 2

8

スクリプトの終わりの直後の/行にあると思います。これは、最後を含むPLブロックのスクリプト行のすべての終わりに必要です。それで...

ただし、SQLステートメントには含めないでください。2回実行されるため(Benoitが以下のコメントで指摘しているように!)

ALTER TABLE ODANBIRM 
ADD (OBID NUMBER(10, 0) );
/

CREATE OR REPLACE TRIGGER TR_OB_INC 
BEFORE INSERT ON ODANBIRM
FOR EACH ROW 
BEGIN
  SELECT SEQ_OB.NEXTVAL INTO :NEW.OBID FROM DUAL;
END;
/

DECLARE
CURSOR CUR IS
SELECT ROWID AS RID FROM ODANBIRM;

  RC CUR%ROWTYPE;
BEGIN
  OPEN CUR;

 LOOP
  FETCH CUR INTO RC;

    EXIT WHEN CUR%NOTFOUND;

  UPDATE ODANBIRM SET OBID=SEQ_OB.NEXTVAL WHERE ROWID=RC.RID;
   END LOOP;

 CLOSE CUR;
  COMMIT;
 END;
 /
于 2012-05-15T05:23:19.127 に答える
1

あなたの匿名のブロックはただあるべきではありません:

UPDATE ODANBIRM
SET    OBID=SEQ_OB.NEXTVAL;
于 2012-05-15T07:44:39.893 に答える