Execute o script Oracle SQL e saia do sqlplus.exe via prompt de comando

114

Eu gostaria de executar um script Oracle através do SQL Plus por meio de um prompt de comando do Windows. O script não contém um comando "exit", mas eu ainda gostaria que o SQL Plus saísse, retornando o controle ao prompt de comando na conclusão do script. Meu objetivo é fazer isso sem modificar o script. Isso é possível?

JoshL
fonte
Você está executando isso com "sqlplus .... <scriptname" ou "sqlplus ... @scriptname" ?? Eu encontro comportamentos diferentes, dependendo do que você faz no Unix.
Runrig

Respostas:

140

Outra maneira é usar este comando no arquivo em lotes:

echo exit | sqlplus user/pass@connect @scriptname
Dave Costa
fonte
1
Legal! você sabe como a "saída" é anexada à sessão sqlplus?
6
O comando sqlplus executa o script e tenta ler mais comandos da entrada padrão. Com esse pipeline, a leitura da entrada padrão lerá a string "exit" no comando echo, fazendo com que o sqlplus saia.
Dave Costa
Excelente - era exatamente isso que eu estava procurando. Obrigado!
JoshL
4
Cuidado que você expõe sua senha nome de usuário através da lista proces no UNIX (ps -ef), mas eu tenho quase certeza de que ele funciona da mesma maneira no Windows
Robert Merkwürdigeliebe
3
stackoverflow.com/questions/1639704/... e dba.stackexchange.com/a/65064/16892 descrever algumas maneiras para não ter de usar a senha na linha de comando ...
rogerdpack
13

Eu achei que essa era a melhor solução e funciona em um terminal ou em um script:

echo @scriptname | sqlplus username/password@connect
user142847
fonte
1
Embora isso possa responder tecnicamente à pergunta, é substancialmente uma duplicata de outras respostas e agrega pouco valor. Além disso, ajudaria outras pessoas se você explicasse o que esses comandos estão fazendo. Obrigado!
Chris S
5
Isso funcionou para mim e acho mais elegante que a resposta principal, pois evita a 'saída'.
Bogdan Calmac
12

Percebendo agora que seu problema pode estar no próprio arquivo sql, saiba que é necessário informar o sqlplus para sair. A maneira como faço isso é:

selecione * de dual;

Sair;
/

(A barra é importante. Diz ao sqlplus para executar o (s) statemet (s) acima dela.

Chris Noe
fonte
Observe que a resposta de Dave Costa também funciona: canalizar saída (ou sair) no comando sqlplus.
Obrigado pelo / truque, eu estava procurando por esta informação!
2
A barra significa executar o que está no buffer SQL. Ele não executa várias instruções e não é necessário executar comandos de controle do SQLPlus como "quit". Se você digitar "encerrar" <Enter> em um prompt interativo do SQLPlus, ele será encerrado imediatamente.
Dave Costa
12

A melhor maneira de ocultar informações e saídas do usuário é:

exit | sqlplus -S user/pwd@server @script.sql

exité fornecido à saída do sqlplus, forçando-o a sair. -Ssuprime toda a saída do servidor, exceto a consulta sql no script.

girish
fonte
2
Se usar ssh é para sair | em vez de sair | para que não feche sua sessão ssh se o arquivo for editado posteriormente para ter uma saída ou uma saída. Isso funciona se o arquivo também não for encontrado.
Karl Henselin
6

Você também pode fazer isso no seu shell script.

sqlplus /nolog <<EOF
connect user/pass
@run_some_file.sql
select * from dual;
EOF

Você pode precisar escapar do ";" com um \.

Ethan Post
fonte
3

Sim, é possível - gerar um script que configura SQLPlus adequadamente, inclui o seu roteiro (ie. @YourTargetScript.sql), E em seguida faz uma saída.

Dito isto, eu não recomendo esta abordagem - o SQLPlus possui muitas dicas para uso programático; ao escrever scripts de shell no passado que usavam o Oracle, criei um wrapper Python (adicionando um comportamento mais razoável de tratamento de erros, separação sã de saída entre stdout / stderr, suporte nativo à saída de CSV e outros itens) e funcionou muito melhor.

Charles Duffy
fonte
Com qualquer outro programa, eu concordo com você. MAS descobri que o SQLPlus me deu um contexto útil em uma consulta incorreta que outros ambientes (no meu caso, Perl / DBI / DBD :: Oracle) não. Se você estiver lidando com erros com cuidado, isso pode valer a pena.
Além disso, dependendo de quanto controle você possui sobre o servidor, você pode ou não conseguir assumir a disponibilidade de algo mais que o shell e o SQLPlus. Muitas lojas unix mais rígidas que executam Solaris, HP / UX, AIX e similares usam instalações muito simples e não permitem a instalação de mais nada na caixa. Observe que, às vezes, uma solução alternativa para isso é apenas agrupar um intérprete mínimo com seu aplicativo.
ConcernedOfTunbridgeWells
3

Como isso:

sqlplus / nolog userid / password @ tnsname @filename

Se você colocar isso em um arquivo em lotes, o controle continuará com as instruções a seguir.

EDIT: Meu mal, tente novamente com / nolog sinalizador

Chris Noe
fonte
Infelizmente, isso não funciona. Quando executo o arquivo em lotes, o SqlPlus aguarda no prompt do SQL> a entrada do usuário em vez de retornar o controle ao prompt de comando.
JoshL 23/09/08
Desculpe, isso também não funciona. / nolog permite que o sqlplus inicie sem fazer logon. Não tem nada a ver com a saída de um script quando ele é concluído.
JoshL
Hmm, estou começando a me perguntar sobre diferenças de ambiente. Eu tenho vários scripts bat que usam o sqlplus dessa maneira.
Chris, você poderia dar um exemplo de trabalho? Apenas algo simples que executa um "select * from dual" ou algo assim ... Criei exemplos para testar suas sugestões, sem sucesso. Lembre-se de que isso está no Windows.
JoshL
Josh, veja a nova resposta abaixo.
0

No seu script SQL, adicione EXIT. Aqui está o exemplo do meu arquivo test.bat:

usuário sqlplus / pwd @ server @ test.SQL> myLOG.LOG

meu arquivo test.sql possui o seguinte: select * from dual; Saída


fonte
Tudo bem, mas não atende ao requisito de fazer isso sem modificar o script para incluir uma instrução exit / quit. A intenção é que esses scripts possam ser executados por um DBA do SQL Plus, mas também podem ser executados a partir de um arquivo em lotes.
21139 JoshL
0

sair | SQLPLUS / @ @

Esta é a solução correta, eu tentei está funcionando


fonte