db2 中带有游标返回类型的存储过程

时间:2020-12-31 19:11:32

标签: db2

我正在 db2 中开发一个存储过程 (SP),它将以输出游标的形式返回一些数据,但不同字段的字段长度可能会有所不同。我遇到了问题,因为我无法针对此要求进行 SP 编译。下面是代码供参考

 create table employee(id bigint,first_name varchar(128),last_name varchar(128));
 create table employee_designation(id bigint, emp_id bigint, 
designation varchar(128));
 create type empRowType as row(first_name varchar(128),last_name varchar(128),
designation varchar(128));
 create type empCursorType as empRowType cursor;

 create procedure emp_designation_lookup(in p_last_name varchar(128), out emp_rec empCursorType) 
 result sets 0
 language SQL
 begin
    set emp_rec = cursor for select a.first_name,a.last_name,b.designation
                        from employee a, employee_designation b
                        where a.id=b.EMP_ID
                        and a.LAST_NAME = p_last_name;
 end;                        
     

上述 SP 编译并按预期返回结果。但是,如果我更改行定义如下

create type empRowType as row(first_name varchar(120),last_name varchar(128),
designation varchar(128));

在重新编译 SP 时,出现以下错误

BMS sample -- [IBM][CLI Driver][DB2/NT64] SQL0408N  A value is not compatible with the 
data type of its assignment target. Target name is "EMP_REC".  LINE NUMBER=5.  SQLSTATE=42821   

错误是因为在游标中定义的 first_name 在表员工中的长度不同(游标有 120 而表有 128)

但是,对于我的实际工作,我需要根据某些逻辑计算返回值,因此游标中指定的长度将与表中的长度不同。此外,我在游标中有一些与表列无关的新列(例如确定奖金金额或员工是否应该晋升等)。

我想知道是否确实有一些针对 db2 的场景的解决方案。我是 db2 的新手,正在使用 10.5.7 版。我还浏览了 IBM 文档中的多篇文章,但无法找到确切的解决方案。任何指针的帮助都会有很大帮助。

1 个答案:

答案 0 :(得分:1)

当您使用强类型游标时,任何涉及该游标的赋值都必须与相关类型完全匹配。否则编译器会抛出异常,这是你的症状。

Db2 SQL PL 也支持弱游标,SQL PL 过程输出参数类型可以是弱游标。这意味着存储过程声明可以使用 ...OUT p_cur CURSOR (因此没有预分配的用户定义类型链接到该游标),然后从不同的查询 ( set p_cur = CURSOR FOR SELECT ... ) 分配该输出参数。在我的情况下,调用者始终是 SQL(不是 jdbc),但您可以尝试使用 jdbc,因为 IBM 在 Db2-LUW v11.5 documentation 中给出了一个示例。

大多数人使用简单的结果集(而不是返回的游标)来从存储过程中的查询中获取输出。这些结果集可供各种客户端应用程序(jdbc、odbc、cli)和使用这些接口的语言(java、.net、python、php、perl、javascript、命令行/脚本等)使用。因此,简单的结果集提供了返回游标参数的更通用的可用性。

IBM 在不同位置(在 github 上、在 Db2 服务器实例目录的示例目录树中、在知识中心等中)发布各种 Db2 示例。

相关问题