存储过程返回值Db2

存储过程返回值Db2,db2,Db2,在编程中,它们不使用存储过程返回值(它们使用函数)。为什么DB2支持这种方式 在我上面的例子中,存储过程B如何从存储过程A知道c1游标?如果我在存储过程B中声明一个游标(c2游标),并发送到存储过程a。存储过程a有一个参数(OUT c2游标),那么为什么我必须写“RESULT SETS 1”(我不能省略这个短语),因为我不从存储过程a返回任何游标(我通过参数返回).您可能会从一些有关SQL PL的教育和培训中受益 如果您喜欢纸质书,请阅读Paul Yip、Drew Bradstock和其他人的“

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


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

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

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

Stackoverflow不能替代培训和教育

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

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

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

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

所有这些语法都记录在您的版本和平台的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

实际上,我们至少能够从JDBC访问游标参数。接受,回答澄清。现在还不知道IBM将来会把它带到哪里去。
--#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
@