Встроенный SQL FETCH

Во встроенном SQL Oracle Pro * C (ссылка: https://docs.oracle.com/cd/B10501_01/appdev.920/a97269/pc_06sql.htm) я хотел бы получить три переменные хоста: например,

EXEC SQL FETCH emp_cursor 
INTO :emp_name, :emp_number, :salary;

В другом варианте я хотел бы использовать две переменные хоста, как показано ниже:

EXEC SQL FETCH emp_cursor 
INTO :emp_name, :emp_number;

Есть ли механизм, где я могу объявить символьную строку и манипулировать ею, чтобы иметь динамическое содержимое в качестве первого примера FETCH с тремя переменными или FETCH с двумя переменными, как во втором. Есть ли механизм, чтобы иметь такой динамизм? Кроме того, если я хочу получить максимум 200 строк, как эти переменные хоста должны быть объявлены?

1 ответ

Использование descriptor, см. эту ссылку https://docs.oracle.com/cd/B10501_01/appdev.920/a97269/pc_14ady.htm

например, вам нужно использовать cursor для этой строки:

SELECT ename, empno FROM emp ;

вам нужно создать два values (ename, empno) в descriptor.Те values необходимо 3 атрибута: type,len а также data (см. таблицу в ссылке)

//attributes for ename 
int ename_type = 97, ename_len = 30 ;
char ename_data[31] ;

//attributes for empno 
int empno_type = 3, empno_len = 4 ;
int empno_data ;

полный код здесь:

char* dyn_statement = "SELECT ename, empno FROM emp" 
;
int ename_type = 97, ename_len = 30 ;
char ename_data[31] ;
int empno_type = 3, empno_len = 4 ;
int empno_data ;
long SQLCODE = 0 ;
...
main ()
{
/* Place preliminary code, including connection, here. */
...

EXEC SQL ALLOCATE DESCRIPTOR 'out'; //start the descriptor
EXEC SQL PREPARE s FROM :dyn_statement ;
EXEC SQL DECLARE c CURSOR FOR s ;
EXEC SQL DESCRIBE OUTPUT s USING DESCRIPTOR 'out' ;

//pass ename's attributes for DESCRIPTOR
EXEC SQL SET DESCRIPTOR 'out' VALUE 1 TYPE = :ename_type, 
    LENGTH = :ename_len, DATA = :ename_data ;
//pass empno's attributes for DESCRIPTOR
EXEC SQL SET DESCRIPTOR 'out' VALUE 2 TYPE = :empno_type, 
    LENGTH = :empno_len, DATA = :empno_data ;

EXEC SQL WHENEVER NOT FOUND DO BREAK ;
while (SQLCODE == 0) 
{
   EXEC SQL FETCH c INTO DESCRIPTOR 'out' ;
   EXEC SQL GET DESCRIPTOR 'out' VALUE 1 :ename_data = DATA ;
   EXEC SQL GET DESCRIPTOR 'out' VALUE 2 :empno_data = DATA ;
   printf("\nEname = %s Empno = %s", ename_data, empno_data) ;
}
EXEC SQL CLOSE c ;
EXEC SQL DEALLOCATE DESCRIPTOR 'out' ;//close descriptor
...
}
Другие вопросы по тегам