WEB开发网
开发学院数据库DB2 DB2 9.5 SQL Procedure Developer 认证考试 735 准... 阅读

DB2 9.5 SQL Procedure Developer 认证考试 735 准备,第2部分

 2010-02-16 14:59:32 来源:WEB开发网   
核心提示:如果从DB2命令行执行 NEST_DIAGN 存储过程,将得到以下结果:清单 11. 从DB2命令行执行 NEST_DIAGN 存储过程的结果C:Program FilesIBMSQLLIBBIN>db2 call nest_diagn(?,?)Value of output parameters--Parame

如果从DB2命令行执行 NEST_DIAGN 存储过程,将得到以下结果:

清单 11. 从DB2命令行执行 NEST_DIAGN 存储过程的结果

C:Program FilesIBMSQLLIBBIN>db2 call nest_diagn(?,?)
 Value of output parameters
 --------------------------
 Parameter Name : RET_CODE1
 Parameter Value : 2
 Parameter Name : RET_CODE2
 Parameter Value : 0
 Return Status = 0

请注意,这里需要 DECLARE 一个变量,用于接受 DB2_RETURN_STATUS的值。

在存储过程之间共享数据

前面的例子展示了存储过程如何使用参数和RETURN语句来共享数据。现在,我们来看看 2个(或更多)存储过程如何共享来自同一个游标的相同的结果集。

过程result_from_cursor 从STAFF 和ORG 表获取某个特定部门的每个工人的姓名、工作描述、佣金和位置:

清单 12. 返回结果集的过程的例子

CREATE PROCEDURE result_from_cursor (deptin int)
  DYNAMIC RESULT SETS 1
P1: BEGIN
  -- Declare cursor
  DECLARE cursor1 CURSOR WITH RETURN FOR
    SELECT a.name, a.job, COALESCE(a.comm,0), b.locatioN
     FROM staff a, org b
     where a.dept = b.deptnumb
     AND a.dept = deptin;
  OPEN cursor1;
END P1

例如,对于部门 51,可得到以下结果集:

清单 13.部门 51的结果集

NAME   JOB  COMMISSION   LOCATION
 --------- ----- --------------- -------------
 Fraye   Mgr       0.00 Dallas
 Williams Sales     637.65 Dallas
 Smith   Sales     992.80 Dallas
 Lundquist Clerk     189.65 Dallas
 Wheeler  Clerk     513.30 Dallas

现在,您想在另一个存储过程中使用来自这个存储过程的结果集(不是将它存储在临时或永久表中)。

DB2 允许一个外部存储过程使用来自一个内部存储过程的结果集。下面是相应的步骤:

使用以下语法声明一个结果集定位符:

DECLARE rs_locator_var1 RESULT_SET_LOCATOR VARYING;

将这个结果集定位符与调用者过程相关联:

ASSOCIATE RESULT SET LOCATOR( rs_locator_var1) WITH PROCEDURE proc_called;

分配从调用过程指向结果集的游标:

ALLOCATE cursor1 CURSOR FOR RESULT SET rs_locator_var1;

下面的例子演示了所有这些方法:

清单 14. 使用来自嵌套过程的结果集

CREATE PROCEDURE Use_nested_cursor (deptin int, OUT tot_dept_comm DEC(12,2))
 BEGIN

  DECLARE sqlcode int default 0;
  DECLARE v_comm DECIMAL(12,2) DEFAULT 0.0;
  DECLARE v_name, v_location varchar(20);
  DECLARE v_job char(6);

  DECLARE LOC1 RESULT_SET_LOCATOR VARYING;

  SET tot_dept_comm = 0;
  CALL result_from_cursor(deptin);
  ASSOCIATE RESULT SET LOCATOR( LOC1) WITH PROCEDURE result_from_cursor;
  ALLOCATE C1 CURSOR FOR RESULT SET LOC1;
  FETCH FROM C1 INTO v_name,v_job,v_comm,v_location;
  WHILE sqlcode = 0 DO
      SET tot_dept_comm = tot_dept_comm + v_comm;
   FETCH FROM C1 INTO v_name,v_job,v_comm,v_location;
  END WHILE;
END

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:DB SQL Procedure

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接