D'une certaine manière, il semble que SQL * Plus (au moins sous Windows) ne parvienne pas à localiser un script avec un chemin d'accès relatif lorsqu'il est appelé avec @@
et lorsque le chemin d'accès commence par un point simple ou double.
Par exemple, sous x:\some\where
J'ai la structure de répertoires suivante:
script.sql
main-dir\main-sub-dir
call-script.sql
script.sql
C'est-à-dire: deux script.sql
mais à des endroits différents.
Le contenu d'un script.sql
peu moins x:\some\where
est simplement
prompt SCRIPT root
tandis que le script.sql
contenu de l'autre est
prompt SCRIPT main-dir/main-subdir
call-script.sql
lit
@@script.sql
@ script.sql
production attendue
Si je démarre SQL * Plus à partir de x:\some\where
, puis fais un
@main-dir/main-sub-dir/call-scripts
La sortie sera
SCRIPT main-dir/main-subdir
SCRIPT root
Cela est attendu, car le single @
est censé rechercher des chemins à partir de l'endroit où SQL * Plus a été démarré et @@
est censé rechercher des chemins à partir du répertoire du script contenant.
sortie inattendue
Maintenant , si je change call-scripts.sql
ainsi:
@@./script.sql
@ ./script.sql
le double @@
semble changer son comportement, en ce sens qu'il recherche les chemins d'où SQL * Plus a été démarré, et la sortie sera désormais
SCRIPT root
SCRIPT root
ce qui n'est pas ce que j'attendais.
Ce comportement est-il documenté quelque part et, plus important encore, comment dois-je changer call-scripts.sql
pour qu'il appelle @@../../other-dir/other-sub-dir/script
correctement les chemins relatifs ( )?
strace
. Voici les appels pertinents: pastebin.com/cVK1QQu4 Notez qu'il n'a pas tenté de stat ou d'accéder aux fichiers "script.sql" dans d'autres répertoires avant d'essayer d'ouvrir ceux vus dans la sortie pastebin.Réponses:
Oui, c'est le bug 2391334 qui existe depuis longtemps et qui ne sera probablement pas corrigé dans un avenir proche.
Une façon de contourner ce problème est de «connaître» le chemin des scripts sans réellement coder en dur ce chemin. Pour ce faire dans SQLPlus, il faut une astuce - si vous essayez d'exécuter un fichier inexistant, vous obtiendrez un message d'erreur qui inclut le nom du chemin.
Voici donc une démonstration de cela en action. Pour imiter votre scénario, j'ai:
Ce que nous pouvons faire, c'est ajouter quelques commandes à l'avant de call_script.sql qui reprendront le chemin. Cela semble un peu étrange, mais vous ne devriez pas avoir besoin de le changer - c'est juste une chose fixe que vous collez
Ce qui se passe ici, c'est que nous exécutons un script inexistant, qui renvoie:
"SP2-0310: impossible d'ouvrir le fichier" path \ _nonexistent_script.sql "
donc avec une petite expression régulière, nous pouvons extraire le chemin, le stocker dans une variable SQLPlus et ensuite l'utiliser à partir de ce moment.
Ainsi, la version finale de votre call_script.sql ressemblerait à ceci
et lorsque nous exécutons cela, nous obtenons ce qui suit
et voilà :-)
la source