如何在Oracle中一个接一个地运行多个脚本?

时间:2012-05-15 05:19:36

标签: oracle sql-scripts

我有以下脚本:

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来提高效率。我认为这是一个好主意。

2 个答案:

答案 0 :(得分:7)

我认为它在剧本结束后立即就行了。 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;
 /

答案 1 :(得分:1)

你的匿名阻止不应该只是:

UPDATE ODANBIRM
SET    OBID=SEQ_OB.NEXTVAL;