データベースプロシージャでは 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; |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |