Executar arquivo.sql em Procedure

DBA Geral (instalação, configuração do banco, scripts do Sql*Plus, shell scripts, batch scripts, etc...)
Responder
freis_bcf
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Seg, 10 Abr 2017 5:07 pm

Galera, preciso de uma ajuda..

Estou criando uma procedure no qual ela escreve alguns dados em uma tabela, dessa tabela, eu gero um arquivo .txt pelo spool.

Como eu quero tudo na mesma procedure, eu deixei o spool em um arquivo.sql para a procedure ler e executar, porem esta dando erro na hora que gero a procedure. Alguém pode me ajudar? Abaixo tem os códigos que estou utilizando.

Procedure;

Selecionar tudo

create or replace PROCEDURE EXPORT_DADOS_TELEMETRIA (VAR1 IN VARCHAR2, VAR2 IN VARCHAR2)AS

--VAR1 --> TIPO DO SEPARADOR
--VAR2 --> DATA DE PESQUISA

BEGIN

EXECUTE IMMEDIATE 'TRUNCATE TABLE DADOS_TELEMETRIA';

INSERT INTO DADOS_TELEMETRIA 
SELECT VAR2||VAR1||
            COL1||VAR1||
            COL2||VAR1||
            COL3||VAR1||
            COL4||VAR1
            AS STRING
FROM TABELA
WHERE TO_CHAR(COL5,'YYYYMMDD')>=VAR2;

EXECUTE IMMEDIATE '@C:\TESTE\TXT\export_txt.sql';  ----> Onde acontece o erro

END EXPORT_DADOS_TELEMETRIA;

Codigo do Spool:

Selecionar tudo

set heading off
set trimspool on 
set linesize 1520
set pagesize 50000
set echo off
set feedback off

col nome_arq new_value arquivo;
SELECT 'EXP_'||TO_CHAR(SYSDATE, 'YYMMDDHH24MI')||'.txt' as nome_arq from dual;

spool C:\TESTE\TXT\&arquivo

SELECT * FROM DADOS_TELEMETRIA;
Uma OBS: Se eu executo a procedure

Selecionar tudo

EXEC EXPORT_DADOS_TELEMETRIA (';','20170101')
, com a linha comentada aqui ela funciona:

Selecionar tudo

EXECUTE IMMEDIATE '@C:\TESTE\....


Da mesma maneira que se eu executo apenas o @C:\TESTE\.... ele funciona também, mas preciso deixar os dois na mesma procedure para entregar a uma pessoa.
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Boa tarde freis_bcf,

"acho" que você não pode executar o execute immediate com a chamada de um script.

Não tem jeito de na sua procedure você montar a linha e executar?
sem gerar spool
freis_bcf
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Seg, 10 Abr 2017 5:07 pm

spernega escreveu:
Pesquisa avançada
 
Infelizmente não.. Eu preciso do Spool pra gerar um txt. Eu queria deixar tudo em uma procedure só.. Mas pelo que pesquisei na internet, não teria como deixar o comando de Spool na procedure. Por isso procurei deixar o comando em arquivo.sql e ai tentar chamar na procedure..
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Essa é complicada.

Se você gerar o spool apenas para referencia e executar os comandos direto pela procedure?

Talvez seja melhor usar o utl_file para gera o arquivo, a menos que você queira o arquivo a máquina do usuário, dai complica.
freis_bcf
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Seg, 10 Abr 2017 5:07 pm

Sim .. Eu preciso que o arquivo fique na máquina do usuário =/ ..

Eu tentei dessa maneira:

Selecionar tudo

create or replace PROCEDURE EXPORT_DADOS (VAR1 IN VARCHAR2, VAR2 IN VARCHAR2)AS

--VAR1 --> TIPO DO SEPARADOR
--VAR2 --> DATA DE PESQUISA

BEGIN

EXECUTE IMMEDIATE 'TRUNCATE TABLE DADOS';

INSERT INTO DADOS 
SELECT VAR2||VAR1||
            COL1||VAR1||
            COL2||VAR1||
            COL3||VAR1|| STRING
FROM TAB1
WHERE TO_CHAR(COL4,'YYYYMMDD')>=VAR2;

EXECUTE IMMEDIATE 
'
set heading off
set trimspool on 
set linesize 1520
set pagesize 50000
set echo off
set feedback off

col nome_arq new_value arquivo;
SELECT ''EXP_.txt'' as nome_arq from dual;

spool C:\TESTE\&arquivo

SELECT * FROM DADOS;
';

END EXPORT_DADOS;
Eu consigo copilar a procedure, mas quando executo aparece o erro:

Selecionar tudo

ORA-00922: opção não encontrada ou inválida
ORA-06512: em "BD.EXPORT_DADOS", line 30             (Linha do comando EXECUTE IMMEDIATE para o Spool)
ORA-06512: em line 8
Processo encerrado.
Desconectando do banco de dados
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Entendo, infelizmente não vai dar pra gerar o spool de dentro da procedure.

A procedure eu tinha pensado mais ou menos assim

Selecionar tudo

create or replace 
PROCEDURE EXPORT_DADOS (VAR1 IN VARCHAR2, --VAR1 --> TIPO DO SEPARADOR
                        VAR2 IN date) is  --VAR2 --> DATA DE PESQUISA
 --
 cursor c is
  SELECT VAR2||VAR1||
         COL1||VAR1||
         COL2||VAR1||
         COL3||VAR1|| STRING
  FROM   TAB1
  WHERE  COL4 >= VAR2;
 c_r c%rowtype;
 --
BEGIN
  --
  EXECUTE IMMEDIATE 'TRUNCATE TABLE DADOS';
  --
  open c;
   loop
    fetch c into c_r;
     exit when c%notfound;
     --
     insert into dados values(c_r.string);
     --
     EXECUTE IMMEDIATE c_r.string;
     --
   end loop;
  close c;
  --
END EXPORT_DADOS;
/
Mas o spool teria que ficar de fora.

A não ser que você utilize o UTL_FILE, mas ai o usuário vai ter que ter acesso ao diretório e "buscar" o arquivo.
Se puder fazer assim, fica fácil.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 4 visitantes