Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Outils > Sql*Plus
Sql*Plus Forum d'entraide sur Oracle Sql*Plus
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/10/2007, 13h59   #1
Membre du Club
 
Inscription : juin 2006
Messages : 206
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 206
Points : 47
Points : 47
Par défaut script spool sqlplus pour exportation

Bonjour à tous,

Je cherche à faire un infocentre sur une base "répliquée" (hyperfile) qui permettra d'exécuter des requêtes lourdes sans impacter les performances de la base principale (oracle 9i).

En détails : il faut que je fasse un export des tables d'une base oracle 9i au format texte. Ces fichiers textes, sont récupérés et importer dans une base hyperfile (windev). On se casse la tête comme ça parce qu'on a pas les licences nécessaires.

En gros, la procédure consiste à faire un script shell qui me permet d'exécuter sqlplus avec un appel à un fichier script_export.sql

ce fichier ressemble à ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
-- pas de sortie pour l'affichage de la commande
SET echo off
-- pas de sortie pour montrer le changement de requete avec la variable
SET ver off
-- pas de sortie sur le terminal
SET termout off
-- pas d entete de colonne
SET heading off
-- pas de retour du nombre de lignes de résultat
SET feedback off
-- largeur de la ligne
SET linesize 200
-- pas de saut de ligne
SET newpage NONE
-- enleve les espaces en fin de ligne
SET trimspool ON
SET colsep '	'
 
-- format de la colonne codebase
COLUMN to_char(base) format A3;
-- sortie fichier texte
define base=&1;
spool table_toto.txt;
SELECT code,to_char(base),libelle,type FROM toto WHERE &base;
spool off;
Mon script shell :
Code :
1
2
3
4
5
 
connexion=instance/mdp@ip
clause_where="base=28 or base=29"
#connexion sqlplus
sqlplus $connexion @$script_export.sql $clause_where;
Mon problème c'est que je souhaiterais envoyer un string "complet" comme variable.
Pour le moment, j'obtiens :
Code :
1
2
 
SELECT code,to_char(base),libelle,type FROM toto WHERE base=28;
il me manque le
Merci de m'avoir lu
crazykangourou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2007, 14h40   #2
Membre du Club
 
Inscription : mars 2007
Messages : 76
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 76
Points : 55
Points : 55
Bonjour,

A mon avis, SQL PLUS considére que 'or' est un deuxieme argument et 'base=29' comme le troisieme argument.
Dans ton script SQL essaie pour vérifier:
define base=&1;
define base2=&2;
define base3=&3;
spool table_toto.txt;
SELECT code,to_char(base),libelle,type FROM toto WHERE &base &base2 &base3;

Bon courage.

Raphaël
rapha51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2007, 15h01   #3
Membre du Club
 
Inscription : juin 2006
Messages : 206
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 206
Points : 47
Points : 47
Par défaut @rapha51

En effet ton intuition est la bonne,

Mais comment faire pour passer la string en entier, car comme vous pouvez vous en douter, ma clause where pourra être une grande string

Merci d'avance
crazykangourou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2007, 15h57   #4
Membre du Club
 
Inscription : mars 2007
Messages : 76
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 76
Points : 55
Points : 55
Essaie un truc du genre :

sqlplus $connexion @$script_export.sql "$clause_where";
ou
sqlplus $connexion @$script_export.sql '$clause_where';

Raphaël
rapha51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2007, 16h18   #5
Membre du Club
 
Inscription : juin 2006
Messages : 206
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 206
Points : 47
Points : 47
Meme sanction meme punition pour les double quotes "
et pour les simples quotes ', j'obtiens l'erreur suivante :
Code :
1
2
3
4
5
 
SELECT code,to_char(codebase),libelle,type FROM absence WHERE $clause_where
                                                              *
ERREUR à la ligne 1 :
ORA-00911: Caractère non valide
crazykangourou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2007, 16h21   #6
Membre du Club
 
Inscription : mars 2007
Messages : 76
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 76
Points : 55
Points : 55
essaie de remplacer clause_where="base=28 or base=29" par clause_where=base=28 or base=29
rapha51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2007, 16h41   #7
Membre du Club
 
Inscription : juin 2006
Messages : 206
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 206
Points : 47
Points : 47
Meme en faisant directement ca :
Code :
1
2
 
sqlplus $connexion @$script_export.sql "base=28 or base=29";
ca ne marche pas...
Autant dire qu'on n'est pas sortie de l'auberge
crazykangourou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2007, 16h46   #8
Membre du Club
 
Inscription : mars 2007
Messages : 76
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 76
Points : 55
Points : 55
Ben moi pour tester j'ai modifié ton script SQL :
spool table_toto.txt;
PROMPT &1;
spool off;

et j'ai bien base=28 or base=29 dans le fichier table_toto.txt

par contre j'utilise un fichier.bat
rapha51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2007, 17h07   #9
Membre du Club
 
Inscription : juin 2006
Messages : 206
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 206
Points : 47
Points : 47
merci rapha51 pour tes réponses rapides :

J'ai testé aussi, mais ca ne marche que dans le cas du prompt à l'intérieure même du script (d'ailleurs , je ne sais pas comment récupérer la variable dans ce cas là...)
Il attend le retour chariot et donc prend toute la chaine.

La question est : comment simuler le prompt depuis un script extérieur

Merci d'avance
crazykangourou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2007, 17h21   #10
Membre du Club
 
Inscription : juin 2006
Messages : 206
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 206
Points : 47
Points : 47
Par défaut ca y'est !!!

Pour résoudre le problème,
J'ai fait directement :
Code :
1
2
3
 
--define codebase=&1;
SELECT code,to_char(codebase),libelle,type FROM absence WHERE &1;
Donc pas de define

Par contre je suis toujours interessé pour le prompt :
J'ai essayé ca :
Code :
1
2
3
 
prompt &1;
SELECT code,to_char(codebase),libelle,type FROM absence WHERE &1;
J'ai l'erreur suivante :

Code :
1
2
3
4
5
6
7
8
9
10
 
Entrez une valeur pour 1 : base=28 OR base=29
base=28 OR base=29
Entrez une valeur pour 1 : 
ancien   1 : SELECT code,to_char(base),libelle,type FROM absence WHERE &1
nouveau   1 : SELECT code,to_char(base),libelle,type FROM absence WHERE
SELECT code,to_char(base),libelle,type FROM absence WHERE
                                                             *
ERREUR à la ligne 1 :
ORA-00921: Fin inattendue d'une commande SQL
crazykangourou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2007, 17h23   #11
Membre du Club
 
Inscription : mars 2007
Messages : 76
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 76
Points : 55
Points : 55
effetivement y a un truc de bizarre :
define base=&1;
spool table_toto.txt;
PROMPT &base;
PROMPT &1;
SELECT code,to_char(base),libelle,type FROM toto WHERE &base;
SELECT code,to_char(base),libelle,type FROM toto WHERE &1;
spool off;

donne

base=28
base=28 or base=29
SELECT code,to_char(base),libelle,type FROM toto WHERE base=28
*
ERREUR à la ligne 1 :
ORA-00942: Table ou vue inexistante


SELECT code,to_char(base),libelle,type FROM toto WHERE base=28 or base=29
*
ERREUR à la ligne 1 :
ORA-00942: Table ou vue inexistante

Pourquoi la variable base ne contient pas toute la chaine passée en paramètre : je vois pas trop...
rapha51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2007, 17h45   #12
Membre du Club
 
Inscription : juin 2006
Messages : 206
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 206
Points : 47
Points : 47
En fait sous linux, pas besoin de mettre le prompt :

Donc toutes cette série d'erreur est liée j'ai l'impression :
le code suivant ne marche pas
Code :
1
2
3
 
prompt &1;
SELECT code,to_char(codebase),libelle,type FROM absence WHERE &1;
alors que celui ci fonctionne

Code :
1
2
 
SELECT code,to_char(codebase),libelle,type FROM absence WHERE &1;
Bien sur à l'appelle du script, on fait
Code :
1
2
 
sqlplus $connexion @$script_export.sql
Il n'y a pas de clause where bien sûr

Donc ce qui me fait dire qu'a chaque fois qu'il y a un &, il y a une réinitialisation de la variable
crazykangourou est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h02.


 
 
 
 
Partenaires

Hébergement Web