1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| declare
v_ret varchar2(500);
v_sql varchar2(100) := 'select * from parse_test'; -- requête dynamique
v_cursor pls_integer;
v_col_count pls_integer;
v_row_count pls_integer;
v_desc_t dbms_sql.DESC_TAB;
v_col_value varchar2(100);
v_irow pls_integer := 0;
begin
v_cursor := dbms_sql.open_cursor;
dbms_sql.parse(v_cursor, v_sql, DBMS_SQL.NATIVE);
/* récupération du nombre de colonnes et définition => ici on ne traite que du varchar pour démo */
dbms_sql.describe_columns(v_cursor, v_col_count, v_desc_t);
dbms_output.put_line('Nbr de colonnes ' || to_char(v_col_count));
for icol in 1..v_col_count
loop
/* affichage nom de chaque colonne, type et long. maxi */
dbms_output.put_line ('Nom colonne ' || to_char(icol) ||
' : ' || v_desc_t(icol).col_name ||
' Type ' || to_char(v_desc_t(icol).col_type) ||
' Len ' || to_char(v_desc_t(icol).col_max_len));
/* ici "en vrai" il faudrait regarder le détail de chaque colonne dans v_desc_t
pour les besoins de la demo on considère varchar2(100) */
DBMS_SQL.DEFINE_COLUMN (v_cursor, icol, v_col_value, 100);
end loop;
/* exécution de la requête et fetch première ligne */
v_row_count := dbms_sql.execute_and_fetch(v_cursor);
while v_row_count <> 0
loop
v_irow := v_irow + 1;
v_ret := '';
dbms_output.put_line('Ligne N° ' || to_char(v_irow));
/* concaténation des colonnes de la ligne */
for Icol in 1..v_col_count
loop
dbms_sql.column_value(v_cursor, Icol, v_col_value);
if v_ret is not null then
v_ret := v_ret || ',';
end if;
v_ret := v_ret || v_col_value;
end loop;
dbms_output.put_line('resultat concat colonnes ligne N° ' || v_irow || ' : ' || v_ret);
/* ligne suivante */
v_row_count := dbms_sql.fetch_rows(v_cursor);
end loop;
dbms_sql.close_cursor(v_cursor);
end; |
Partager