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

Mik*_*yev 3 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;
Run Code Online (Sandbox Code Playgroud)

如你所见,我有三个不同的脚本(我用虚线分隔它们.)如果我运行这个第一个脚本运行但第二个脚本,我想创建一个触发器失败说"遇到符号"DECLARE"".如果我把触发器创建脚本拿走,我就不会出错,第一个和最后一个脚本运行没有问题.如何在不出错的情况下运行它们我该怎么办?

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

UPDATE ODANBIRM SET OBID=SEQ_OB.NEXTVAL;
Run Code Online (Sandbox Code Playgroud)

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

xQb*_*ert 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;
 /
Run Code Online (Sandbox Code Playgroud)

  • -1.ALTER语句之后的`/`将重复它(或至少尝试).在PL/SQL块(`DECLARE ...`,`BEGIN ...`,以及触及{TYPE/TYPE BODY/PACKAGE/PACKAGE BODY/FUNCTION/PROCEDURE /的任何内容)之后,```应该只****触发}).其他语句是SQL,以分号结束.这里没有坏处,但是如果你在SQL UPDATE语句之后放一个斜杠,你将会播放两次,这可能非常有害. (3认同)