De alguma forma, parece que o SQL*Plus (pelo menos no Windows) não consegue localizar um script com um caminho relativo quando chamado com @@
e quando o caminho começa com um ponto simples ou duplo.
Por exemplo, sob x:\some\where
eu tenho a seguinte estrutura de diretórios:
script.sql
main-dir\main-sub-dir
call-script.sql
script.sql
Ou seja: dois script.sql
, mas em locais diferentes.
O conteúdo de script.sql
apenas abaixo x:\some\where
é simplesmente
prompt SCRIPT root
enquanto o script.sql
conteúdo do outro é
prompt SCRIPT main-dir/main-subdir
call-script.sql
lê
@@script.sql
@ script.sql
saída esperada
Se eu iniciar o SQL*Plus x:\some\where
e, em seguida, executar um
@main-dir/main-sub-dir/call-scripts
A saída será
SCRIPT main-dir/main-subdir
SCRIPT root
Isso é esperado, já que o single @
deve pesquisar caminhos de onde o SQL*Plus foi iniciado e @@
deve pesquisar caminhos do diretório do script que o contém.
saída inesperada
Agora , se eu mudar call-scripts.sql
assim:
@@./script.sql
@ ./script.sql
o double @@
parece mudar seu comportamento, pois procura caminhos de onde o SQL * Plus foi iniciado e a saída agora será
SCRIPT root
SCRIPT root
o que não é o que eu esperava.
Esse comportamento está documentado em algum lugar e, mais importante, como devo alterar call-scripts.sql
para que ele chame os caminhos relativos ( @@../../other-dir/other-sub-dir/script
) corretamente?
Sim, este é o Bug 2391334 que existe há muito tempo e provavelmente não será corrigido em um futuro próximo.
Uma maneira de contornar isso é "conhecer" o caminho para scripts sem realmente codificar esse caminho. Fazer isso no SQLPlus requer um truque - se você tentar executar um arquivo inexistente, receberá uma mensagem de erro que inclui o nome do caminho.
Então, aqui está uma demonstração disso em ação. Para imitar o seu cenário, eu tenho:
O que podemos fazer é adicionar alguns comandos à frente de call_script.sql que irão pegar o caminho. Parece um pouco estranho, mas você não precisa alterá-lo - é apenas uma coisa fixa que você cola
O que está acontecendo aqui é que estamos executando um script inexistente, que retorna:
"SP2-0310: não foi possível abrir o arquivo "path\_nonexistente_script.sql"
então, com um pouco de regexp, podemos extrair o caminho, armazená-lo em uma variável SQLPlus e usá-lo a partir desse ponto.
Portanto, a versão final do seu call_script.sql ficaria assim
e quando executamos isso, obtemos o seguinte
e pronto :-)