2012-03-09 55 views
3

我的問題是,如何刪除讀取的記錄?我在C++應用程序中使用Oracle ond AIX和Roguewave數據庫層。已解決的Oracle sql刪除問題

我一直在谷歌搜索這個答案,但似乎只是簡單的例子。是否有一個SQL語句返回刪除的行?

這會大大提高我的應用程序的性能,因爲只有0.1%的情況下需要留在這個表中,換句話說,我會在表中插入0.1%。

我發現的唯一提示是「進入」條款,我會假設使用刪除進入工作,但我從來沒有使用它。

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/returninginto_clause.htm

回答

5

根據oracle documentation確實可以刪除並讀入一個去:

DELETE FROM employees 
    WHERE job_id = 'SA_REP' 
    AND hire_date + TO_YMINTERVAL('01-00') < SYSDATE 
    RETURNING salary INTO :bnd1; 

我從來沒有用過它自己...但你可以試試看。

+0

我認爲這是我喜歡有語法的明智之處,它現在不運行,但我會嘗試使其工作 – 2012-03-09 08:29:18

+0

很好的答案。但是,這隻會在存儲過程中起作用,會嗎?或者你可以直接從例如JDBC? – sleske 2012-03-09 08:41:34

+0

@sleske:我在沒有存儲過程的情況下在使用OCCI的'select'語句中使用了'returns'子句,它工作得很好。由於這是一個不同的場景(其他數據庫層),但我不能確定。 – nabulke 2012-03-09 08:53:53

0

您是否嘗試過類似構建審計觸發器?

Good description to build an select trigger.

創作:

begin 
    dbms_fga.add_policy 
    (object_schema=>'SCOTT' 
    , object_name=>'EMP' 
    , policy_name=>'SAL_ACCESS_HANDLED' 
    , audit_column => 'SAL' 
    , audit_condition => 'SAL>= 1500' 
    , handler_schema => 'SCOTT' 
    , handler_module => 'AUDIT_HANDLER.HANDLE_EMP_SAL_ACCESS' 
); 
end; 
/

函數簽名:

PROCEDURE HANDLE_EMP_SAL_ACCESS 
(object_schema VARCHAR2 
, object_name VARCHAR2 
, policy_name VARCHAR2 
); 
+0

這會如何幫助OP?行被刪除在哪裏? – sleske 2012-03-09 08:05:42

+0

我其實並沒有考慮觸發器作爲解決方案,我的假設是,觸發器的工作原理就像一個叉式選擇 - >數據(叉式觸發器) - >將數據返回給應用程序,告訴我我的理解是否正確 – 2012-03-09 08:07:51

+0

通過更改插入到被調用過程中的刪除?我不得不承認,如果可以在不再次觸發的情況下修改函數內的表格,我還沒有嘗試 - 所以也許應該添加一個檢查。 – Eggi 2012-03-09 08:12:48

1

沒有,沒有SQL構造閱讀並一次性刪除一行。

儘管如此,你可以編寫一個存儲過程。或者您可以緩存已經在內存中讀取的記錄(以便您不再讀取它們),然後再進行批量刪除(DELETE FROM table WHERE id in (?))。這應該比許多單獨的DELETE更快。

或者你可能會考慮採用不同的方法解決問題。爲什麼在閱讀時需要刪除很多行?你使用數據庫表來傳遞消息嗎?有沒有更適合您的問題的技術?如果您覺得您必須針對既定的技術規範開展工作,那可能意味着您沒有使用正確的工具進行工作......