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;

如您所见,我有三个不同的脚本(我用虚线分隔它们。)如果我运行第一个脚本,但第二个脚本(我想在其中创建触发器)失败说“遇到符号“DECLARE””。如果我把触发器创建脚本拿走,我不会出错,第一个和最后一个脚本运行没有问题。我该怎么做才能在不出错的情况下运行它们?

编辑:然后我意识到第二个脚本应该是这样的:

UPDATE ODANBIRM SET OBID=SEQ_OB.NEXTVAL;

所以在循环中做这个简单的事情是浪费时间和低效的。我曾经听说应该使用尽可能多的 SQL 和尽可能少的 PL SQL 以提高效率。我认为这是个好主意。

4

2 回答 2

8

我认为它是 / 在脚本结束后立即上线。PL 块的所有脚本行都需要它,包括最后一个。所以...

但是,不要放在 SQL 语句上;因为它将运行两次(正如 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 回答