如何将Oracle数据库连接到Mathematica?

11
我正在尝试将Oracle数据库连接到Mathematica 8。另一个问题已经说明了如何在MySQL数据库中实现,但对我来说不起作用。
Needs["DatabaseLink"] AND conn = OpenSQLConnection[JDBC["MySQL(Connector/J)", 
"yourserver/yourdatabase"], "Username" -> "yourusername", "Password" -> "yourpassword"]

以下信息可在我的桌面上找到:
filepath = "C:\oracle\ora92\network\ADMIN\tnsnames.ora"; HOST; PORT; username; password;

conn = OpenSQLConnection[JDBC["MySQL(Connector/J)", HOST], "Username" -> username, "Password" -> password]

Error message: JDBC::error: 
    Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. 
    The driver has not received any packets from the server. >>

有人知道我怎么连接或继续吗?
4个回答

12

Mathematica 8没有预装Oracle驱动程序,通过执行以下表达式可以验证这一事实:

Needs["DatabaseLink`"]
JDBCDriverNames[]
(*
Out[2]= {Microsoft Access(ODBC),hsqldb,HSQL(Memory),HSQL(Server),
         HSQL(Server+TLS),HSQL(Standalone),HSQL(Webserver),HSQL(Webserver+TLS),
         jtds_sqlserver,jtds_sybase,mysql,MySQL(Connector/J),ODBC(DSN),odbc,
         PostgreSQL,Microsoft SQL Server(jTDS),Sybase(jTDS),HSQL 2.0.1}
*)

我们需要按照 Mathematica documentation 中的指示来安装新的 JDBC 驱动程序。首先,我们需要创建一个新的资源目录,以放置必要的 JDBC 驱动程序 JAR 文件:
$jarDirectory =
  CreateDirectory @
    FileNameJoin @
      {$UserBaseDirectory, "Applications", "Oracle", "Java"}

下一步,我们必须选择一个JDBC驱动程序来使用。访问相关的Oracle页面以找到适合您数据库的正确JDBC驱动程序。
选择与Java 6兼容的驱动程序版本,这是Mathematica 8内部使用的版本。对于此示例,我选择使用Oracle 11.2.0.2.0驱动程序用于Java 6。下载文件,然后将其移动到刚创建的资源目录中:
SystemOpen[$jarDirectory]

接下来,我们将创建一个JDBC驱动程序配置文件,以便新的驱动程序可以在Mathematica中注册:

$configDirectory =
  CreateDirectory @
    FileNameJoin @
      {$UserBaseDirectory, "Applications", "Oracle", "DatabaseResources"}

Export[
  FileNameJoin @ {$configDirectory, "Oracle.m"}
, JDBCDriver[
    "Name" -> "Oracle"
  , "Driver" -> "oracle.jdbc.driver.OracleDriver"
  , "Protocol" -> "jdbc:oracle:thin:@"
  , "Version" -> 1
  ]
, "Text"
]

驱动程序现已安装:

JDBCDriverNames[]
(*
Out[9]= {Oracle,Microsoft Access(ODBC),hsqldb,HSQL(Memory),HSQL(Server),
         HSQL(Server+TLS),HSQL(Standalone),HSQL(Webserver),HSQL(Webserver+TLS),
         jtds_sqlserver,jtds_sybase,mysql,MySQL(Connector/J),ODBC(DSN),odbc,
         PostgreSQL,Microsoft SQL Server(jTDS),Sybase(jTDS),HSQL 2.0.1}
*)

如果运气好的话,我们现在可以建立连接并执行SQL查询:

$connection =
  OpenSQLConnection[
    JDBC["Oracle", "myserver:1521:mysid"]
  , "Username" -> "scott"
  , "Password" -> "tiger"
  ]

SQLExecute[$connection, "SELECT 'success!' FROM DUAL"]

...其中myserver是数据库服务器名称,1521是监听器端口号,mysid是Oracle系统ID(SID)。

Oracle JDBC URL有很多形式。有关详细信息,请查看Oracle FAQ


JDBC::错误:"侦听器拒绝连接并显示以下错误:\nORA-12504,TNS:在CONNECT_DATA中未给出SID"。 - Patrick Bernhard
@Patrick 你可以在端口号后面添加SID,例如 myserver:1521:SID - WReach
成功 - 我已连接 :-) 非常感谢您的帮助! - Patrick Bernhard
在我的安装中,“User”必须改为“用户名”。除此之外,答案完美且表述清晰! - Reb.Cabin
@PatrickBernhard,我可以建议您将WReach的答案标记为“已接受”吗?它似乎对很多人(包括我)都起作用了。 - Reb.Cabin
显示剩余4条评论

6
我怀疑您正在使用错误的JDBC驱动程序 - 您应该使用Oracle JDBC驱动程序,而不是MySQL驱动程序。当我在使用DatabaseLink连接到Oracle数据库时,我使用了以下命令:
OpenSQLConnection[
  JDBC[
   "oracle.jdbc.driver.OracleDriver", 
   "jdbc:oracle:thin:@server:port:dbname"
  ], 
  "Name" -> "dbname", 
  "Username" -> "YourUserName", 
  "Password" -> "YourPassword"
]

您需要确保将适当的Oracle JDBC驱动程序(对应于您的Oracle数据库版本)放置在Mathematica可以找到的地方。该过程在DatabaseLink的文档中的JDBC Connections部分中进行了描述。您可以通过执行JDBCDrivers []来测试哪些JDBC驱动程序对Mathematica可见。请确保安装和使用与您的DB版本相对应的正确驱动程序,顺便提一句 - 不正确的驱动程序版本可能会导致非常严重和不明显的错误(这与Mathematica无关)。


1

我的猜测是,你不应该使用MySQL JBDC连接Oracle。虽然这是针对Mathematica 5.2的,但这里有一篇文章或许可以作为你参考的内容。

我几乎没有使用过Mathematica,尤其是与数据库相关的部分,但从那个页面上看,似乎你可以这样做:

OpenSQLConnection[JDBC["oracle","server.business.com:1999"],
    Username -> "you"]

OpenSQLConnection[JDBC["Oracle", "localhost:1521/databasename"], "Username" -> "username", "Password" -> "password"] - Michiel van Mens

1
虽然WReach的答案是正确的,但还有两行代码也很有用 - 确保Jlink已加载并且Java ClassPath正确指向您的oracle jdbc6.jar文件。
Needs["JLink`"]
AddToClassPath[
FileNameJoin[{$UserBaseDirectory, "Applications", "Oracle", 
"Java"}]];

或者如果直接使用答案,只需


Needs["JLink`"]
AddToClassPath[$jarDirectory];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接