Thread: Using Cursor in PGSql ver 7.3
Hi All,
I want to use a Cursor in PGSql function. It should have all the functionalities like MoveNext, Fetch and MoveBackward etc.
Using PGSql Help provided,I have created a function using a Cursor but it is not working and gives errors.
I am using PostGres ver 7.3.
The code of the function is as follows:
CREATE FUNCTION public.report_cursor(int4, timestamp, timestamp) RETURNS varchar AS '
declare
i_id ALIAS for $1;
v_time1 ALIAS for $2;
v_time2 ALIAS for $3;
declare
i_id ALIAS for $1;
v_time1 ALIAS for $2;
v_time2 ALIAS for $3;
sumtotal integer;
r record;
t1 timestamp;
t2 timestamp;
i_oid timestamp;
i_checktime timestamp;
t1 timestamp;
t2 timestamp;
i_oid timestamp;
i_checktime timestamp;
i integer;
begin
declare cursor1 CURSOR FOR select a.abr_id, a.class_id, a.time_stamp, b.policy_name, a.inbound_byte from abr a, customer_policy b where a.class_id = i_id and time_stamp >= t1 and time_stamp <= t2 and
a.class_id = b.class_id order by a.class_id, a.time_stamp desc;
a.class_id = b.class_id order by a.class_id, a.time_stamp desc;
declare cursor2 CURSOR FOR select a.abr_id, a.class_id, a.time_stamp, b.policy_name, a.inbound_byte from abr a, customer_policy b where a.class_id = i_id and time_stamp >= t1 and time_stamp <= t2 and
a.class_id = b.class_id order by a.class_id, a.time_stamp desc;
a.class_id = b.class_id order by a.class_id, a.time_stamp desc;
t1 := v_time1;
t2 := v_time2;
t2 := v_time2;
open cursor1;
open cursor2;
open cursor2;
loop
fetch next from cursor1;
if found then
sumtotal :=0;
i_oid := cursor1.time_stamp;
i_checktime :=( i_oid - interval ''5 minutes'');
if (i_checktime < t1) then
exit;
end if;
fetch next from cursor1;
if found then
sumtotal :=0;
i_oid := cursor1.time_stamp;
i_checktime :=( i_oid - interval ''5 minutes'');
if (i_checktime < t1) then
exit;
end if;
fetch next from cursor2;
for i in 1..20 loop
sumtotal:=(sumtotal + cursor2.inbound_byte);
fetch next from cursor2;
end loop;
sumtotal:=sumtotal/20;
sumtotal:=(sumtotal + cursor2.inbound_byte);
fetch next from cursor2;
end loop;
sumtotal:=sumtotal/20;
insert into rep_test values(cursor1.class_id, cursor1.policy_name, sumtotal, cursor1.time_stamp);
move backward 20 from cursor2;
else
exit;
end if;
end loop;
else
exit;
end if;
end loop;
close cursor1;
close cursor2;
close cursor2;
return 0;
end;
end;
Thanks in advance,
Regards,
Ashvinder