2012-10-23 2 views
5

Linux에서 erlang odbc 모듈을 사용하여 oracle 용 자동 커밋을 비활성화해야합니다. 나는 코드와 관련하여 만든거야 :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에서 얻을 수 있습니다.

업데이트 : 소식은 늦었지만 여기에 알려주는 것이 유용 할 수 있습니다. Erlang/OTP에 Oracle ODBC에 대한 내 수정 사항이 포함되었습니다. 그래서 R16A 이후 문제는 실제가 아니며 오라클과 함께 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

어쩌면 당신은'erl_ddll : load_library'를'odbc32.dll'과 필요한 함수 (적어도'SQLSetConnectAttr()')로 호출함으로써 Erlang이이 함수를 볼 수있게 할 수 있을까요? –

+0

어쩌면 방법 일 수 있습니다. 필자는 이러한 문제가 erlang뿐만 아니라 Linux 용 Oracle ODBC 드라이버에서도 나타난다는 것을 알 수있었습니다. 문제는 자동 커밋 모드는 연결이 만들어진 후에 만 ​​설정할 수 있다는 것입니다. erlang ODBC 관리자는 드라이버를로드 한 후 SQL_ATTR_AUTOCOMMIT 상태를 전달하지만, 연결하기 전에 Oracle ODBC 드라이버는 연결하기 전에이를 무시합니다. –

관련 문제