我有以下脚本:
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来提高效率。我认为这是一个好主意。
答案 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;