从oracle数据库中以CSV文件(或者任何其他自定义文本格式)获取数据

时间:2020-03-05 18:54:11  来源:igfitidea点击:

连接到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"]。