Exécutez le script Oracle SQL et quittez sqlplus.exe via une invite de commande.


114

Je souhaite exécuter un script Oracle via SQL Plus via une invite de commande Windows. Le script ne contient pas de commande "exit", mais j'aimerais quand même que SQL Plus se ferme, rendant le contrôle à l'invite de commande à la fin du script. Mon objectif est de le faire sans modifier le script. Est-ce possible?


Est-ce que vous l'exécutez avec "sqlplus .... <nom_script" ou "sqlplus ... @scriptname" ?? Je trouve différents comportements en fonction de celui que vous utilisez sous Unix.
runrig

Réponses:


140

Une autre façon consiste à utiliser cette commande dans le fichier de commandes:

echo exit | sqlplus user/pass@connect @scriptname

1
Cool! Savez-vous comment la "sortie" est ajoutée à la session sqlplus?

6
La commande sqlplus exécute le script, puis tente de lire davantage de commandes à partir de l'entrée standard. Avec ce pipeline, la lecture de l'entrée standard lira la chaîne "exit" de la commande echo, ce qui entraînera la fermeture de sqlplus.
Dave Costa

Excellent - c'est exactement ce que je cherchais. Merci!
JoshL

4
Attention, vous exposez votre mot de passe utilisateur à travers la liste de processus sur unix (ps -ef), mais je suis presque sûr que cela fonctionne de la même manière sous Windows
Robert Merkwürdigeliebe,

3
stackoverflow.com/questions/1639704/… et dba.stackexchange.com/a/65064/16892 décrivent quelques façons de ne pas avoir à utiliser de mot de passe sur la ligne de commande ...
rogerdpack

13

J'ai trouvé que c'était la meilleure solution et cela fonctionne dans un terminal ou dans un script:

echo @scriptname | sqlplus username/password@connect

1
Bien que cela puisse techniquement répondre à la question, il s'agit essentiellement d'un duplicata d'autres réponses et ajoute peu de valeur. En outre, cela aiderait les autres si vous expliquiez ce que font ces commandes. Je vous remercie!
Chris S

5
Cela a fonctionné pour moi et je la trouve plus élégante que la première réponse, car elle évite la «sortie».
Bogdan Calmac

12

En réalisant maintenant que votre problème peut provenir du fichier SQL lui-même, sachez qu'il faut dire à sqlplus de quitter. Voici comment je le fais:

sélectionnez * du double;

quitter;
/

(La barre oblique est importante. Elle indique à sqlplus d’exécuter les statistiques au-dessus de celle-ci.)


Notez que la réponse de Dave Costa fonctionne également: piping exit (ou quit) dans la commande sqlplus.

Merci pour le / astuce, je cherchais cette information!

2
La barre oblique signifie exécuter ce qui se trouve dans le tampon SQL. Il n'exécute pas plusieurs instructions et il n'est pas nécessaire d'exécuter des commandes de contrôle SQLPlus telles que "quit". Si vous tapez "quit" <Entrée> à une invite interactive de SQLPlus, il se fermera immédiatement.
Dave Costa

12

Le meilleur moyen de masquer les informations utilisateur et les sorties est:

exit | sqlplus -S user/pwd@server @script.sql

exitest fourni à la sortie de sqlplus le forçant à quitter. -Ssupprime toute la sortie du serveur autre que requête SQL dans le script.


2
Si utiliser ssh doit cesser | au lieu de sortie | de sorte qu'il ne ferme pas votre session ssh si le fichier est édité ultérieurement pour y avoir une sortie ou un arrêt. Cela fonctionne si le fichier n'est pas trouvé aussi.
Karl Henselin

6

Vous pouvez également le faire dans votre script shell.

sqlplus /nolog <<EOF
connect user/pass
@run_some_file.sql
select * from dual;
EOF

Vous pourriez avoir besoin d'échapper à la ";" avec un \.


3

Oui, c'est possible - générez un script wrapper qui configure correctement SQLPlus, inclut votre script (c'est-à-dire @YourTargetScript.sql), puis effectue une sortie.

Cela dit, je ne recommande pas cette approche du tout - SQLPlus a de nombreux pièges pour une utilisation programmatique; Lors de l'écriture de scripts shell dans le passé qui utilisaient Oracle, j'ai construit un wrapper Python autour de celui-ci (en ajoutant un comportement de gestion des erreurs plus raisonnable, une séparation rationnelle de la sortie entre stdout / stderr, un support de sortie CSV natif, etc.), et cela a fonctionné. beaucoup mieux.


Avec tout autre programme, je serais d'accord avec vous. MAIS j'ai trouvé que SQLPlus m'avait fourni un contexte utile pour une requête incorrecte, contrairement à d'autres environnements (dans mon cas, Perl / DBI / DBD :: Oracle). Si vous faites attention à la gestion des erreurs, cela peut en valoir la peine.

En outre, en fonction de votre contrôle sur le serveur, vous ne pourrez peut-être pas assumer la disponibilité d'autres éléments que shell et SQLPlus. Un grand nombre de magasins unix plus stigiles exécutant Solaris, HP / UX, AIX, etc., utilisent des installations nues et ne vous permettent pas d'installer autre chose sur la boîte. Notez qu'une solution de contournement à cela consiste parfois simplement à intégrer un interpréteur minimal à votre application.
ConcernedOfTunbridgeWells

3

Comme ça:

sqlplus / nolog id_utilisateur / mot_de_passe @ nom_ns @ nom_fichier

Si vous mettez cela dans un fichier de commandes, le contrôle continuera avec les instructions qui le suivent.

EDIT: My bad, essayez à nouveau avec / nolog flag


Malheureusement, ça ne marche pas. Lorsque j'exécute le fichier de commandes, SqlPlus attend l'invite SQL> pour la saisie de l'utilisateur au lieu de rendre le contrôle à l'invite de commande.
JoshL

Désolé, cela ne fonctionne pas non plus. / nolog permet à sqlplus de démarrer sans se connecter. Cela n'a rien à voir avec la sortie d'un script à la fin.
JoshL

Hmm, je commence à m'interroger sur les différences d'environnement. J'ai de nombreux scripts de chauve-souris qui utilisent sqlplus de cette façon.

Chris, pourriez-vous donner un exemple concret? Juste quelque chose de simple qui exécute un "select * from dual" ou quelque chose ... J'ai créé des exemples pour essayer vos suggestions, en vain. Rappelez-vous que c'est sous Windows.
JoshL

Josh, voir la nouvelle réponse ci-dessous.


0

Dans votre script SQL, ajoutez EXIT. Voici l'exemple de mon fichier test.bat:

sqlplus utilisateur / pwd @ server @ test.SQL> myLOG.LOG

mon fichier test.sql a: select * from dual; sortie


C'est bien, mais ne répond pas à l'exigence de le faire sans modifier le script pour inclure une instruction exit / quit. L'intention est que ces scripts puissent être exécutés par un administrateur de base de données SQL Plus, mais également à partir d'un fichier de commandes.
JoshL

0

sortie | SQLPLUS / @ @

C'est la bonne solution, j'ai essayé ça marche

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.