2012-10-23 5 views
5

Ho bisogno di disabilitare autocommit per oracle usando il modulo odlc di erlang in Linux. Sto creato il collegamento con il codice:erlang odbc: Come disattivare l'autocommit per Oracle

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

collegamento è stato creato con successo. Quando sto tentando di aggiornare una tabella, la richiesta è riuscita, ma è commutata automaticamente. Che cosa sto facendo di sbagliato?

+0

potrebbe essere un'impostazione esterna a erlang, magari sul database stesso che forza il commit automatico. –

+0

No. Usando Oracle SQL Developer con lo stesso database devo eseguire il commit manualmente. –

+0

Suppongo che il problema sia in ODBC, non in erlang stesso –

risposta

3

Ok, ragazzi. Ho risolto il problema da solo. Come ho già detto nei commenti, il problema è che il driver Oracle ODBC per Linux ignorava l'impostazione della modalità autocommit durante l'inizializzazione del driver prima della creazione di una connessione. E dopo che una connessione è già stata creata, la modalità autocommit è impostata correttamente.

Ho creato una correzione per il sorgente C per il modulo erlang odbc e ora funziona correttamente. È possibile ottenere le mie patch per Erlang OTP qui - https://github.com/RubberCthulhu/erlang-odbc-oracle-fix.

Aggiornamento: La notizia è tardiva, ma nonostante ciò potrebbe essere utile informarsi qui. La mia correzione per Oracle ODBC è stata inclusa in Erlang/OTP. Quindi, dal momento che R16A il problema non è reale e se è necessario utilizzare ODBC con Oracle basta provare l'ultima versione di Erlang/OTP. Le patch per R14B04-R15B02 sono disponibili qui - https://github.com/RubberCthulhu/erlang-odbc-oracle-fix.

0

In ODBC è presente la funzione SQLSetConnectAttr(). Può essere utilizzato con i valori SQL_ATTR_AUTOCOMMIT e SQL_AUTOCOMMIT_OFF. Ma non so come chiamarlo da Erlang.

+0

Nel modulo di erlang odbc è possibile impostare la modalità di autocommit solo quando si sta creando una connessione. –

+0

Forse puoi rendere questa funzione visibile a Erlang chiamando 'erl_ddll: load_library' con' odbc32.dll' e le funzioni richieste (almeno 'SQLSetConnectAttr()')? –

+0

Forse è un modo. Sono riuscito a scoprire che un tale problema è apparso con Oracle ODBC driver per Linux non solo con erlang. Il problema è che la modalità autocommit può essere impostata solo dopo aver creato la connessione. Il gestore di erlang odbc passa lo stato SQL_ATTR_AUTOCOMMIT dopo aver caricato il driver, ma prima di connettersi, forse il driver Oracle ODBC lo ignora se prima della connessione. –