AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 17347
Accepted
René Nyffenegger
René Nyffenegger
Asked: 2012-05-02 22:10:14 +0800 CST2012-05-02 22:10:14 +0800 CST 2012-05-02 22:10:14 +0800 CST

SQL*Plus, @ e caminhos relativos

  • 772

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\whereeu 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.sqlapenas abaixo x:\some\whereé simplesmente

prompt SCRIPT root

enquanto o script.sqlconteúdo do outro é

prompt SCRIPT main-dir/main-subdir

call-script.sqllê

@@script.sql
@ script.sql

saída esperada

Se eu iniciar o SQL*Plus x:\some\wheree, 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.sqlassim:

@@./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.sqlpara que ele chame os caminhos relativos ( @@../../other-dir/other-sub-dir/script) corretamente?

oracle sqlplus
  • 1 1 respostas
  • 20994 Views

1 respostas

  • Voted
  1. Best Answer
    Connor McDonald
    2017-03-25T23:25:42+08:002017-03-25T23:25:42+08:00

    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:

    c:\temp\demo
       script.sql
       maindir
          subdir
             call_script.sql
             script.sql
    

    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

    set termout off
    spool _path_finder.sql
    @@_nonexistent_script.sql
    spool off;
    
    var path varchar2(100);
    set serverout on
    declare
      output varchar2(1000) := regexp_replace(replace(q'{
    @_path_finder.sql
    }',chr(10)),'.*"(.*)".*','\1');
    begin 
      :path:=substr(output,1,length(output)-24);
    end;
    /
    col path new_val path
    select :path path from dual;
    set termout on
    

    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

    set termout off
    spool _path_finder.sql
    @@_nonexistent_script.sql
    spool off;
    
    var path varchar2(100);
    set serverout on
    declare
      output varchar2(1000) := regexp_replace(replace(q'{
    @_path_finder.sql
    }',chr(10)),'.*"(.*)".*','\1');
    begin 
      :path:=substr(output,1,length(output)-24);
    end;
    /
    col path new_val path
    select :path path from dual;
    set termout on
    prompt path was &path      
    
    @@&path\script.sql
    @&path\script.sql
    

    e quando executamos isso, obtemos o seguinte

    SQL> @maindir\mainsubdir\call_script
    path was maindir\mainsubdir
    script in subdir
    script in subdir
    

    e pronto :-)

    • 8

relate perguntas

  • Backups de banco de dados no Oracle - Exportar o banco de dados ou usar outras ferramentas?

  • ORDER BY usando prioridades personalizadas para colunas de texto

  • Interface sqlplus confortável? [fechado]

  • Como encontrar as instruções SQL mais recentes no banco de dados?

  • Como posso consultar nomes usando expressões regulares?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve