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 返回任何游标(我通过参数返回)。
答案 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
@