数据库过程也可以包含 SELECT 语句。声明该过程的方法是这样的:使用 RESULT 子句来指定结果集中列的编号、名称和类型。结果集列与输出参数不同。对于具有结果集的过程,在游标声明中可以使用 CALL 语句代替 SELECT 语句:
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; |
在本示例中,使用 OPEN 语句而不是 EXECUTE 语句调用该过程。OPEN 语句会使该过程在到达 SELECT 语句之前一直执行。此时,C1 是数据库过程内的 SELECT 语句的游标。您可以使用所有形式的 FETCH 语句(向后和向前滚动),直到完成它为止。CLOSE 语句用于终止该过程的执行。
如果在该过程中在 SELECT 语句之后还有一条语句,则不会执行该语句。要执行 SELECT 之后的语句,请使用 RESUME cursor-name 语句。RESUME 语句可返回警告 SQLE_PROCEDURE_COMPLETE,或返回指示存在另一游标的 SQLE_NOERROR。下面的示例阐释了一个双选择过程:
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讨论此页。
|
版权 © 2013, SAP 股份公司或其关联公司. - SAP Sybase SQL Anywhere 16.0 |