如何在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中一个接一个地运行多个脚本?的主要内容,如果未能解决你的问题,请参考以下文章