0

我有一些包含数千条 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 行?原因是,有时一行只是一个注释,我不想附加到它上面。

4

2 回答 2

1

目前尚不清楚您是想在一行BEGIN块之前添加INSERT INTO,还是只是想在每行周围添加BEGIN/行。如果是后者:EXCEPTIONINSERT INTO

sed '/^ *INSERT INTO/{ i\
BEGIN
a\
EXCEPTION
}' input-file
于 2012-09-17T17:22:37.190 回答
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;

只有在没有重复时才插入。

另一种方法是创建一个过程并调用该过程而不是插入。这是伪代码

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

于 2012-09-18T20:52:07.690 回答