Pular para o conteúdo

Fóruns SQL e PL/SQL cursor com script de select cursor com script de select

#108421
Avatar photoJosé Laurindo Chiappa
Moderador

    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