2008-09-15 74 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」]。

相關問題