2016-08-23 11 views
0

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

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

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

EXEC SQL FETCH emp_cursor 
INTO :emp_name, :emp_number; 

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

ответ

0

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

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

SELECT ename, empno FROM emp ; 

вам нужно создать два values (Ename, Empno) в descriptor .Those 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 ; 

complite код здесь:

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 
... 
}