2012-10-23 33 views
5

我需要在Linux中使用erlang odbc模塊禁用自動提交。 我創建了代碼連接:erlang odbc:如何禁用oracle的自動提交

{ok, Con} = odbc:connect("DSN=MyDSN", [{auto_commit, off}, {scrollable_cursors, off}]). 

連接被成功創建。當我試圖更新表時,請求是成功的,但它是自動提交的。我究竟做錯了什麼?

+0

它可能是erlang之外的設置,也可能是強制自動提交的數據庫本身。 –

+0

否。使用具有相同數據庫的Oracle SQL Developer我必須手動提交。 –

+0

我想也許問題是在ODBC中,而不是在erlang本身 –

回答

3

好的,夥計們。我自己解決了這個問題。正如我在前面的評論中說的那樣,問題是Linux的Oracle ODBC驅動程序在連接創建之前在驅動程序初始化期間忽略了設置自動提交模式。並且在連接已經創建之後,自動提交模式被正確設置。

我爲erlang odbc模塊的C源創建了一個修復程序,現在它工作得很好。你可以在這裏得到我的Erlang OTP補丁 - https://github.com/RubberCthulhu/erlang-odbc-oracle-fix

更新:這個消息遲來了,但是告訴這裏可能是有用的。我的Oracle ODBC修復已包含在Erlang/OTP中。因此,由於R16A的問題不是實際的,如果您需要在Oracle中使用ODBC,只需嘗試最新版本的Erlang/OTP。 R14B04-R15B02的補丁可在此獲得 - https://github.com/RubberCthulhu/erlang-odbc-oracle-fix

0

在ODBC中有SQLSetConnectAttr()函數。它可以與 SQL_ATTR_AUTOCOMMITSQL_AUTOCOMMIT_OFF值一起使用。但我不知道如何從Erlang中調用它。

+0

在erlang odbc模塊中,只有在創建連接時纔可以設置自動提交模式。 –

+0

也許你可以使用'odbc32.dll'和所需的函數調用'erl_ddll:load_library'(至少是'SQLSetConnectAttr()')來讓Erlang可以看到這個函數? –

+0

也許這是一種方式。我設法發現,這個問題出現在Oracle的ODBC驅動程序中,不僅與erlang有關。問題是自動提交模式只能在連接創建後才能設置。 erlang odbc管理器在加載驅動程序之後傳遞SQL_ATTR_AUTOCOMMIT狀態,但在連接之前,如果在連接之前Oracle ODBC驅動程序可能忽略它。 –