我有几个包含数千个INSERT语句的sql文件。执行这些脚本时的问题是它们中的一些违反了唯一约束。
我最初做过这样的事情:
BEGIN
INSERT INTO .....;
INSERT INTO .....;
...
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
null;
END;
/
EXIT;
然而,似乎发生异常的第一个实例将导致整个块结束,因此其余的语句不会被执行。
由于我使用的Oracle版本不是11,我不能使用nice CONTINUE命令。所以我想为每个 INSERT INTO语句做这样的事情:
BEGIN
INSERT INTO ....;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
null;
END;
/
...
如何使用sed读取sql文件中的每一行,扫描单词“INSERT INTO”,如果存在,则在INSERT INTO行之间追加BEGIN和EXCEPTION行?原因是,有时一条线只是一个评论,我不想附加到那个。
答案 0 :(得分:1)
目前尚不清楚您是否尝试在BEGIN
行阻止之前添加INSERT INTO
,或者只是想在每个BEGIN
/ EXCEPTION
行周围添加INSERT INTO
/ sed '/^ *INSERT INTO/{ i\
BEGIN
a\
EXCEPTION
}' input-file
行{1}}行。如果是后者:
{{1}}
答案 1 :(得分:0)
您可以通过多种方式解决此问题。一种方法是在插入之前检测到记录没有重复。这可以像这样完成
select cout(*) INTO v_count
Fron table1 tb
where tb.column_name1 = val1;
IF v_count == 0 THEN
insert into table1 values (val1, vale2....);
END IF;
只有在没有重复的情况下才会插入。
另一种方法是创建一个过程并调用过程而不是insert。 这是psedo代码
create procedure insert_row (val1 varchar2, val2 varchar2)
IS
BEGIN
INSERT INTO ....;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
null;
END;
此过程将处理因调用过程中重复记录而导致的异常。
你也可以写一个循环。这取决于您的数据和程序的逻辑。 Pdedo代码是
Loop
/* get the date from the cursor*/
fetch cursor_c into record_r
EXIT WHEN cursor%NOTFOUND;
BEGIN
INSERT INTO .....;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
null;
END;
END LOOP;
要获取所有插入,请使用简单的grep -i语句。这将收集文件中的所有插入。您可以编写PL / SQL或C / C ++ / Java语言程序来生成新的SQL脚本。