存储过程返回值 Db2

时间:2021-06-01 03:41:54

标签: db2

 CREATE PROCEDURE A()
   LANGUAGE SQL
   RESULT SETS 1
   BEGIN
      DECLARE C1 CURSOR WITH RETURN FOR
         SELECT id, name, dept, job FROM staff;
      OPEN C1;
   END

 CREATE PROCEDURE B()
   LANGUAGE SQL
   BEGIN
        Call a ;
   END

在编程中,他们不使用存储过程来返回值(他们使用函数)。为什么 DB2 支持这种方式?

在我上面的例子中,存储过程 B 如何知道存储过程 A 的 c1 游标?如果我在存储过程 B 中声明一个游标 (c2 cursor) 并发送到存储过程 A。存储过程 A 有一个参数 (OUT c2 cursor),那么为什么我必须写 'RESULT SETS 1' (Can' t 我省略了那个短语),因为我没有从存储过程 A 返回任何游标(我通过参数返回)。

1 个答案:

答案 0 :(得分:2)

您可能会从一些有关 SQL PL 的教育和培训中受益。

如果您更喜欢纸质书,请阅读 Paul Yip、Drew Bradstock 和其他人的“Db2 SQL Procedural Language for Linux, Unix, and Windows”。 ISBN 0-13-100772-6。

Stackoverflow 不能替代培训和教育。

您应该针对不同的主题提出不同的问题。

研究 Db2 的“表函数”以了解如何从函数返回表。

研究 Db2“强类型游标”和 Db2“弱类型游标”和流水线函数,以了解如何在例程中利用游标参数。了解与这些事情相关的许多限制和规则,这是一个问题无法通过一个例子来表达的。特别要意识到SQL PL游标参数只能由SQL PL完全操作,目前不能传递给其他语言进行处理(jdbc除外,它支持使用此类游标)。因此,如果您的前端客户端使用 C、C++、Python、Javascript、.Net、PHP 等,那么您目前不会使用 SQL PL 游标参数。不过,您可以在 Db2 SQL PL 代码中使用它们,具体取决于您的技能和需求。

要使用嵌套存储过程的结果集,您需要额外的语法。当从存储过程返回结果集时,定义过程时需要 dynamic result sets 子句。许多不同的编程语言和框架以及其他 RDBMS 工具都理解以这种方式返回结果集,因此也是将数据从 RDBMS 返回到第三代编程语言的最通用的方法。可以基于此技术构建其他机制。

所有这些语法都记录在您的版本和平台的 Db2 知识中心中。一个例子无法表达所有可能的语法。

这里有一个例子,如果你有搜索能力,你会在网上找到很多其他的。

--#SET TERMINATOR @
CREATE or replace PROCEDURE procA()
   LANGUAGE SQL 
   RESULT SETS 1
   BEGIN
      DECLARE C1 CURSOR WITH RETURN TO CALLER FOR 
         SELECT id, name, dept, job FROM staff;
      OPEN C1; 
   END 
@

set serveroutput on@ 

CREATE or replace PROCEDURE B() 
LANGUAGE SQL 
BEGIN
   declare sqlstate char(5) default '00000';
   declare v_rs result_set_locator varying;
   declare v_id smallint;
   declare v_dept smallint;
   declare v_name varchar(9);
   declare v_job char(5);
   Call procA() ;
   associate result set locator (v_rs) with procedure procA;
   allocate v_rscur cursor for result set v_rs;
   fetch from v_rscur into v_id, v_name, v_dept, v_job;
   while ( sqlstate = '00000') do
       -- do something with the values just fetched...
       -- i.e. process the data in the current row of the result-set
      call dbms_output.put_line('id:'||varchar(v_id)||' name: '||v_name||' dept: '||varchar(v_dept)||' job: '||v_job);
      -- in this example just write the data to the output stream
      fetch from v_rscur into v_id, v_name, v_dept, v_job;
   end while;
   return;
END
@
相关问题