Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

RogerioRock

Loop em colunas do Cursor

Recommended Posts

Ola, Estou com um pequeno problema, eu estou quero montar um e-mail em formato html,pelo oracle,Ate ai sem, problemas,so que eu quero montar as colunas da tabela dinamicamentes baseado na consulta que eu passar,este o meu problema,náo sei como,ja testei, passando a consulta, e com qt fixas de coluna e deu certoMas qeuro fazer um loop nas colunas de cada linha,Ai vai um resumo do codigo, se poderem me ajudar. declaresmtp utl_smtp.connection;SqlCursor pls_integer;NumRows pls_integer;TYPE TCol IS TABLE OF dbms_sql.varchar2_table INDEX BY BINARY_INTEGER;vCol TCol ;NCol integer;Coluna integer;Linha Integer;beginNCol:=3;smtp:=utl_smtp.open_connection(servidor,25);-- Comfiguraçoes do UTL_SMTP etc .....--Esta e a parte importanteSqlCursor := dbms_sql.open_cursor;dbms_sql.parse(SqlCursor, 'select ..... from ...',cmd,DBMS_SQL.NATIVE);Coluna:=0;for Coluna in 1..nCol loopdbms_sql.define_array(SqlCursor,Coluna, vCol(Coluna), 10, 1);end loop; Coluna:=0;loopNumRows := dbms_sql.fetch_rows(SqlCursor);IF NOT NUMROWS=0 THEN for Coluna in 1..nCol loopdbms_sql.column_value(SqlCursor,Coluna, vCol(Coluna));end loop; ELSEEXIT;END IF;end loop; dbms_sql.close_cursor(SqlCursor); for Linha in 1..vCol(1).count loopUTL_SMTP.WRITE_DATA(smtp,'<tr>'|| UTL_TCP.CRLF);Coluna:=0;for Coluna in 1..Ncol loopUTL_SMTP.WRITE_DATA(smtp,'<td>');utl_smtp.write_raw_data(smtp,utl_raw.cast_to_raw(vCol(Coluna)(Linha))); ----Este e o meu problema,coloqeui assim para melhor inlustrar.UTL_SMTP.WRITE_DATA(smtp,'</td>');END loop; UTL_SMTP.WRITE_DATA(smtp,'</tr>');end loop; UTL_SMTP.WRITE_DATA(smtp,'</table></body></html>');UTL_SMTP.CLOSE_DATA(smtp);UTL_SMTP.QUIT(smtp);EXCEPTIONWHEN utl_smtp.transient_error OR utl_smtp.permanent_error THENBEGINUTL_SMTP.QUIT(smtp);EXCEPTIONWHEN UTL_SMTP.TRANSIENT_ERROR OR UTL_SMTP.PERMANENT_ERROR THENtrata o erro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Encontrei esta rotina no site da Oracle, ela acessa informações de Metadata das colunas dinamicamente.

Espero que seja util para resolver seu problema.

 

declare  c number;  d number;  col_cnt integer;  f boolean;  rec_tab dbms_sql.desc_tab;  col_num number;  procedure print_rec(rec in dbms_sql.desc_rec) is  begin	dbms_output.new_line;	dbms_output.put_line('col_type			=	'						 || rec.col_type);	dbms_output.put_line('col_maxlen		  =	'						 || rec.col_max_len);	dbms_output.put_line('col_name			=	'						 || rec.col_name);	dbms_output.put_line('col_name_len		=	'						 || rec.col_name_len);	dbms_output.put_line('col_schema_name	 =	'						 || rec.col_schema_name);	dbms_output.put_line('col_schema_name_len =	'						 || rec.col_schema_name_len);	dbms_output.put_line('col_precision	   =	'						 || rec.col_precision);	dbms_output.put_line('col_scale		   =	'						 || rec.col_scale);	dbms_output.put('col_null_ok		 =	');	if (rec.col_null_ok) then	  dbms_output.put_line('true');	else	  dbms_output.put_line('false');	end if;  end;begin  c := dbms_sql.open_cursor;  dbms_sql.parse(c, 'select ...... from..... ' ,2);   d := dbms_sql.execute(c);   dbms_sql.describe_columns(c, col_cnt, rec_tab);/* * Following loop could simply be for j in 1..col_cnt loop. * Here we are simply illustrating some of the PL/SQL table * features. */  col_num := rec_tab.first;  if (col_num is not null) then	loop	  print_rec(rec_tab(col_num));	  col_num := rec_tab.next(col_num);	  exit when (col_num is null);	end loop;  end if;   dbms_sql.close_cursor(c);end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.