2008-09-15 45 views
3

连接到oracle数据库的示例perl脚本执行简单的SELECT查询并将结果吐出到CSV格式的stdout将会很棒。在典型的unix发行版中可用的Python或任何其他语言也可以。从oracle数据库以CSV文件(或任何其他自定义文本格式)的形式获取数据

请注意,我从头开始只用远程Oracle数据库的用户名/密码。除了拥有正确的oracle连接库之外,还有更多吗?如果有一种方法可以直接在mathematica中做到这一点,那将是理想的(假设它应该可以通过J/Link(mathematica的java集成)来实现)。

回答

3

在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客户端库。安装它也会设置所有必要的环境变量。
+0

非常感谢!请注意,忘记在“密码”后关闭引号。另外,什么是“sid = XE”? – dreeves 2008-09-15 18:56:18

+0

另一个问题:如果没有设置$ ORACLE_HOME,我无法安装DBD :: Oracle。我现在意识到你显然不能只是连接到oracle数据库。我想我需要认真的握手。我应该从头开始做什么,但远程oracle数据库的用户名/密码? – dreeves 2008-09-15 19:42:51

4

这里是用Python实现:

import cx_Oracle, csv 

orcl = cx_Oracle.connect('ohd/[email protected]') 
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) 
0

数学有一个包“DatabaseLink”中建,应该让这个简单,但你需要找到甲骨文的驱动程序。安装“oracle客户端库”应该这样做...

0

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

你找到吨的文档,演示等在这里: http://apex.oracle.com

您也可以在这个网址下载该工具,或者您可以自由的工作空间注册和玩在Oracle服务器上的工具。

+0

该工具是否允许您连接到远程服务器上的现有数据库?它似乎只是从头开始创建一个新的数据库。 – dreeves 2008-09-17 21:02:54

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魔法将文件放到任何你想要的地方。

7

如何为创建从sqlplus中的文件一样简单的东西...

set echo off heading off feedback off colsep ,; 
spool file.csv; 
select owner, table_name 
from all_tables; 
spool off; 
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”]。

相关问题