我正在 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 文档中的多篇文章,但无法找到确切的解决方案。任何指针的帮助都会有很大帮助。
答案 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 示例。