2015-04-21 62 views
0

這是我的代碼的java在一個匿名PLSQL塊構成一個功能的一部分:SGBD oracle是否始終以相同的順序執行匿名plsql的查詢?

*String p ="FUNCTION get_result RETURN varchar2 AS " 
+"BEGIN " 
+"sql_error:='ok';" 
+query1+";" 
+query2+";" 
+query3+";" 
+"COMMIT;" 
+"RETURN sql_error; " 
+"EXCEPTION " 
+"when others then " 
+"ROLLBACK;" 
+"end;";* 

其中查詢1,2和3是SQL查詢;有時候query2沒有被執行,這不會產生事務錯誤並且查詢1和3並且被提交。我想知道它是如何可能的,我怎樣才能糾正它。 我也想知道哪些程序是之間更好地調用匿名塊語句statement.addBatch

我想知道如何管理該執行操縱許多序列交易的工作階段。 我發現在事務中使用許多seauences會導致oracle不會發回給用戶的錯誤。他們有時在sequence.nextval上獲得2次執行的相同值? 謝謝

+1

這是一個函數,而不是匿名塊;但是對於兩個PL/SQL塊中的語句總是以相同的順序運行。如果使用該定義調用函數,則您的查詢2將始終執行。 (這是一個非常奇怪的設計,BTW)。在不瞭解任何有關語句或數據的任何信息的情況下,或者調用此代碼或函數時,無法說明爲什麼它看起來並未執行。 –

+0

Oracle可以使用多個線程來執行過程嗎? – ValerieMT

+0

你的意思是從多個客戶端會話同時執行相同的過程?是。或者在執行一個實例時內部使用線程?我想象如此,可能在不同的平臺上有不同的程度。儘管每個調用在邏輯上都是完整的,但塊中的語句將按照您指定的順序執行。例如,您可以看到來自同時調用的顯然很奇怪的事情,具體取決於過程的做法以及是否/何時提交。 –

回答

0

我已經看到了我正在創建的錯誤。 事實上,所有的查詢都不在同一個事務中,這是因爲我使用的靜態屬性收集了各種事務的查詢,並通過匿名的plsql將它們發送到SGBD oracle。

所以我將靜態變量更改爲簡單和公共的一個,通過類的實例評估查詢的收集器,以便事務的所有查詢應該總是立即發送並以相同的順序執行。

相關問題