Thursday, December 13, 2007

Bulk Collect, LIMIT, Execute Immediate and FORALL in Oracle

Declare
Type Year Is Table Of Varchar2(5);
Type mounthandday Is Table Of Varchar2(6);
Type tmprec Is Record(y Varchar2(5), md Varchar2(6), d Date);
Type tmprecs Is Table Of Tmprec;
Type Cur Is Ref Cursor;
Type datum Is Table Of Date;
years year;
mounthanddays mounthandday;
tecs tmprecs;
curs Cur;
data datum;
blc Varchar2(100):='Begin dbms_output.put_line(:b); End;';
Begin
dbms_output.enable(100000);
Begin
Execute Immediate
'Drop Table tmp';
Exception
When Others Then Null;
End;
Execute Immediate
'Create Table tmp(y Varchar2(5), md Varchar2(6), d Date)';
For i In 0..10
Loop
Declare
ins Varchar2(100):='Insert Into tmp Values(:1,:1,:2)';
Begin
Execute Immediate Ins Using to_char(Null),to_char(Null),
to_char(Sysdate+i);
End;
End Loop;
Execute Immediate
'Select d From tmp' Bulk Collect Into data;
For i In 1..11
Loop
Execute Immediate
'Update tmp Set y=:y, md=:y Where to_char(d)=:d' Using
to_char(data(i),'YYYY.'),to_char(data(i),'MM.DD.'),to_char(data(i));
End Loop;
Execute Immediate
'Select * From tmp' Bulk Collect Into years,mounthanddays,data;
Execute Immediate
'Select * From tmp' Bulk Collect Into tecs;
For i In 1..11
Loop
dbms_output.put_line(years(i) || mounthanddays(i) || '<-->' || data(i));
dbms_output.put_line(tecs(i).y || tecs(i).md || '-<>-' || tecs(i).d);
End Loop;
End;
/

No comments: