2008-09-15 7 views
3

Un exemple de script perl qui se connecte à une base de données Oracle, effectue une requête SELECT simple et crache les résultats sur stdout au format CSV. . Python ou tout autre langage disponible dans une distribution unix typique serait bien aussi.Obtention de données à partir d'une base de données Oracle en tant que fichier CSV (ou tout autre format texte personnalisé)

Notez que je pars de zéro avec rien d'autre qu'un nom d'utilisateur/mot de passe pour une base de données Oracle distante. Y at-il plus à cela que d'avoir juste la bonne bibliothèque de connexion oracle?

S'il y a un moyen de faire cela directement dans mathematica, ce serait idéal (probablement cela devrait être possible avec J/Link (java integration de mathematica)).

Répondre

3

En perl, vous pourriez faire quelque chose comme ceci, en omettant toutes les déclarations de mes variables locales et ... ou en supprimant la gestion des erreurs "failmessage" par souci de brièveté.

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(); 

Deux notes, parce que les gens posées dans les commentaires:

  • sid = XE est l'ID du service oracle, qui est comme le nom de votre base de données. Si vous installez la version gratuite d'Oracle, la valeur par défaut est "XE", mais vous pouvez le changer.
  • L'installation de DBD :: Oracle nécessite les bibliothèques client Oracle sur votre système. Installation qui va également définir toutes les variables d'environnement nécessaires.
+0

Merci beaucoup! Notez que vous avez oublié de fermer les guillemets après "mot de passe". Aussi, qu'est-ce que "sid = XE"? – dreeves

+0

Un autre problème: je ne peux pas installer DBD :: Oracle sans $ ORACLE_HOME étant défini. Je me rends compte maintenant que vous ne pouvez pas simplement vous connecter à une base de données Oracle. Je suppose que j'ai besoin d'une main sérieuse. Qu'est-ce que je fais à partir de zéro avec rien d'autre que nom d'utilisateur/pw pour un oracle distant db? – dreeves

4

Voici une implémentation en 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

Mathematica a un paquet « DatabaseLink » construit qui devrait vous faciliter la tâche, mais vous devez trouver un pilote pour Oracle. L'installation des "bibliothèques client Oracle" devrait faire cela ...

0

Obtenez Oracle Application Express. C'est un outil basé sur un navigateur qui est gratuit avec la base de données. Il vous permet de cliquer rapidement sur les rapports et de spécifier CSV (ou Excel) comme format de sortie. (Vous pouvez également l'utiliser pour construire des applications complètes).

Vous trouverez des tonnes de documentation, des démos etc. ici: http://apex.oracle.com

Vous pouvez également télécharger l'outil à l'adresse, ou vous pouvez vous inscrire à un espace de travail libre et jouer avec l'outil sur un serveur Oracle.

+0

Cet outil vous permet-il de vous connecter à une base de données existante sur un serveur distant? Il semble que ce soit juste pour créer une nouvelle base de données à partir de zéro. – dreeves

0

Je ne suis pas un programmeur PERL, mais voici une petite fonctionnalité supplémentaire que vous pourriez vouloir étudier. Jetez un oeil à la notion de tables externes dans Oracle. Vous créez une table avec une définition de quelque chose de semblable à ce qui suit: -

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; 

Notez cette déclaration DDL suppose que vous avez un répertoire déjà créé appelé « SOME_DIRECTORY_NAME ». Vous pouvez alors lancer des commandes DML pour obtenir des données dans ou hors de cette table, et une fois que la validation a été faite, les données sont toutes belles et soignées dans votre fichier my_file.csv. Après cela, faites votre magie PERL pour obtenir le fichier où vous le voulez.

7

Que diriez-vous quelque chose d'aussi simple que la création du fichier de sqlplus ...

set echo off heading off feedback off colsep ,; 
spool file.csv; 
select owner, table_name 
from all_tables; 
spool off; 
+0

Le caractère COLSEP peut-il être défini sur Tab? –

+0

échappe-t-il aux enregistrements qui ont une ou une nouvelle ligne? Ou est-ce que cette technique est conforme RFC? – mansu

2

Comme le dit dreeves, DatabaseLink fait ce trivial.La partie que je ne connais pas sont les détails de la déclaration JDBC. Mais voici comment les choses se présentent pour MySQL:

Puis à partir de Mathematica:

Needs["DatabaseLink`"] 
conn = OpenSQLConnection[JDBC["mysql","hostname/dbname"], Username->"user", Password->"secret"] 
Export["file.csv", SQLSelect[conn, "MyTable"]] 

Vous pouvez bien sûr affecter le SQLSelect à une première variable et l'examiner. Ce sera une liste de listes contenant les données de la table. Vous pouvez transmettre des conditions à SQLSelect, voir la documentation correspondante (par exemple, SQLColumn ["Name"] == "joeuser").

La seule chose spécifique à Oracle ici est comment vous faites la connexion, dans l'expression JDBC. C'est probablement quelque chose comme JDBC ["oracle", "hostname/dbname"].

Questions connexes