データベース・プロシージャでは SELECT 文も使用できます。プロシージャの宣言に RESULT 句を使用して、結果セットのカラムの数、名前、型を指定します。結果セットのカラムは出力パラメータとは異なります。結果セットを持つプロシージャでは、SELECT 文の代わりに CALL 文を使用してカーソル宣言を行うことができます。
EXEC SQL BEGIN DECLARE SECTION; char hv_name[100]; EXEC SQL END DECLARE SECTION; EXEC SQL CREATE PROCEDURE female_employees() RESULT( name char(50) ) BEGIN SELECT GivenName || Surname FROM Employees WHERE Sex = 'f'; END; EXEC SQL PREPARE S1 FROM 'CALL female_employees()'; EXEC SQL DECLARE C1 CURSOR FOR S1; EXEC SQL OPEN C1; for(;;) { EXEC SQL FETCH C1 INTO :hv_name; if( SQLCODE != SQLE_NOERROR ) break; printf( "%s\\n", hv_name ); } EXEC SQL CLOSE C1; |
この例では、プロシージャは EXECUTE 文ではなく OPEN 文を使用して呼び出されています。OPEN 文の場合は、SELECT 文が見つかるまでプロシージャが実行されます。このとき、C1 はデータベース・プロシージャ内の SELECT 文のためのカーソルです。操作を終了するまで FETCH 文のすべての形式 (後方スクロールと前方スクロール) を使用できます。CLOSE 文によってプロシージャの実行が終了します。
この例では、たとえプロシージャ内の SELECT 文の後に他の文があっても、その文は実行されません。SELECT の後の文を実行するには、RESUME cursor-name 文を使用してください。RESUME 文は警告 (SQLE_PROCEDURE_COMPLETE)、または別のカーソルが残っていることを意味する SQLE_NOERROR を返します。次は select が 2 つあるプロシージャの例です。
EXEC SQL CREATE PROCEDURE people() RESULT( name char(50) ) BEGIN SELECT GivenName || Surname FROM Employees; SELECT GivenName || Surname FROM Customers; END; EXEC SQL PREPARE S1 FROM 'CALL people()'; EXEC SQL DECLARE C1 CURSOR FOR S1; EXEC SQL OPEN C1; while( SQLCODE == SQLE_NOERROR ) { for(;;) { EXEC SQL FETCH C1 INTO :hv_name; if( SQLCODE != SQLE_NOERROR ) break; printf( "%s\\n", hv_name ); } EXEC SQL RESUME C1; } EXEC SQL CLOSE C1; |
ここまでの例は静的カーソルを使用していました。CALL 文では完全に動的なカーソルも使用できます。
動的カーソルについては、動的 SELECT 文を参照してください。
DESCRIBE 文はプロシージャ・コールでも完全に機能します。DESCRIBE OUTPUT で、結果セットの各カラムを記述した SQLDA を生成します。
プロシージャに結果セットがない場合、SQLDA にはプロシージャの INOUT パラメータまたは OUT パラメータの記述が入ります。DESCRIBE INPUT 文はプロシージャの IN または INOUT の各パラメータを記述した SQLDA を生成します。
DESCRIBE ALL は IN、INOUT、OUT、RESULT セットの全パラメータを記述します。DESCRIBE ALL は SQLDA のインジケータ変数に追加情報を設定します。
CALL 文を記述すると、インジケータ変数の DT_PROCEDURE_IN と DT_PROCEDURE_OUT ビットが設定されます。DT_PROCEDURE_IN は IN または INOUT パラメータを示し、DT_PROCEDURE_OUT は INOUT または OUT パラメータを示します。プロシージャの RESULT カラムはどちらのビットもクリアされています。
DESCRIBE OUTPUT の後、これらのビットは結果セットを持っている文 (OPEN、FETCH、RESUME、CLOSE を使用する必要がある) と持っていない文 (EXECUTE を使用する必要がある) を区別するのに使用できます。
詳細については、DESCRIBE 文 [ESQL]を参照してください。
複数の結果セットを返すプロシージャにおいて、結果セットの形が変わる場合は、各 RESUME 文の後で再記述してください。
カーソルの現在位置を記述するには、文ではなくカーソルを記述する必要があります。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |