- Este tópico contém 9 respostas, 2 vozes e foi atualizado pela última vez 11 anos, 10 meses atrás por
rman.
-
AutorPosts
-
15 de janeiro de 2014 às 9:18 pm #106248
Hugo
ParticipanteOlá 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.fnc15 de janeiro de 2014 às 9:47 pm #106249rman
Participante@Hugo
Faltou o anexo.
15 de janeiro de 2014 às 9:58 pm #106250Hugo
ParticipanteObrigado, tópico atualizado.
15 de janeiro de 2014 às 10:53 pm #106251rman
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…
15 de janeiro de 2014 às 11:00 pm #106252Hugo
ParticipanteA 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.
16 de janeiro de 2014 às 2:21 pm #106255rman
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.
16 de janeiro de 2014 às 3:19 pm #106256Hugo
ParticipanteConsegui resolver com DBMS_SQL.DEFINE_COLUMS e DBMS_SQL.DESCRIBE_COLUMNS .
Valeu !
16 de janeiro de 2014 às 4:07 pm #106257rman
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;
16 de janeiro de 2014 às 4:56 pm #106258Hugo
ParticipanteNesse 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.
21 de janeiro de 2014 às 9:54 pm #106279rman
Participante@Hugo
Poderia posta a solução?
-
AutorPosts
- Você deve fazer login para responder a este tópico.