2012-10-23 14 views
5

Tôi cần phải vô hiệu hóa autocommit cho oracle bằng cách sử dụng mô-đun erlang odbc trong Linux. Tôi được tạo kết nối với mã:erlang odbc: Làm thế nào để vô hiệu hóa autocommit cho oracle

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

Kết nối được tạo thành công. Khi tôi đang cố gắng cập nhật một bảng yêu cầu thành công, nhưng nó được cam kết tự động hóa. Tôi đang làm gì sai?

+0

nó có thể là một thiết lập bên ngoài erlang, có thể trên cơ sở dữ liệu chính nó mà lực lượng tự động cam kết. –

+0

No. Sử dụng Oracle SQL Developer với cùng cơ sở dữ liệu tôi phải cam kết thủ công. –

+0

Tôi đoán có lẽ vấn đề là trong ODBC, không phải trong chính bản thân mình –

Trả lời

3

Ok, các bạn. Tôi đã tự khắc phục sự cố. Như tôi đã nói trong các ý kiến ​​trước đó vấn đề là trình điều khiển ODBC Oracle cho Linux đã bỏ qua thiết lập chế độ tự động trong quá trình khởi tạo trình điều khiển trước khi tạo kết nối. Và sau khi kết nối đã được tạo ra, chế độ autocommit được thiết lập đúng.

Tôi đã tạo bản sửa lỗi cho nguồn C cho mô-đun odbc erlang và giờ nó hoạt động vừa phải. Bạn có thể lấy các bản vá lỗi của tôi cho Erlang OTP tại đây - https://github.com/RubberCthulhu/erlang-odbc-oracle-fix.

Cập nhật: Tin tức là đáng tin cậy, nhưng tuy nhiên có thể hữu ích khi thông báo ở đây. Sửa lỗi của tôi cho Oracle ODBC đã được bao gồm trong Erlang/OTP. Vì vậy, kể từ R16A vấn đề là không thực tế và nếu bạn cần phải sử dụng ODBC với Oracle chỉ cần thử phiên bản mới nhất của Erlang/OTP. Các bản vá lỗi cho R14B04-R15B02 có sẵn tại đây - https://github.com/RubberCthulhu/erlang-odbc-oracle-fix.

0

Trong ODBC có chức năng SQLSetConnectAttr(). Nó có thể được sử dụng với các giá trị SQL_ATTR_AUTOCOMMITSQL_AUTOCOMMIT_OFF. Nhưng tôi không biết cách gọi nó từ Erlang.

+0

Trong mô-đun erbang odbc bạn chỉ có thể đặt chế độ tự động khi bạn đang tạo kết nối. –

+0

Có thể bạn có thể làm cho hàm này hiển thị với Erlang bằng cách gọi 'erl_ddll: load_library' với các hàm' odbc32.dll' và bắt buộc (ít nhất là 'SQLSetConnectAttr()')? –

+0

Có thể đó là một cách. Tôi quản lý để tìm ra rằng một vấn đề xuất hiện với trình điều khiển Oracle ODBC cho Linux không chỉ với erlang. Vấn đề là chế độ autocommit có thể được thiết lập chỉ sau khi kết nối đã được tạo. Người quản lý odbc erlang chuyển sang trạng thái SQL_ATTR_AUTOCOMMIT sau khi tải trình điều khiển, nhưng trước khi kết nối, có thể trình điều khiển Oracle ODBC sẽ bỏ qua nó nếu nó trước khi kết nối. –