Re: Return cursor - Mailing list pgsql-sql

From alla@sergey.com (Alla)
Subject Re: Return cursor
Date
Msg-id 9275d56e.0105240427.2fa28c31@posting.google.com
Whole thread Raw
List pgsql-sql
Alexander Dederer <dederer@spb.cityline.ru> wrote in message news:<9ehged$k4f$1@news.tht.net>...
> Can you send PL/SQL code and back-end code used this PL/SQL code?
> Myself  trubles with CURSOR I resolve use LIMIT ... OFFSET ...

It would look something like this:

create or replace package my_package
AS
   type gc_cursor is ref cursor;

   procedure load_users
   (pp_user_base     out   gc_cursor);
end my_package;
/

create or replace package body my_package
as
procedure load_users
(pp_user_base     out   gc_cursor)
as
begin
   open pp_user_base for
      select column1, column2, column3
      from my_table
      order by 1;

exception
   when others then
      raise_application_error(-20100, 'Error while trying to load user base ' ||
         sqlerrm);
end load_users;

end my_package;
/

C program would look something like this:

void
load_user_base()
{
EXEC SQL BEGIN DECLARE SECTION;
   sql_cursor    cUserBase;
EXEC SQL END DECLARE SECTION;

  struct USER_PROFILE {
    .......
  } user_profile[ARRAY_LENGTH];

  struct USER_PROFILE_IND {
    .......
  } user_profile_ind[ARRAY_LENGTH];

  EXEC SQL ALLOCATE :cUserBase;  /* allocate the cursor variable */

  EXEC SQL EXECUTE
    BEGIN
      my_package.load_users(:cUserBase);
    END;
  END-EXEC;

  EXEC SQL WHENEVER NOT FOUND DO break;

  for (;;) {
    EXEC SQL FOR :i FETCH :cUserBase INTO :user_profile:user_profile_ind;

    if (sqlca.sqlcode != 0) {
      fprintf(stderr, "Fetching users %s\n", sqlca.sqlerrm.sqlerrmc);
      break;
    }
  }

........
........

Thanks for your response

Alla

pgsql-sql by date:

Previous
From: "Martin Smetak"
Date:
Subject: Recursive select
Next
From: alla@sergey.com (Alla)
Date:
Subject: Return cursor