De alguna manera, parece que SQL * Plus (al menos en Windows) no puede ubicar un script con una ruta relativa cuando se llama con @@
y cuando la ruta comienza con un punto simple o doble.
Por ejemplo, en x:\some\where
Tengo la siguiente estructura de directorios:
script.sql
main-dir\main-sub-dir
call-script.sql
script.sql
Es decir: dos script.sql
pero en diferentes lugares.
El contenido de script.sql
justo debajo x:\some\where
es simplemente
prompt SCRIPT root
mientras que el script.sql
contenido del otro es
prompt SCRIPT main-dir/main-subdir
call-script.sql
lee
@@script.sql
@ script.sql
Rendimiento esperado
Si inicio SQL * Plus desde x:\some\where
y luego hago un
@main-dir/main-sub-dir/call-scripts
La salida será
SCRIPT main-dir/main-subdir
SCRIPT root
Esto se espera, ya que @
se supone que el single busca rutas desde donde se inició SQL * Plus y @@
se supone que busca rutas desde el directorio del script que lo contiene.
salida inesperada
Ahora , si cambio call-scripts.sql
así:
@@./script.sql
@ ./script.sql
el doble @@
parece cambiar su comportamiento, ya que busca rutas desde donde se inició SQL * Plus, y la salida ahora será
SCRIPT root
SCRIPT root
que no es lo que esperaba
¿Está este comportamiento documentado en alguna parte y, lo que es más importante, cómo debo cambiar call-scripts.sql
para que llame @@../../other-dir/other-sub-dir/script
correctamente a las rutas relativas ( )?
strace
. Estas son las llamadas relevantes: pastebin.com/cVK1QQu4 Tenga en cuenta que no intentó realizar estadísticas ni acceder a los archivos "script.sql" en ningún otro directorio antes de intentar abrir los que se ven en la salida de pastebin.Respuestas:
Sí, este es el error 2391334 que ha existido durante mucho tiempo, y probablemente no se solucionará en el futuro cercano.
Una forma de evitar esto es "conocer" la ruta de los scripts sin codificar realmente esa ruta. Hacer esto en SQLPlus requiere un truco: si intenta ejecutar un archivo inexistente, recibirá un mensaje de error que incluye el nombre de la ruta.
Así que aquí hay una demostración de eso en acción. Para imitar su escenario, tengo:
Lo que podemos hacer es agregar algunos comandos al frente de call_script.sql que tomarán la ruta. Parece un poco extraño, pero no deberías necesitar cambiarlo, es solo una cosa fija que pegas
Lo que está sucediendo aquí, es que estamos ejecutando un script inexistente, que devuelve:
"SP2-0310: no se puede abrir el archivo" ruta \ _nonexistent_script.sql "
así que con un poco de expresión regular podemos extraer la ruta, almacenarla en una variable SQLPlus y luego usarla a partir de ese momento.
Entonces la versión final de su call_script.sql se vería así
y cuando corremos eso, obtenemos lo siguiente
y ahí tienes :-)
fuente