Pular para o conteúdo
Visualizando 10 posts - 1 até 10 (de 10 do total)
  • Autor
    Posts
  • #106248
    Avatar de HugoHugo
    Participante

      Olá todos!

      Travei numa situação referente a um cursor e gostaria de saber se alguém poderia me dar uma luz.

      O objetivo da função é receber uma consulta sql qualquer e gerar a partir dela um arquivo html formatado que será enviado por email num job noturno, em formato de tabela.

      Já consegui listar a quantidade de colunas e o nome das colunas dinamicamente, mas travei no momento em que deveria montar o corpo da tabela. Pois não tenho como declarar um rowtype já que os campos são dinâmicos.

      Abaixo links com função ainda incompleta, sem as tags html, e um html do resultado desejado.

      https://dl.dropboxusercontent.com/u/12424274/emailtemplate.htm
      https://dl.dropboxusercontent.com/u/12424274/count_columns.fnc

      #106249
      Avatar de rmanrman
      Participante

        @Hugo

        Faltou o anexo.

        #106250
        Avatar de HugoHugo
        Participante

          Obrigado, tópico atualizado.

          #106251
          Avatar de rmanrman
          Participante

            @Hugo

            Talvez uma forma de fazer seria declarar o rowtype e utilizar apenas as colunas selecionadas. Sim, isso vai de encontro com as melhores práticas. 🙁

            Não conheço muito da packeage DBMS_SQL, mas talvez ela possa gerar um cursor dinâmico, teria que estudar melhor…

            #106252
            Avatar de HugoHugo
            Participante

              A questão é que eu não posso declarar via rowtype porque a consulta sql pode variar, ou então teria que fazer um cursor específico pra cada uma delas, o que no meu cenário atual ficaria inviável.

              #106255
              Avatar de rmanrman
              Participante

                @Hugo

                Outra alternativa é montar um bloco anônimo através da linguagem de programação, neste bloco você pode montar dinamicamente a definição do cursor.

                #106256
                Avatar de HugoHugo
                Participante

                  Consegui resolver com DBMS_SQL.DEFINE_COLUMS e DBMS_SQL.DESCRIBE_COLUMNS .

                  Valeu !

                  #106257
                  Avatar de rmanrman
                  Participante

                    @Hugo

                    Apesar de já ter encontrado a solução, segue uma idéia com SQL DINÂMICO+CURSOR IMPLÍCITO.


                    DECLARE
                    VCURSOR_DINAMIC VARCHAR2(128);
                    VSQL VARCHAR2(4000);
                    BEGIN
                    VCURSOR_DINAMIC := 'SELECT USERNAME,ACCOUNT_STATUS FROM DBA_USERS';
                    VSQL := '
                    BEGIN
                    FOR R IN ('||VCURSOR_DINAMIC||') LOOP
                    DBMS_OUTPUT.put_line(R.USERNAME);
                    DBMS_OUTPUT.put_line(R.ACCOUNT_STATUS);
                    END LOOP;
                    END;';
                    EXECUTE IMMEDIATE VSQL;
                    END;

                    #106258
                    Avatar de HugoHugo
                    Participante

                      Nesse caso não funcionaria pra mim, pois nada garante que o select que eu ia passar como parâmetro ia ter 2 colunas apenas, no meu caso é pra aceitar qualquer script e com qualquer quantidade de colunas.

                      #106279
                      Avatar de rmanrman
                      Participante

                        @Hugo

                        Poderia posta a solução?

                      Visualizando 10 posts - 1 até 10 (de 10 do total)
                      • Você deve fazer login para responder a este tópico.
                      plugins premium WordPress