probleme avec sqlplus

probleme avec sqlplus - Perl - Programmation

Marsh Posté le 01-12-2006 à 14:22:43    

salut,
 
Je souhaiterais utiliser sqlplus dans perl, comment pourrai je faire ?
Je voudrais faire une requete select x from matable,
et recuperer le code retour afin de voir que ma requete c'est bien derouler.
 
Est ce possible ?
sachant que je ne veux pas utiliser le module DBI
 
Merci

Reply

Marsh Posté le 01-12-2006 à 14:22:43   

Reply

Marsh Posté le 01-12-2006 à 14:24:51    

Et pourquoi ne veux-tu pas utiliser le module DBI ? :??:

Reply

Marsh Posté le 01-12-2006 à 14:24:51    

beurk
 
`sqlplus`

Reply

Marsh Posté le 01-12-2006 à 14:38:26    

je peux pas,j'ai des soucis et par rapport à l'outil que je vais utiliser ensuite, il faut que j'utilise sqlplus
 
j'ai essayer cela

Code :
  1. system(" sqlplus -s user/pass\@mabase select dummy from dual;" );


 
quandd j'appel mon script j'ai ça en sortie

Citation :


SQL*Plus: Release 10.2.0.2.0 - Production
 
Copyright (c) 1982, 2005, Oracle.  All Rights Reserved.
 
Usage 1: sqlplus -H | -V
 
    -H             Displays the SQL*Plus version and the
                   usage help.
    -V             Displays the SQL*Plus version.
 
Usage 2: sqlplus [ [<option>] [<logon>] [<start>] ]
 
  <option> is: [-C <version>] [-L] [-M "<options>"] [-R <level>] [-S]
 
    -C <version>   Sets the compatibility of affected commands to the
                   version specified by <version>.  The version has
                   the form "x.y[.z]".  For example, -C 10.2.0
    -L             Attempts to log on just once, instead of
                   reprompting on error.
    -M "<options>" Sets automatic HTML markup of output.  The options
                   have the form:
                   HTML [ON|OFF] [HEAD text] [BODY text] [TABLE text]
                   [ENTMAP {ON|OFF}] [SPOOL {ON|OFF}] [PRE[FORMAT] {ON|OFF}]
    -R <level>     Sets restricted mode to disable SQL*Plus commands
                   that interact with the file system.  The level can
                   be 1, 2 or 3.  The most restrictive is -R 3 which
                   disables all user commands interacting with the
                   file system.
    -S             Sets silent mode which suppresses the display of
                   the SQL*Plus banner, prompts, and echoing of
....


 
??

Reply

Marsh Posté le 01-12-2006 à 14:40:16    

[:moule_bite]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 01-12-2006 à 16:22:16    

déjà, tu commences par tester ta commande système sans l'envelopper dans du perl, tu verras que tu auras le mm problème : dans ce cas là, voir comment on utilise sqlplus
 
ensuite, pour passer des requêtes sql, je te conseiller d'utiliser DBI avec DBD Oracle, cela te simplifieras la tâche

Reply

Marsh Posté le 01-12-2006 à 16:37:25    

en faite j'ai fait cela

Code :
  1. $result = system ('echo  "select * from dual;" | sqlplus -s /nolog >> /dev/null user/pass@mabase') ;
  2. if ($result == 0)
  3. {
  4. print "La connexion fonctionne\n";
  5. }
  6. else
  7. {
  8. print "La  connexion ne fonctionne pas\n";
  9. }


 
sa fonctionne mais le probleme c'est le code de retour, il est toujours = 0 en cas de succes ou d'echec;
 
donc je pensai faire cela

Code :
  1. system ("sqlplus username/password@instance <<-!EOSQL
  2.          WHENEVER SQLERROR  exit 5
  3.          select dummy from dual;
  4.          exit 0
  5. !EOSQL
  6. ';" );


 
mais le probleme est que system ne prend en compte que ce qu'il y a sur la premiere ligne et pas les autres

Reply

Marsh Posté le 01-12-2006 à 16:55:00    

Quand tu parles de succès ou d'échec, c'est celui de la connexion ou celui de la requête ?
 
Parce que si la requête échoue mais que la connexion s'est bien déroulée, je ne sais pas comment se comporte le client oracle, mais avec celui de sybase par exemple, il retourne bien 0 (ce qui est logique : je me suis bien connecté et j'ai bien exécuté ta requête, même si elle chie)
 
Vérifie également que sqlplus ramène bien un code retour différent de 0 s'il ne parvient pas à initialiser une connexion.
 
Autrement : mais pourquoi tu te prends la tête avec le client oracle en ligne de commande au lieu d'utiliser DBI ? [:mlc]


Message édité par Elmoricq le 01-12-2006 à 16:57:57
Reply

Marsh Posté le 01-12-2006 à 17:13:46    

avec DBI je peux effecuter des requete aussi ?

Reply

Marsh Posté le 01-12-2006 à 17:15:21    

C'est le but. [:el g]
 
Et t'as pas besoin d'écrire un parser pour interpréter le résultat de tes select...

Reply

Marsh Posté le 01-12-2006 à 17:15:21   

Reply

Marsh Posté le 01-12-2006 à 17:25:30    

ok merci
je vais essayer de trouver de la doc la dessus
je viens de voir sur cpan
t a la doc sur comment te connecter
mais c'est pas tres documenter sur comment faire des requetes
 
sinon je viens de ressayer le code que j'ai fait plus haut
en cas de reussite j'ai bien un code de retour 0
et en cas d'echec j'ai un code different de 0;
j'ai tester en mettant une table qui n'existe pas,un faux password, une fausse base; un faux user;
et dans tous ces  cas j'ai un code different de 0.

Reply

Marsh Posté le 04-12-2006 à 09:51:46    

bon allez on résume :
 
- la requête sql, qu'elle plante ou non, retournera 0 à la sortie de sqlplus
- le fait d'appeler des commandes systèmes n'est pas propre, et il convient d'abord d'essayer de les faire avec ton shell avant de l'encapsuler dans du perl, cela t'évitera bien des soucis
- utiliser sqlplus pour faire des requêtes n'est pas judicieux, tu vas devoir parser ton résultat et comme beaucoup le savent, la sortie écran de sqlplus n'est pas géniale
- utilise DBI et DBD Oracle, tu as ce qu'il faut sur http://search.cpan.org/~pythian/DB [...] /Oracle.pm
- pour utiliser DBI et cie, il vaut mieux connaître les bases syntaxiques sous perl (utiliser des tableaux, les boucles, etc.)
- tu as de bons exemples de connexions oracle via perl ici : http://www.orafaq.com/faqperl.htm

Reply

Marsh Posté le 04-12-2006 à 10:11:17    

Vouloir utiliser sqlplus quand on dispose dans le langage qu'on utilise d'un module d'accès à la base de données, ça mérite le fouet, voire la pendaison par les burnes.
 
sqlplus, c'est le pire moyen d'accéder à une base pour y faire des requêtes. Notamment parce que sqlplus formate par défaut sa sortie pour l'écran, en faisant tout un tas de craditudes qu'il faut reconfigurer à la main.
 
Se taper la doc de sqlplus ça sera au moins aussi pénible que d'utiliser DBI, alors oublie sqplus et utilise DBI. Par égard pour les pauvres devs qui se tapent du Korn shell et qui ont pas le choix, eux.

Reply

Marsh Posté le 04-12-2006 à 10:25:52    

ne lui fait pas peur non plus :o moi j'aime bien utiliser sqlplus, ca dépanne vachement quand t'as besoin de faire des trucs vite fait genre voir une vue système

Reply

Marsh Posté le 04-12-2006 à 10:34:28    

sqlplus c'est pratique en ligne de commande, je suis d'accord.
Son utilisation dans le but de faire un programme est nettement plus pénible. Le seul endroit où il est indispensable c'est dans un script shell. Partout où il y a une solution plus évoluée, l'emploi de sqlplus devrait être banni.
 

cat << SQLREQ
SET TAB OFF
SET LINESIZE 200
SET FEEDBACK OFF
SET PAGESIZE 0
SET HEADING OFF
WHENEVER SQLERROR EXIT SQL.SQLCODE
SELECT LINE FROM DIV.DIV_BIP_EXPORT_LINES ORDER BY CODE, TYPE, ETS
SQLREQ | sqlplus -s / AS SYSDBA


 
[:moule_bite]

Reply

Marsh Posté le 09-01-2007 à 10:04:18    

ok,
je me suis mis au DBI et je viens de faire un test
je me connect à ma base oracle et j'effectue une requete toute simple;
J'ai ce message d'erreur que je ne pije pas ??

Citation :


DBD::Oracle::st fetchrow_array failed: ERROR no statement executing (perhaps you need to call execute first) [for statement ``select * from dual'' with params: ]) at /home/blionnel/bin/test.pl line 18.
 


Reply

Marsh Posté le 09-01-2007 à 10:05:34    

voila mon code

Code :
  1. use strict;
  2. use DBI;
  3. my $dbh = DBI->connect("dbi:Oracle:$dbname", $user, $passwd) ;
  4. my $requete ="select * from dual";
  5. my $sth=$dbh->prepare($requete);
  6. while (my @enr = $sth -> fetchrow_array) {
  7. print "@enr\n";
  8. }
  9. $sth->execute();
  10. $sth -> finish;
  11. $dbh -> disconnect;

Reply

Marsh Posté le 09-01-2007 à 10:13:39    

dans le message d'erreur c'est quand même explicite :o
il faut faire un

Code :
  1. $sth->execute()

avant de faire un fetchrow_array
 
la logique est toute simple :
- se connecter à la base
- préparer sa requête (prepare())
- exécuter sa requête (execute())
- récupérer les résultats (fetch_array())
- terminer les opérations (finish)

Reply

Marsh Posté le 09-01-2007 à 10:14:41    

ouai je viens de voir et de le modifier à l'instant
desolé du poste , j'etai mal reveillé

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed