使用sed将BEGIN EXCEPTION行附加到plsql文件中

时间:2012-09-17 16:16:09

标签: plsql sed oracle10g

我有几个包含数千个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行?原因是,有时一条线只是一个评论,我不想附加到那个。

2 个答案:

答案 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脚本。