从oracle数据库中以CSV文件(或者任何其他自定义文本格式)获取数据
连接到oracle数据库,执行简单的SELECT查询并将结果以CSV格式发送到stdout的示例perl脚本将是很棒的。 Python或者典型的unix发行版中可用的任何其他语言也可以。
请注意,我从头开始,只是远程Oracle数据库的用户名/密码。除了拥有正确的oracle连接库之外,还有其他功能吗?
如果有一种方法可以直接在mathematica中进行,那将是理想的(大概可以通过J / Link实现(mathematica的java集成)。
解决方案
回答
在perl中,我们可以执行以下操作,省去我所有的局部变量声明和...,或者为了简洁起见而忽略" failmessage"错误处理。
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客户端库。安装该程序还将设置所有必要的环境变量。
回答
这是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)
回答
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魔术操作,即可将文件放置在所需的位置。
回答
如何从sqlplus创建文件一样简单...
set echo off heading off feedback off colsep ,; spool file.csv; select owner, table_name from all_tables; spool off;
回答
就像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"]。