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

db2中具有游标返回类型的存储过程,db2,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))

我正在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   
由于游标中定义的第一个名称在employee表中的长度不同(游标有120个,而表有128个),因此出现错误

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


我想知道,对于这种场景,是否确实有一些解决方案专门针对db2。我是db2新手,正在使用10.5.7版。我还研究了IBM文档中的多篇文章,但没有找到确切的解决方案。指针的任何帮助都将非常有用。

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

DB2SQLPL还支持弱游标,SQLPL过程输出参数类型可以是弱游标。这意味着存储过程声明可以使用
…OUT p_cur CURSOR
(因此没有预先分配的用户定义类型链接到该游标),然后从不同的查询中分配该输出参数(
设置p_cur=CURSOR FOR SELECT…
)。在我的例子中,调用方总是SQL(不是jdbc),但是您可以尝试使用jdbc,因为IBM在DB2LUV11.5中给出了一个示例

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


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

我将建立JDBC连接并执行SP以获取结果。我对甲骨文方面比较熟悉,过去经常安静地完成这些任务。然而,我当前的任务是db2 for database。我们正在从Sybase迁移到db2。如果这种操作在db2中不可能实现,那么我可能会在java端直接进行某种实体管理,以模拟Sybase SP逻辑。然而,我想检查db2端是否存在解决方案,因为在java端模拟逻辑将有多个查询可能会影响性能。我想我尝试过,但在JDBC端,我无法获取多行。你有参考资料要核对吗,这样我就可以重新核对我所做的事了?谢谢你提供的详细资料。。让我再看看