For Loop no Spool

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
MarcioAnderson
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Seg, 19 Abr 2021 9:51 pm
Localização: Teresina

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!
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

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.
Responder
  • Informação
  • Quem está online

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