Aprenda PL/SQL

Executar arquivo.sql em Procedure

DBA Geral (instalação, configuração do banco, scripts do Sql*Plus, shell scripts, batch scripts, etc...)
  

Mensagemem Seg, 05 Jun 2017 11:08 am

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;

Código: Selecionar todos
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:

Código: Selecionar todos
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
Código: Selecionar todos
EXEC EXPORT_DADOS_TELEMETRIA (';','20170101')
, com a linha comentada em "EXECUTE IMMEDIATE '@C:\TESTE\....' " ela funciona. 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.
freis_bcf

Mensagemem Seg, 05 Jun 2017 1:11 pm

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
spernega
Localização: São Paulo - SP

Mensagemem Seg, 05 Jun 2017 2:28 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..
freis_bcf

Mensagemem Seg, 05 Jun 2017 3:05 pm

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.
spernega
Localização: São Paulo - SP

Mensagemem Ter, 06 Jun 2017 2:38 pm

spernega escreveu: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.


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

Eu tentei dessa maneira:

Código: Selecionar todos
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:
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
freis_bcf

Mensagemem Ter, 06 Jun 2017 3:32 pm

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

A procedure eu tinha pensado mais ou menos assim

Código: Selecionar todos
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.
spernega
Localização: São Paulo - SP



Voltar para DBA Geral

Quem está online

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

cron