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?

JoshL
la source
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
Dave Costa
la source
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
utilisateur142847
la source
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.)

Chris Noé
la source
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.

girish
la source
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 \.

Ethan Post
la source
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.

Charles Duffy
la source
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

Chris Noé
la source
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.
1

Pour ceux qui s’inquiètent pour la sécurité de l’inclusion de votre mot de passe dans le script, AskTom propose un article sur "identifié en externe" http: //asktom.oracle.com/pls/apex/f? P = 100: 11: 0 :::: P11_QUESTION_ID: 142212348066

utilisateur128494
la source
2
Bien que cela puisse théoriquement répondre à la question, il serait préférable d’inclure ici les parties essentielles de la réponse et de fournir le lien à titre de référence.
Scott Pack
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


la source
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


la source