2011-06-24 53 views
2

我正在研究一個Oracle窗體(10g),它在一個畫布上有兩個塊。頂部的塊被稱爲QUERY_BLOCK,用戶填充後用數據行填充PRICING_BLOCK。Oracle Forms - 提交單個SQL語句而不是整個表單

但是,在QUERY_BLOCK中,我也有一個複選框,它需要分別對數據庫執行INSERT和DELETE。我WHEN-複選框改變的觸發看起來是這樣的:

begin 
    if :query_block.profile_code is not null then 

     if :query_block.CHECKBOX_FLAG = 'Y' then 
      begin 
       INSERT INTO profile_table VALUES ('Y', :query_block.profile_code); 
      end; 
     else 
      begin 
       DELETE FROM profile_table WHERE profile_code = :query_block.profile_code and profile_type_code = 'FR'; 
      end; 
     end if; 
    end if; 
end; 

我知道,我需要添加某種這裏提交聲明的,否則記錄鎖並沒有什麼實際情況。但是,如果我做了COMMIT;那麼整個表單將通過驗證並更新所有更改的行。

我該如何執行這些單行查詢,而無需更新表單的其餘部分?

回答

2

不評論這個實際的智慧,你可以在執行的數據庫創建過程的autonomous transaction

CREATE OR REPLACE FUNCTION my_fnc(p_flag IN VARCHAR2) 
    RETURN VARCHAR2 IS 
    PRAGMA AUTONOMOUS_TRANSACTION; 
BEGIN 
    IF p_flag = 'Y' THEN 
    INSERT... 
    ELSE 
    DELETE... 
    END IF; 
    COMMIT; 
    RETURN 'SUCCESS'; 
EXCPTION 
    WHEN OTHERS THEN 
    RETURN 'FAIL'; 
END;  

然後你的表單代碼可能看起來像:

begin 
    if :query_block.profile_code is not null then 
     stat := my_fnc(:query_block.CHECKBOX_FLAG); 
    end if; 
end; 

這使得您的函數獨立於調用事務提交。但是,要注意這一點 - 如果你的外部事務必須回滾,那麼自治事務仍然會被提交。我認爲應該有一種交易方式來做你需要做的事來解決你的鎖定問題,這很可能是最好的方法。不知道你的過程的細節,我不知道。一般而言,無論事務是提交還是回滾,例如日誌記錄,都必須在發生更新時使用自治事務。