【问题标题】:erlang odbc: How to disable autocommit for oracleerlang odbc:如何禁用 oracle 的自动提交
【发布时间】:2012-10-13 03:41:41
【问题描述】:

我需要在 Linux 中使用 erlang odbc 模块禁用 oracle 的自动提交。 我创建了与代码的连接:

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

连接已成功创建。当我尝试更新表时,请求成功,但它是自动提交的。我做错了什么?

【问题讨论】:

  • 它可能是 erlang 之外的设置,也可能是数据库本身强制自动提交的设置。
  • 没有。在同一个数据库中使用 Oracle SQL Developer,我必须手动提交。
  • 我想问题可能出在 ODBC 中,而不是 erlang 本身
  • 感谢您的回答,但我已经自己创建了一个修复程序。

标签: linux oracle erlang odbc


【解决方案1】:

好的,伙计们。我自己解决了这个问题。正如我之前在 cmets 中所说,问题是用于 Linux 的 Oracle ODBC 驱动程序在创建连接之前的驱动程序初始化期间忽略了设置自动提交模式。在创建连接后,自动提交模式设置正确。

我为 erlang odbc 模块的 C 源代码创建了一个修复程序,现在它可以正常工作了。你可以在这里获取我的 Erlang OTP 补丁 - https://github.com/RubberCthulhu/erlang-odbc-oracle-fix。

更新:这个消息来晚了,但在这里通知一下可能会有用。我对 Oracle ODBC 的修复已包含在 Erlang/OTP 中。因此,自从 R16A 以来,问题并不实际,如果您需要将 ODBC 与 Oracle 一起使用,只需尝试最新版本的 Erlang/OTP。 R14B04-R15B02 的补丁可在此处获取 - https://github.com/RubberCthulhu/erlang-odbc-oracle-fix。

【讨论】:

    【解决方案2】:

    在 ODBC 中有SQLSetConnectAttr() 函数。它可以与 SQL_ATTR_AUTOCOMMIT 和 SQL_AUTOCOMMIT_OFF 值。但我不知道如何从 Erlang 中调用它。

    【讨论】:

    • 在 erlang odbc 模块中,您只能在创建连接时设置自动提交模式。
    • 也许你可以通过调用erl_ddll:load_library 和odbc32.dll 和所需的函数(至少SQLSetConnectAttr())使这个函数对Erlang 可见?
    • 也许是一种方式。我设法发现这样的问题不仅出现在 erlang 中,而且出现在适用于 Linux 的 Oracle ODBC 驱动程序中。问题是只有在创建连接后才能设置自动提交模式。 erlang odbc 管理器在加载驱动程序后传递 SQL_ATTR_AUTOCOMMIT 状态,但在连接之前,如果它在连接之前,Oracle ODBC 驱动程序可能会忽略它。
    猜你喜欢
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    相关资源
    最近更新 更多