dongye3917
dongye3917
2018-11-05 16:50

Go lang连接到Oracle 9i(使用go-oci8)

已采纳

I have a 32 bit Oracle DB (version 9i - 9.2.0.7.0), a 64 bit Mac and am trying to connect to it using go-oci8 with Go Lang (version go1.11.1 darwin/amd64).

I used SQL-Developer 4.0.2 to successfully connect to the DB and then enabled InstantClient connection through it using this tutorial. So I've got things running from the Oracle Client's side.

I'm using InstantClient Version 11.2.0.4.0 (32-bit) for MacOS (basic and SDK), I've used mainly this tutorial almost successfully. After everything, the error I'm getting is:

github.com/mattn/go-oci8 ld: warning: ignoring file /Users/myusername/Downloads/instantclient_11_2/libclntsh.dylib, file was built for i386 which is not the architecture being linked (x86_64): /Users/myusername/Downloads/instantclient_11_2/libclntsh.dylib Undefined symbols for architecture x86_64:

And then a long stack of symbols. Basically the Go oci8 library is trying to use C (which is 64 bit) and tries to build 64 bit files, which will then be used by Go. If I try with the 64 bit version of InstantClient, I have no problems, but I get a "driver: bad connection" error which is because 64bit won't work to connect some reason.

I have no idea what to do to resole this issue - can I somehow force the build of 32 bit files while using go get -u -v github.com/mattn/go-oci8? Or somehow make the 64 bit InstantClient version connect to the old 32 bit Oracle DB?

Any kind of help on how to get this running would be much appreciated.

Edit: I've tried 10.2 Oracle Client, but I can't connect it with go-oci8 (I'm assuming it doesn't support it). The error I get is ../github.com/mattn/go-oci8/oci8.go:113:25: could not determine kind of name for C.OCI_SYSASM

Final edit for people who have the same problem (coming on to a very old Oracle Database) - you can't interface with the readily provided solutions using Go. The libraries listed to work with Oracle operate with Client versions 11.2 and up.

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • dtrpv60860 dtrpv60860 3年前

    The architecture of the Oracle Client have to match so architecture of your application. I.e. if your Go Lang is 64-bit then the Oracle Client have to be also 64-bit. It does not matter whether the database is 32 or 64-bit.

    I think the main problem is, you cannot connect with an Oracle 11.2 Client to a (20 years old!) Oracle 9i database.

    Check Client / Server Interoperability Support Matrix for Different Oracle Versions (Doc ID 207303.1) for details.

    It says:

    For connections between 10.2 (or higher) and 9.2 the 9.2 end MUST be at 9.2.0.4 or higher. Connections between 10.2 (or higher) and 9.2.0.1, 9.2.0.2 or 9.2.0.3 have never been supported.

    You did not tell us which version of "Oracle 9i" your ar using.

    点赞 评论 复制链接分享