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

Posted

技术标签:

【中文标题】如何在Oracle中一个接一个地运行多个脚本?【英文标题】:How do I run multiple scripts one after another in Oracle? 【发布时间】:2012-05-15 05:19:36 【问题描述】:

我有以下脚本:

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;

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

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

UPDATE ODANBIRM SET OBID=SEQ_OB.NEXTVAL;

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

【问题讨论】:

【参考方案1】:

我认为 / 在紧跟脚本结尾的那一行。 PL 块的所有脚本行都需要它,包括最后一个。所以...

但是,不要放在 SQL 语句上;因为它将运行两次(正如 Benoit 在下面的 cmets 中指出的那样!)

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。 / 在 ALTER 语句之后将重复它(或至少尝试)。 / 应该放在 PL/SQL 块之后(DECLARE...BEGIN... 以及任何涉及 TYPE/TYPE BODY/PACKAGE/PACKAGE BODY/FUNCTION/PROCEDURE/TRIGGER 的内容) .其他语句为 SQL,并以分号结束。这没有什么坏处,但是如果你在 SQL UPDATE 语句后面加上一个斜杠,你会播放两次,这可能是非常有害的。 嗯,我不知道。谢谢你。 我也没有!很高兴知道和值得评论【参考方案2】:

你的匿名块不应该是:

UPDATE ODANBIRM
SET    OBID=SEQ_OB.NEXTVAL;

【讨论】:

我知道,然后我意识到并将其更改为与您所说的相同的查询。起初我在想,如果不循环执行此操作,我将无法实现序列下一个值。然后我发现更新查询本身就像一个序列的循环。 Nextval 确实有点古怪。如果您只想更新现有值并且不需要未来值的序列,您可以设置obid=rownum 是的,经验就是经验。我从没想过。非常好的方法。

以上是关于如何在Oracle中一个接一个地运行多个脚本?的主要内容,如果未能解决你的问题,请参考以下文章

在discord.py中发送X消息之前,如何一个接一个地运行多个discord令牌?

如何从一个脚本运行多个 Python/Shell 脚本

如何使用批处理文件运行多个 SQL 脚本?

Appium:如何一个接一个地执行多个测试用例?

如何自动运行大量 perl 脚本?

在 SQL Server 中使用 OLE DB 运行多个命令或 sql 脚本