Pro*C problem - declare cursor

From: <vkwan1_at_vaxa.hofstra.edu>
Date: 15 Jun 94 12:12:03 EST
Message-ID: <1994Jun15.121203.4117_at_vaxa>


Hi all,

   I am very new to Pro*C, and I am having problem in declaring a "global" cursor, which other sub-programs can access it.

   The following C program calls 5 small sub programs, and each one of those does its own task.

   I declare a cursor in sub_declare_cursor() as "employee", however, when the main program calls sub_fetch_info() to fetch some data from the table, an error message prints out.

PCC-S-0014: Undeclared SQL Identifier "EMPLOYEE: at line in file sub_fetch_info.pc

   The problem is very obvious, when the program leaves sub_declare_cursor(), it losses the cursor declaration, that is why inside sub_fetch_info(),it doe NOT recognize the cursor, "employee", has been declared and opened.

   How to declare a cursor in one sub-program, and this cursor can be seen in other sub-programs?

Thanks for your help.

Vito Kwan
vkwan1_at_vaxb.hofstra.edu                       


/* main */

#include <stdio.h>

extern void sub_oracle_connect (void);
extern void sub_declare_cursor (void);
extern void sub_fetch_info (char io_buffer[]);
extern void sub_close_cursor (void);
extern void sub_oracle_exit (void);

main (void)
{

   char io_buffer[50];

   sub_oracle_connect ();

   sub_declare_cursor ();

    for(;;) {

       sub_fetch_info (io_buffer);
       printf ("The employee info: %s\n", io_buffer);
    }     

    sub_close_cursor ();
    sub_oracle_exit ();
}


/* sub_oracle_connect */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

EXEC SQL BEGIN DECLARE SECTION;
   VARCHAR username[20];
   VARCHAR password[20];
EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE sqlca;

void sub_oracle_connect (void);

void sub_oracle_connect (void)
{

   strcpy(username.arr,"scott");
   username.len=strlen(username.arr);
   strcpy(password.arr,"tiger");
   password.len=strlen(password.arr);

   EXEC SQL WHENEVER SQLERROR GOTO sqlerror;

   EXEC SQL CONNECT :username IDENTIFIED BY :password;

   printf ("\nConnected to Oracle as user: %s\n", username.arr);

   return;

   sqlerror:

      EXEC SQL WHENEVER SQLERROR CONTINUE;

      printf("\nOracle error detected:\n");
      printf("\n%.70s \n", sqlca.sqlerrm.sqlerrmc);

      EXEC SQL ROLLBACK RELEASE;
      exit(1);

}

/* sub_declare_cursor */

#include <stdio.h>

EXEC SQL INCLUDE sqlca;

void sub_declare_cursor (void);

void sub_declare_cursor (void)
{

   EXEC SQL DECLARE employee CURSOR FOR

      SELECT EMPNO, ENAME, DEPTNO, SAL FROM EMP;";    EXEC SQL OPEN employee;
}


/* sub_close_cursor */

#include <stdio.h>

EXEC SQL INCLUDE sqlca;

void sub_close_cursor (void);

void sub_close_cursor (void)
{

   EXEC SQL CLOSE employee;
}


/* sub_fetch_info */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

EXEC SQL INCLUDE sqlca;

EXEC SQL BEGIN DECLARE SECTION;
   VARCHAR emp_number[4];
   VARCHAR emp_name[15];
   VARCHAR dept_number[4];
   VARCHAR salary[7];
EXEC SQL END DECLARE SECTION; void sub_fetch_info (char io_buffer[]);

void sub_fetch_info (char io_buffer[])
{

   EXEC SQL FETCH employee

            INTO :emp_number, :emp_name, :dept_number, :salary;

   emp_number.arr[emp_number.len]='\0';    emp_name.arr[emp_name.len]='\0';
   dept_number.arr[dept_number.len]='\0';    salary.arr[salary.len]='\0';

   strcpy(io_buffer, emp_number.arr); 
   strcat(io_buffer, emp_name.arr);
   strcat(io_buffer, dept_number.arr);
   strcat(io_buffer, salary.arr);

   io_buffer[strlen(io_buffer)] = '\0';
}


/* sub_oracle_exit */

#include <stdio.h>
#include <stdlib.h>

EXEC SQL INCLUDE sqlca;

void sub_oracle_exit (void);

void sub_oracle_exit (void)
{

   EXEC SQL COMMIT WORK RELEASE;        exit(0);
} Received on Wed Jun 15 1994 - 19:12:03 CEST

Original text of this message