2012-04-26 41 views
0

如果有一个ParentTable table1和child-table table2,并且我想确保两者都被创建(按照正确的顺序!)或者没有被创建,这是正确的语法吗?oracle sql transcation块正确的语法?

begin  
    insert into table1 values (seq.nextvalue, 'test') ; 
    insert into table2 values (seq.currvalue, 'test3'); 
    commit; 
end; 
+0

'INSERT INTO T1选择A,B,从dual'或'INSERT INTO T1 VALUES(A,B)'你的代码还挺两个:) – MatBailie 2012-04-26 10:51:34

+2

我之间滑落将一个字段列表放入INSERT语句中 - 例如'INSERT INTO T1(FIELDNAME_1,FIELDNAME_2)VALUES(seq.NEXTVALUE,'test')'。我喜欢为数据库提供尽可能少的机会来折叠,旋转,切断或误解我的意思。 – 2012-04-26 14:10:26

+0

如果您已禁用自动提交功能,则无需使用BEGIN/END – 2012-04-26 14:50:51

回答

0

未经测试,但必须是这样的

begin  
    insert into table1 values(seq.nextval, 'test') ; 
    insert into table2 values(seq.currval, 'test3'); 
    commit; 
end; 
1

如果你担心不同的值,在您的顺序分配然后提取到您的插入之前的变量。 如果引发任何异常,它会回滚插入,否则它会提交它们。

DECLARE 
    v_seq_id NUMBER; 
BEGIN 
    SELECT seq.nextval 
    INTO v_seq_id 
    FROM dual; 
    -- 
    INSERT INTO table1 
    VALUES (
     v_seq_id, 
     'test' 
    ); 
    -- 
    INSERT INTO table2 
    VALUES (
     v_seq_id, 
     'test3' 
    ); 
    -- 
    COMMIT; 
EXCEPTION 
    WHEN others 
    THEN 
     <log_error> 
     ROLLBACK; 
END; 

希望它可以帮助...

+0

我不只是担心不同的seq值,而只是第一次插入,而不是其他原因。我猜这就是异常情况出现的地方。顺便说一下,我是否正在担心不同的seq值? – TPR 2012-04-26 12:59:37

+0

@progtick,这取决于你是否真的需要序列值匹配(即对于外键关系)。至于插入和一个发生没有另一个,你是正确的,异常部分将确保如果其中一个插入有错误,将发生回滚,确保没有插入到任何表中。 – Ollie 2012-04-26 13:20:58

+0

在EXCEPTION块中,您可能想用'DBMS_OUTPUT.PUT_LINE('Error - '|| SQLCODE ||':'|| SQLERRM)'替换''。 – 2012-04-26 14:08:18