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


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 but est de faire ça sans pour autant modifier le script. Est-ce possible?


101
2017-09-22 23:33


origine


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


Réponses:


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

echo exit | sqlplus user/pass@connect @scriptname

128
2017-09-23 12:28



Cool! Savez-vous comment la "sortie" est ajoutée à la session sqlplus?
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
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
stackoverflow.com/questions/1639704/… et dba.stackexchange.com/a/65064/16892 Décrire des moyens de ne pas utiliser de mot de passe sur la ligne de commande ... - rogerdpack


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

12
2017-10-26 12:21



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


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

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

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


12
2018-03-18 21:20



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


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.)


11
2017-09-23 16:04



Notez que la réponse de Dave Costa fonctionne également: piping exit (ou quit) dans la commande sqlplus.
Merci pour le truc, je cherchais cette information!
La barre oblique signifie exécuter ce qui est dans la mémoire 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 "quitter" <Entrée> à une invite interactive de SQLPlus, il se fermera immédiatement. - Dave Costa


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 \.


6
2017-09-23 12:33





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: Mon mauvais, essayez à nouveau avec / nolog flag


4
2017-09-22 23:43



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 renvoyer 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 quand il est terminé. - 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 manière.
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.


Oui, c’est possible - générez un script wrapper qui configure SQLPlus de manière appropriée et inclut votre script (c.-à-d. @YourTargetScript.sql), puis fait une sortie.

Cela dit, je ne recommande pas cette approche du tout - SQLPlus a de nombreux pièges pour une utilisation programmatique; Lors de la rédaction de scripts shell utilisant Oracle, j’ai construit un wrapper Python (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 et d’autres goodies similaires), et cela a fonctionné. beaucoup mieux.


3
2017-09-22 23:40



Avec tout autre programme, je serais d'accord avec vous. MAIS j'ai constaté 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 que, parfois, une solution à ce problème consiste simplement à intégrer un interpréteur minimal à votre application. - ConcernedOfTunbridgeWells


Pour ceux qui s'inquiètent de 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:::::P11_QUESTION_ID:142212348066


1
2017-07-16 19:38



Bien que cela puisse théoriquement répondre à la question, ce serait préférable pour inclure les parties essentielles de la réponse ici, et fournir le lien pour référence. - Scott Pack


Dans votre script SQL, ajoutez EXIT. Voici un exemple mon fichier test.bat a:

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

mon fichier test.sql a: sélectionnez * du double; sortie


0
2018-06-19 20:40



C'est correct, 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


sortie | SQLPLUS / @ @

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


0
2017-11-20 06:57