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, em x:\some\where
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
under under" 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
resultado esperado
Se eu iniciar o SQL * Plus x:\some\where
e depois fizer 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 procurar caminhos a partir de onde o SQL * Plus foi iniciado e @@
deve procurar caminhos no diretório do script que o contém.
saída inesperada
Agora , se eu mudar call-scripts.sql
assim:
@@./script.sql
@ ./script.sql
o duplo @@
parece mudar seu comportamento, na medida em que pesquisa caminhos de onde o SQL * Plus foi iniciado, e a saída será agora
SCRIPT root
SCRIPT root
o que não é o que eu esperava.
Esse comportamento está documentado em algum lugar e, mais importante, como preciso alterar call-scripts.sql
para que ele chame caminhos relativos ( @@../../other-dir/other-sub-dir/script
) corretamente?
strace
. Aqui estão as chamadas relevantes: pastebin.com/cVK1QQu4 Observe que ele não tentou stat nem acessou os arquivos "script.sql" em outros diretórios antes de tentar abrir os vistos na saída do pastebin.Respostas:
Sim, esse é 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 codificá-lo. Para fazer isso no SQLPlus, é necessário 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 seu cenário, eu tenho:
O que podemos fazer é adicionar alguns comandos à frente do call_script.sql, que escolherão o caminho. Parece um pouco estranho, mas você não precisa alterá-lo - é apenas uma coisa fixa em 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 \ _nonexistent_script.sql "
portanto, 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 lá vai você :-)
fonte