2012-04-26 75 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