› Fóruns › SQL e PL/SQL › cursor com script de select › cursor com script de select
Bem, eu vejo umas besteiradas nesse código : por exemplo, numa parte dele vc faz :
…
for cScript in(
select ‘ DISTINCT ‘ || ”” || TRIM(SX
.loop…
e depois, DENTRO DESSE LOOP ainda, vc pede :
…
for cScript in cTabelas
loop
UTL_File.Put_Line….
==> OU SEJA, além de usar a ** mesma ** variável do tipo record CSCRIPT duas vezes em for loops diferentes e concatenados (o que é *** PROIBIDO !!! ***), sinceramente não entendi o que vc quer abrindo ** TRÊS ** loops no total : ao que entendo, o que vc quer é simplesmente UM LOOP, abrindo o Cursor cTabelas, o acionando até o final (num LOOP só) e dentro desse LOOP Gravar cada linha retornada , só isso….
O ponto ** principal ** que eu TENHO que te avisar, porém, é algo que está PLENAMENTE DOCUMENTADO nos manuais PL/SQL : a linguagem PL/SQL só pode executar SQLs que ** OU ** estão fixos e diretamente explicitados entre blocos BEGIN/END , ** OU ** então pode executar SQLs dinâmicos através de cláusulas EXECUTE IMMEDIATE ‘stringdoSQL’ ou via package DBMS_SQL – a linguagem NÃO TEM COMO executar código SQL dinâmico/não fixo que está em arquivos-texto (que seriam os scripts, pelo que vejo)…. okdoc ?? Isso é Conceitual, ela Não TEM recurso nativo pra isso, pode Conferir nos manuais de PL/SQL e na Documentaçaõ Oracle …
Suas alternativas então para fazer como vc quer (ie, gerando arquivo com os comandos e depois “executar” esse arquivo) seriam :
a) ter um shell script que conecte no sqlplus, execute a procedure de geração do arquivo-texto de scripts e depois ainda dentro do sqlplus execute com @ esse arquivo de scripts gerado – isso é imho a mais simples mas vc TEM que tomar o cuidado de seguir a sintaxe de scripts do sqlplus, tendo ; após cada comando e adotando extensão .SQL no arquivo-texto, por exemplo…
ou
b) na própria procedure, depois que vc gerou o arquivo de script com os comandos, vc ABRE esse arquivo gerado, lê os comandos e executa cada um via EXECUTE IMMEDIATE – isso é relativamente COMPLEXO de se fazer e vc parece não ter muita experiência com programação PL/SQL então não recomendo esse caminho mas é Possível…
==>>> OBVIAMENTE, porém, eu tenho que apontar : SE os comandos SQL a serem executados estão nessas tabelas aí que vc mostra no cursor , *** PRA QUÊ *** vc está se preocupando em gerar arquivo-texto com eles, vc não pode simplesmente os ler num LOOP e EXECUTAR via EXECUTE IMMEDIATE ou DBMS_SQL cada comando lido ? AVALIE essa possibilidade…
Sendo assim eu recomendo que Plz dê uma ** limpada ** decente nesse código, Corrija os erros evidentes e depois de Feito isso, se vc ainda tiver problemas manda pra gente o CREATE TABLE e uns INSERTs populando as tais tabelas que a gente pode tentar reproduzir teu código Limpo e palpitar em cima….
[]s
Chiappa