Página 1 de 1

For Loop no Spool

Enviado: Seg, 19 Abr 2021 10:21 pm
por MarcioAnderson
Boa noite senhores!

Estou tentando montar um spool e eu queria colocar variáveis para rodar em loop (For Each) nele para geração de arquivos de acordo com a seleção.
Vou exemplificar:

main.sql :arrow:

Selecionar tudo

CLEAR SCREEN;
SET TERMOUT OFF
SET FEEDBACK OFF
SET PAGESIZE 0 EMBEDDED ON
SET SQLFORMAT DELIMITED ; " "
DEFINE DIR = 'C:\Users\Sql\local_da_query\'
CD 'C:\Users\Sql\local_onde_salvo_os_arquivos_gerados\'
BEGIN
FOR i IN (SELECT local, rota FROM LOCALIDADE) LOOP            		--as variáveis local e rota no loop (são números inteiros)
@@ query.sql
END LOOP;
END;
A query do loop:

query.sql :arrow:

Selecionar tudo

SPOOL Arquivo_&&local_&&rota.dsv					--as variáveis local e rota no nome do arquivo dsv
SELECT 
* 
FROM TABLE
WHERE LOCAL = local AND ROTA = rota;					--as variáveis local e rota no filtro da query
SPOOL OFF
Atualmente eu estou gerando esse loop por meio de job no Pentaho, mas pelo SQL é muito mais rápido.
Se esse procedimento funcionar, vou eliminar 397 loops.
OBS: utilizo o SQL Developer.

Desde já, agradeço!

Re: For Loop no Spool

Enviado: Sex, 10 Set 2021 2:34 pm
por dr_gori
Colocar um @@ dentro de um bloco PLSQL não vai funcionar, pois @ é um comando do SQL*Plus e não do PLSQL. (Lembre-se, PLSQL roda dentro do servidor Oracle, e o SQL*Plus roda na sua própria maquina).

Acho que para o seu caso, a melhor alternativa é um programa que monta um script com todos os selects que você precisa.

Algo:

Selecionar tudo

SPOOL temp.sql
SELECT 'SPOOL arquivo_'|| local ||'_'|| rota ||'.dsv' ||chr(10)|| ' select * from table where local = '|| local ||'; spool off' texto 
FROM LOCALIDADE;
SPOOL OFF
@temp.sql
Acho que dessa forma você consegue fazer isso.