Ejecute el script Oracle SQL y salga de sqlplus.exe a través del símbolo del sistema

114

Me gustaría ejecutar un script de Oracle a través de SQL Plus a través de un símbolo del sistema de Windows. El script no contiene un comando de "salida", pero todavía me gustaría que SQL Plus salga, devolviendo el control al símbolo del sistema al completar el script. Mi objetivo es hacer esto sin modificar el guión. es posible?

JoshL
fuente
¿Está ejecutando esto con "sqlplus .... <scriptname" o "sqlplus ... @scriptname"? Encuentro diferentes comportamientos dependiendo de cuál haces en Unix.
runrig 01 de

Respuestas:

140

Otra forma es usar este comando en el archivo por lotes:

echo exit | sqlplus user/pass@connect @scriptname
Dave Costa
fuente
1
¡Bueno! ¿sabe cómo se agrega la "salida" a la sesión sqlplus?
66
El comando sqlplus ejecuta el script y luego intenta leer más comandos de la entrada estándar. Con esta canalización, la lectura de la entrada estándar leerá la cadena "exit" del comando echo, haciendo que sqlplus salga.
Dave Costa
Excelente, esto es exactamente lo que estaba buscando. ¡Gracias!
JoshL
44
Tenga cuidado de exponer su contraseña de nombre de usuario a través de la lista de procesos en Unix (ps -ef), pero estoy casi seguro de que funciona de la misma manera en Windows
Robert Merkwürdigeliebe
3
stackoverflow.com/questions/1639704/… y dba.stackexchange.com/a/65064/16892 describen algunas formas de no tener que usar una contraseña en la línea de comando ...
rogerdpack
13

Encontré que esta es la mejor solución y funciona en una terminal o dentro de un script:

echo @scriptname | sqlplus username/password@connect
usuario142847
fuente
1
Si bien esto técnicamente puede responder la pregunta, es sustancialmente un duplicado de otras respuestas y agrega poco valor. Además, ayudaría a otros si explicara lo que hacen estos comandos. ¡Gracias!
Chris S
55
Esto funcionó para mí y lo encuentro más elegante que la respuesta principal porque evita la 'salida'.
Bogdan Calmac
12

Al darse cuenta ahora de que su problema puede estar en el archivo sql en sí mismo, tenga en cuenta que es necesario decirle a sqlplus que salga. La forma en que hago esto es:

seleccione * de dual;

dejar;
/ /

(La barra oblicua es importante. Le dice a sqlplus que ejecute el estado (s) arriba).

Chris Noe
fuente
Tenga en cuenta que la respuesta de Dave Costa también funciona: salir de la tubería (o salir) en el comando sqlplus.
Gracias por el / truco, ¡estaba buscando esta información!
2
La barra diagonal significa ejecutar lo que está en el búfer de SQL. No ejecuta múltiples declaraciones, y no es necesario ejecutar comandos de control SQLPlus como "salir". Si escribe "salir" <Enter> en un mensaje interactivo de SQLPlus, se cerrará inmediatamente.
Dave Costa
12

La mejor manera de ocultar la información del usuario y las salidas es:

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

exitse suministra a la salida de sqlplus forzándolo a salir. -Ssuprime toda la salida del servidor que no sea la consulta sql en el script.

girish
fuente
2
Si usar ssh es dejar de fumar | en lugar de salir | para que no cierre su sesión ssh si el archivo se edita más tarde para salir o salir. Esto funciona si el archivo no se encuentra también.
Karl Henselin
6

También puede hacer esto en su script de shell.

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

Es posible que deba escapar del ";" con un \.

Ethan Post
fuente
3

Sí, es posible: genere una secuencia de comandos de contenedor que configure SQLPlus de manera adecuada, incluya su secuencia de comandos (es decir @YourTargetScript.sql) y luego salga.

Dicho esto, no recomiendo este enfoque en absoluto: SQLPlus tiene muchas trampas para uso programático; Al escribir scripts de shell en el pasado que usaban Oracle, construí un envoltorio de Python a su alrededor (agregando un comportamiento de manejo de errores más razonable, separación sensata de salida entre stdout / stderr, soporte de salida CSV nativo y otros beneficios similares), y eso funcionó mucho mejor.

Charles Duffy
fuente
Con cualquier otro programa, estaría de acuerdo con usted. PERO descubrí que SQLPlus me dio un contexto útil en una consulta incorrecta que otros entornos (en mi caso Perl / DBI / DBD :: Oracle) no. Si está haciendo un manejo cuidadoso de los errores, puede valer la pena.
Además, dependiendo de cuánto control tenga sobre el servidor, puede o no asumir la disponibilidad de algo más que shell y SQLPlus. Muchas tiendas Unix más robustas que ejecutan Solaris, HP / UX, AIX y similares utilizan instalaciones muy simples y no le permitirán instalar nada más en la caja. Tenga en cuenta que, a veces, una solución alternativa a esto es simplemente combinar un intérprete mínimo con su aplicación.
Preocupado por
3

Me gusta esto:

sqlplus / nolog userid / password @ tnsname @filename

Si coloca esto en un archivo por lotes, el control continuará con las declaraciones que lo siguen.

EDITAR: Mi error, inténtalo de nuevo con / nolog flag

Chris Noe
fuente
Lamentablemente, esto no funciona. Cuando ejecuto el archivo por lotes, SqlPlus espera en el indicador SQL> la entrada del usuario en lugar de devolver el control al símbolo del sistema.
JoshL
Lo siento, esto tampoco funciona. / nolog permite que sqlplus se inicie sin iniciar sesión. No tiene nada que ver con salir de un script cuando se completa.
JoshL
Hmm, estoy empezando a preguntarme sobre las diferencias ambientales. Tengo numerosos scripts de murciélagos que usan sqlplus de esta manera.
Chris, ¿podrías dar un ejemplo de trabajo? Simplemente algo simple que ejecuta un "select * from dual" o algo así ... He creado ejemplos para probar sus sugerencias, en vano. Recuerda que esto está en Windows.
JoshL
Josh, mira la nueva respuesta a continuación.
0

En su secuencia de comandos SQL agregue EXIT. Aquí hay un ejemplo de que mi archivo test.bat tiene lo siguiente:

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

mi archivo test.sql tiene lo siguiente: select * from dual; salida


fuente
Eso está bien, pero no cumple con el requisito de hacerlo sin modificar el script para incluir una declaración de salida / salir. La intención es que estos scripts puedan ser ejecutados por un DBA desde SQL Plus, pero también pueden ejecutarse desde un archivo por lotes.
JoshL
0

salir | SQLPLUS / @ @

Esta es la solución correcta, he intentado que funcione


fuente