Thread: Passing cursor between functions in embedded SQL

Passing cursor between functions in embedded SQL

From
alla@sergey.com (Alla)
Date:
Did anybody try to do something like this?

int
open_cursor(...)
{  EXEC SQL DECLARE cur CURSOR FOR ...
  EXEC SQL OPEN cur;
 return cur1;  /* how can I do that???? */
}

int
fetch_cursor(... cur)
{  EXEC SQL FETCH cur;
  return some data;
}

That's how it's going to look in the calling program:
 cur := open_cursor;
 while (not found) {    fetch_cursor(cur);    do some processing with the data }   

My point is I don't want to declare huge arrays or linked lists and
keep all the fetched data in the memory. I want to fetch a row,
process it and move on to the next one.

May be there is another approach to do this? Please help

Thanks

Alla Gribov


Re: Passing cursor between functions in embedded SQL

From
"Sergey E. Volkov"
Date:
Hi Alla,

Short answer - you can't.

Cursor ( cursors' name ) in esql ALWAYS has a FILE scope
( correct me - global scope in ecpg ) so you can to use it anywhere ( in the
file where it was defined ) without passing ones as parameter.

However if you want to pass cursor as parameter I recommend you to use
postgresql's c++ library or
c library. It's best way to make a flexible application.

(

For example in Informix's esqlc  I can to define cursor as follows:
***
exec sql begin declare section
char *c1  =  "my_first_cursor",       *c2 =  "my_second_corsor";
exec sql end declare section

exec sql declare :c1 cursor for ...;
exec sql declare :c2 cursor for ...;

status = process_result_set(c1);
status = process_result_set(c2);
***
ecpg however doesn't support this syntax ...

)



"Alla" <alla@sergey.com> ???????/???????? ? ???????? ?????????:
news:9275d56e.0106181034.51a22104@posting.google.com...
> Did anybody try to do something like this?
>
> int
> open_cursor(...)
> {
>    EXEC SQL DECLARE cur CURSOR FOR ...
>
>    EXEC SQL OPEN cur;
>
>   return cur1;  /* how can I do that???? */
> }
>
> int
> fetch_cursor(... cur)
> {
>    EXEC SQL FETCH cur;
>
>    return some data;
> }
>
> That's how it's going to look in the calling program:
>
>   cur := open_cursor;
>
>   while (not found)
>   {
>      fetch_cursor(cur);
>      do some processing with the data
>   }
>
>
> My point is I don't want to declare huge arrays or linked lists and
> keep all the fetched data in the memory. I want to fetch a row,
> process it and move on to the next one.
>
> May be there is another approach to do this? Please help
>
> Thanks
>
> Alla Gribov