2016-08-23 5 views
0

Oracle Pro * C埋込みSQL(Ref:https://docs.oracle.com/cd/B10501_01/appdev.920/a97269/pc_06sql.htm)では、次の3つのホスト変数にFETCHします。 別の変形で埋込みSQL FETCH

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

、私は以下のように、2つのホスト変数を使用したいと思います:

EXEC SQL FETCH emp_cursor 
INTO :emp_name, :emp_number; 

私は、文字列が宣言して、動的コンテンツを持っているように操作していることができます任意のメカニズムがあります3つの変数を持つFETCHの最初の例、または2番目の変数と同じ2つの変数を持つFETCHです。このダイナミズムを持つメカニズムはありますか? また、最大200行をフェッチしたい場合、これらのホスト変数をどのように宣言する必要がありますか?

答えて

0

descriptorを使用してください。 、あなたはその文字列をcursorを使用する必要があり、たとえば、このリンクhttps://docs.oracle.com/cd/B10501_01/appdev.920/a97269/pc_14ady.htm

を参照してください。

あなたは2 values(ENAME、EMPNO) descriptor .Those valuesニーズの3つの属性を作成する必要が
SELECT ename, empno FROM emp ; 

typelendata(リンク内の表を参照)

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