Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.0 (中文) » SQL Anywhere 服务器 - 编程 » 嵌入式 SQL » 使用简单的存储过程

 

具有结果集的存储过程

数据库过程也可以包含 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;
 CALL 语句的动态游标
 DESCRIBE ALL
 多个结果集