存储过程 return 值 Db2

Stored procedure return value 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

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

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

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

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

Whosebug 不能替代培训和教育。

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

研究 Db2 'table functions' 以了解如何从函数 return table。

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

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

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