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来提高效率.我认为这是个好主意.
我认为它是在剧本结束后立即上线的.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)
| 归档时间: |
|
| 查看次数: |
5191 次 |
| 最近记录: |