Executar um procedure no SQL*PLUS e gerar arquivo texto

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
elton.souza
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 38
Registrado em: Qua, 30 Jan 2013 6:22 pm

Bom dia pessoal,tudo bem?

Terei que desenvolver uns trabalhos no SQL*PLUS, e estou precisando executar uma procedure que contém duas querys sendo que em cada uma possui um cursor, e o resultado da execução dessa procedure gera um relatório. No banco funciona perfeitamente e gera a saída no output mas no SQL*PLUS não funciona. Segue abaixo o código que estou usando para executar no SQL*PLUS, porém não funciona e fala que está com INSTRUÇÃO SQL INVÁLIDA.

Selecionar tudo

spo C:\relatorio.log;
BEGIN
 relatorio2;
END;
spo off;
Alguém pode me ajudar?

Obrigado
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Então: tudo que está dentro de um BEGIN e END é código PLSQL.
Você não pode simplesmente colocar uma QUERY dentro de um BEGIN e END da mesma forma que faz direto no SQL*Plus.

Como você mencionou, a query se encontra dentro de um Cursor. Neste caso, pra saída ir pro SQL*Plus, você precisa colocar DBMS_OUTPUT dentro do LOOP:
Assim:

ALTERNATIVA 1 - COM CURSOR
Código do relatorio1.sql

Selecionar tudo

BEGIN
  FOR vcur IN (  SELECT * FROM etcetc)
  LOOP
    DBMS_OUTPUT.PUT_LINE( vcur.SEU_CAMPO1 || ' ' || vcur.SEU_CAMPO2 ); 
  END LOOP;
END;
/

Selecionar tudo

SQL> set serveroutput on
SQL> @relatorio1.sql
ALTERNATIVA 2 - SEM CURSOR (Query direto no arquivo)
Caso você deseja colocar apenas a query dentro do relatório1, então deve ser assim:
Código do relatorio1.sql

Selecionar tudo

SELECT * FROM etcetc
/

Selecionar tudo

SQL> @relatorio1.sql
elton.souza
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 38
Registrado em: Qua, 30 Jan 2013 6:22 pm

Bom dia Amigo, valeu pela dica postada. Ajudou bastante. Agora tenho uma outra duvida;

Me deparei com seguinte problema:

Tenho relatório que contem o Cabeçalho e suas linhas. Existem duas querys sendo que uma retorna os dados do cabeçalho e outra retorna os dados das linhas correspondente a esse cabeçalho. Ambas as querys possuem parâmetros de entrada para filtragem dos dados. Esse relatório hoje é executado dentro do EBS via concorrente usando XML PUBLISHER.

Nosso cliente irá desativar o EBS ficando somente com a licença do banco, e ele nos solicitou que esse relatório seja desenvolvido em SQL*PLUS, e como sou novo no ramo n tenho muita ideia de como vou fazer isso para nosso cliente. Alguém tem alguma ideia de como vou executar esse relatório com essas duas querys e passar seus parâmetros no SQL*PLUS? E pós a execução gerar um arquivo texto contendo os dados formatados no layout correspondente.?

Espero que alguém possa me ajudar. Desde já muito obrigado
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Bom, acredito que quando ele falou no SQL*Plus, ele esteja falando de Oracle puro.
Ou seja, a chamada pode ser feita no SQL*Plus, mas o programa pode ser uma Stored Procedure!

Veja vem com ele se é isso.
Numa stored procedure você consegue fazer cursores e usar DBMS_OUTPUT e fazer isso de forma bem mais fácil.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Google Adsense [Bot] e 16 visitantes