3

连接到 oracle 数据库、执行简单的 SELECT 查询并将结果以 CSV 格式输出到标准输出的示例 perl 脚本会很棒。Python 或任何其他在典型的 unix 发行版中可用的语言也可以。

请注意,我只是从头开始,只使用远程 Oracle 数据库的用户名/密码。除了拥有正确的 oracle 连接库之外,还有更多的东西吗?

如果有一种方法可以直接在mathematica 中执行此操作,那将是理想的(大概使用J/Link (mathematica 的java 集成事物)应该是可能的)。

4

7 回答 7

8

像从 sqlplus 创建文件这样简单的事情怎么样...

set echo off heading off feedback off colsep ,;
spool file.csv;
select owner, table_name
from all_tables;
spool off;
于 2008-09-21T02:11:56.703 回答
4

这是 Python 中的一个实现:

import cx_Oracle, csv

orcl = cx_Oracle.connect('ohd/john@ohddb')
curs = orcl.cursor()

csv_file_dest = "C:\\test.csv"

output = csv.writer(open(csv_file_dest,'wb'))

sql = "select * from parameter"

curs.execute(sql)

headers_printed = False
for row_data in curs:        
    if not headers_printed:
        cols = []
        for col in curs.description:
            cols.append(col[0])
        output.writerow(cols)
        headers_printed = True

    output.writerow(row_data)
于 2008-09-15T18:58:08.593 回答
3

在 perl 中你可以做这样的事情,省略我所有的局部变量声明和......或者为了简洁起见而死掉“失败消息”错误处理。

use DBI; 
use DBD::Oracle;

$dbh = DBI->connect( "dbi:Oracle:host=127.0.0.1;sid=XE", "username", "password" );

# some settings that you usually want for oracle 10
$dbh->{LongReadLen} = 65535;
$dbh->{PrintError} = 0;     

$sth = $dbh->prepare("SELECT * FROM PEOPLE");

$sth->execute();

# one example for error handling just to show how it's done in principle
if ( $dbh->err() ) { die $dbh->errstr(); }

# you can also do other types of fetchrow, see perldoc DBI 
while ( $arrayref = $sth->fetchrow_arrayref ) {
    print join ";", @$arrayref;
    print "\n";
}

$dbh->disconnect();

两个注释,因为人们在评论中问:

  • sid=XE 是 oracle 服务 ID,就像您的数据库的名称。如果您安装免费版的 oracle,它默认为“XE”,但您可以更改它。
  • 安装 DBD::Oracle 需要系统上的 oracle 客户端库。安装它还将设置所有必要的环境变量。
于 2008-09-15T18:44:33.850 回答
2

正如 dreeves 所说,DatabaseLink 使这变得微不足道。我不知道的部分是 JDBC 声明的细节。但这里是 MySQL 的样子:

然后从 Mathematica 内部:

Needs["DatabaseLink`"]
conn = OpenSQLConnection[JDBC["mysql","hostname/dbname"], Username->"user", Password->"secret"]
Export["file.csv", SQLSelect[conn, "MyTable"]]

您当然可以先将 SQLSelect 分配给一个变量并检查它。它将是包含表数据的列表列表。您可以将条件传递给 SQLSelect,请参阅相关文档(例如 SQLColumn["Name"]=="joeuser")。

这里唯一特定于 Oracle 的是您如何在 JDBC 表达式中建立连接。它可能类似于 JDBC["oracle", "hostname/dbname"]。

于 2009-03-02T19:35:49.290 回答
0

Mathematica 有一个内置的包“DatabaseLink”,它应该使这很容易,但您需要为 Oracle 找到一个驱动程序。安装“oracle 客户端库”应该这样做......

于 2008-09-15T19:01:10.287 回答
0

获取 Oracle Application Express。这是一个基于浏览器的工具,随数据库免费提供。它允许您快速单击报告并指定 CSV(或 Excel)作为输出格式。(您也可以使用它来构建完整的应用程序)。

您可以在此处找到大量文档、演示等:http: //apex.oracle.com

您还可以在此 URL 下载该工具,或者您可以注册一个免费工作区并在 Oracle 服务器上使用该工具。

于 2008-09-15T19:35:53.777 回答
0

我不是 PERL 程序员,但这里有一些您可能想要研究的额外功能。看看Oracle中外部表的概念。您创建一个表,其定义类似于以下内容:-

CREATE TABLE MY_TABLE
(
  COL1    NUMBER(2),
  COL2  VARCHAR2(20 BYTE)
)
ORGANIZATION EXTERNAL
  (  TYPE ORACLE_LOADER
     DEFAULT DIRECTORY SOME_DIRECTORY_NAME
     ACCESS PARAMETERS 
       ( FIELDS TERMINATED BY ','
         MISSING FIELD VALUES ARE NULL
       )
     LOCATION (SOME_DIRECTORY_NAME:'my_file.csv')
  )
REJECT LIMIT UNLIMITED;

请注意,此 DDL 语句假定您已经创建了一个名为“SOME_DIRECTORY_NAME”的目录。然后,您可以发出 DML 命令以将数据输入或输出此表,一旦提交完成,您的文件 my_file.csv 中的数据就会非常整洁。之后,用你的 PERL 魔法把文件放到你想要的任何地方。

于 2008-09-17T15:53:59.487 回答