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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| create or replace procedure z_test6 (latable varchar2)as
type Type_Type is table of varchar2(1000);
val_Type1 Type_Type;--Où on recupère les noms des champs
val_Type2 Type_Type;--Où on recupère les types des champs
Str_Type varchar2(1000):='';
Str_Affiche varchar2(500);
Str_Col varchar2(500);
programme varchar2(4000);--Programme dynamique
begin
select B.COLUMN_NAME, ' '||B.DATA_TYPE||
case
when B.DATA_TYPE IN('VARCHAR2','CHAR') then
'('||B.DATA_LENGTH||')'
when B.DATA_TYPE IN('NUMBER')and B.DATA_PRECISION is not null then
'('||B.DATA_PRECISION||decode(B.DATA_SCALE, 0,'',','||B.DATA_SCALE)||')'
end||','
BULK COLLECT INTO val_Type1,val_Type2--Variable de type collection
from user_tab_columns B
where B.table_name = upper(latable) ;
FOR indx IN 1 .. val_Type1.COUNT
LOOP
Str_Type:=Str_Type||(val_Type1(indx))||(val_Type2(indx));--Aide à déclarer un RECORDS par example: type rec IS RECORD (ID number, NOM VARCHAR2(40));
Str_Affiche:=Str_Affiche||(val_Type1(indx))||',';--Pour estétique en sortie
Str_Col:=Str_Col||'l_tab(i).'||RTrim((val_Type1(indx)),',')||'||'',''||';--Pour estétique en sortie
END LOOP;
Str_Type:=''||Rtrim(Str_Type,',');
Str_Col:=RTrim(Str_Col,'||');
Str_Affiche:=RTrim(Str_Affiche,'||');
--Programme dynamique
programme:=
'
declare
l_cursor SYS_REFCURSOR;
type ty IS REF CURSOR;
TYPE t_ptf_row IS RECORD ('||
Str_Type
||');
TYPE t_ptf_tab IS TABLE OF t_ptf_row;
l_tab t_ptf_tab;
begin
OPEN l_cursor for ''SELECT * FROM '||latable||''';
loop
FETCH l_cursor BULK COLLECT INTO l_tab;
EXIT WHEN l_cursor%NOTFOUND;
end loop;
CLOSE l_cursor;
dbms_output.put_line('''||Str_Affiche||''');
for i in 1..l_tab.count loop
dbms_output.put_line('||Str_Col||' );
end loop;
end;
';
execute immediate programme;
end; |
Partager