Получение данных из базы данных Oracle в виде файла CSV (или любого другого пользовательского текстового формата) - PullRequest
3 голосов
/ 15 сентября 2008

Пример сценария Perl, который подключается к базе данных Oracle, выполняет простой запрос SELECT и выкладывает результаты в стандартный вывод в формате CSV. Python или любой другой язык, доступный в типичном дистрибутиве Unix, тоже подойдет.

Обратите внимание, что я начинаю с нуля, используя только имя пользователя / пароль для удаленной базы данных Oracle. Есть ли что-то большее, чем просто наличие правильной библиотеки соединений Oracle?

Если есть способ сделать это непосредственно в Mathematica, это было бы идеально (предположительно, это должно быть возможно с J / Link (Jave Link Mathematica))

Ответы [ 7 ]

8 голосов
/ 21 сентября 2008

Как насчет чего-то такого простого, как создание файла из sqlplus ...

set echo off heading off feedback off colsep ,;
spool file.csv;
select owner, table_name
from all_tables;
spool off;
4 голосов
/ 15 сентября 2008

Вот реализация на 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)
3 голосов
/ 15 сентября 2008

В 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, по умолчанию используется «XE», но вы можете изменить ее.
  • Установка DBD :: Oracle нуждается в клиентских библиотеках Oracle в вашей системе. Установка также установит все необходимые переменные окружения.
2 голосов
/ 02 марта 2009

Как говорит Дрив, 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"].

0 голосов
/ 17 сентября 2008

Я не программист на 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, чтобы получить файл в любом месте.

0 голосов
/ 15 сентября 2008

Получить Oracle Application Express. Это браузерный инструмент, который поставляется бесплатно с базой данных. Это позволяет быстро объединять отчеты и указывать CSV (или Excel) в качестве выходного формата. (Вы также можете использовать его для создания законченных приложений).

Вы найдете тонны документации, демонстрации и т. Д. Здесь: http://apex.oracle.com

Вы также можете загрузить инструмент по этому URL или зарегистрироваться для свободного рабочего пространства и поиграть с инструментом на сервере Oracle.

0 голосов
/ 15 сентября 2008

Mathematica имеет встроенный пакет DatabaseLink, который должен упростить эту задачу, но вам нужно найти драйвер для Oracle. Установка "клиентских библиотек Oracle" должна сделать это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...