连接到 oracle 数据库、执行简单的 SELECT 查询并将结果以 CSV 格式输出到标准输出的示例 perl 脚本会很棒。Python 或任何其他在典型的 unix 发行版中可用的语言也可以。
请注意,我只是从头开始,只使用远程 Oracle 数据库的用户名/密码。除了拥有正确的 oracle 连接库之外,还有更多的东西吗?
如果有一种方法可以直接在mathematica 中执行此操作,那将是理想的(大概使用J/Link (mathematica 的java 集成事物)应该是可能的)。
像从 sqlplus 创建文件这样简单的事情怎么样...
set echo off heading off feedback off colsep ,;
spool file.csv;
select owner, table_name
from all_tables;
spool off;
这是 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)
在 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();
两个注释,因为人们在评论中问:
正如 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"]。
Mathematica 有一个内置的包“DatabaseLink”,它应该使这很容易,但您需要为 Oracle 找到一个驱动程序。安装“oracle 客户端库”应该这样做......
获取 Oracle Application Express。这是一个基于浏览器的工具,随数据库免费提供。它允许您快速单击报告并指定 CSV(或 Excel)作为输出格式。(您也可以使用它来构建完整的应用程序)。
您可以在此处找到大量文档、演示等:http: //apex.oracle.com
您还可以在此 URL 下载该工具,或者您可以注册一个免费工作区并在 Oracle 服务器上使用该工具。
我不是 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 魔法把文件放到你想要的任何地方。