如何在DB2中对存储过程的结果进行筛选
我在DB2中有一个存储过程,它返回一组列。我需要应用一个“WHERE”条件,或者对它返回的一列进行排序。我不想在调用存储过程时触摸存储过程并进行过滤/排序,如下所示如何在DB2中对存储过程的结果进行筛选,db2,db2-luw,Db2,Db2 Luw,我在DB2中有一个存储过程,它返回一组列。我需要应用一个“WHERE”条件,或者对它返回的一列进行排序。我不想在调用存储过程时触摸存储过程并进行过滤/排序,如下所示 select * from 'call SP1()' as T where T.column1 > 10 这在DB2中是可能的吗?这里是一个经过精心设计的流水线UDF示例,它过滤SQLPL过程的结果集 在现实世界的编码中,大多数程序员都会避免在存储过程之外进行过滤,原因很简单,因为它更容易、性能更好,而且在尽可能早的时候进行
select * from 'call SP1()' as T where T.column1 > 10
这在DB2中是可能的吗?这里是一个经过精心设计的流水线UDF示例,它过滤SQLPL过程的结果集 在现实世界的编码中,大多数程序员都会避免在存储过程之外进行过滤,原因很简单,因为它更容易、性能更好,而且在尽可能早的时候进行过滤更自然 在Db2 LUW v11.1.3.3和11.1.2.2上测试,Db2_COMPATIBILITY_MODE=ORA(或至少在0x10000中设置为1的位-17,向p.Vernon确认此澄清):
只需做一个过滤过程的另一个存储过程,可能是一个更明智的方法,更简单。考虑使用一个返回表值的用户定义函数。您可以从表UDF中进行选择(使用
select*fromtable(YOUR_UDF())
),UDF可以执行SPs可以执行的许多操作。您还可以在UDF中调用SP,并在需要时将SP返回的行导出为管道()。您可以在“答案”中给我一个管道()的示例吗?好的。我的第二条语句错了,UDF可以管道()输出行,但UDF不能从SP访问结果集,只能访问out或INOUT参数。很抱歉让你充满希望。因此,mao是正确的,请将您的SP包装到另一个SP中。否则,请从SP内部复制代码并将其放入UDF中。。根据SP正在执行的操作,您可以在表值UDF中执行相同的操作,而我在上面所说的是不正确的。。见下面的答案。很高兴看到您可以使用管道()从表UDF中导出SP结果集。我觉得这是可能的,但当检查KC时,它说它不是:“当在触发器、复合语句、函数或方法中调用过程时:无法访问该过程返回的结果集。”。有时候,最好只是尝试一下,因为在11.1.3.3中,该代码对我不起作用。我得到用户 定义 例行公事。。。企图 到 修改 数据 但是 是 不 定义 作为 修改 SQL 资料...SQLCODE=-577代码>。如果我添加修改 SQL 资料代码>然后我得到多个 或 矛盾的 关键词 涉及 这个 "“修改SQL数据” 条款 是 目前.. SQLCODE=-628代码>对我有效,但仅在11.1.3.3上有效(即,在11.1.2.2上出现与您相同的症状)。假设您的fp3 mod3已提交,请尝试新创建的数据库,或针对该数据库成功运行相关的db2updv111*。同样失败的是,如果您的构建级别标识符与我的不同,那么显示db2set-all和db2level的输出(“0204010F”)是的,仅适用于db2set DB2_COMPATIBILITY\u VECTOR=ORA
和db2stop/start。好的,特别是,如果需要在向量上设置第17位db2set DB2\u COMPATIBILITY\u vector=10000
,这是有意义的,因为这是“例程(存储过程或用户定义函数)可以执行SQL语句的程度”,这解释了为什么手册的其他部分说它不允许。。。
--#SET TERMINATOR @
create or replace procedure alltabs
dynamic result sets 1
language sql
specific alltabs
begin
declare v_cur cursor with return to caller for
select tabschema,tabname,type from syscat.tables ;
open v_cur;
end@
create or replace function allstatviews()
returns table (stat_view_name varchar(80))
begin
declare v_rs result_set_locator varying;
declare v_tabschema varchar(128);
declare v_tabname varchar(128);
declare v_type char(1);
declare sqlstate char(5) default '00000';
call alltabs;
associate result set locator (v_rs) with procedure alltabs;
allocate v_rscur cursor for result set v_rs;
fetch from v_rscur into v_tabschema, v_tabname, v_type;
while ( sqlstate = '00000') do
if v_type='V' and v_tabschema='SYSSTAT'
then
pipe(cast(rtrim(v_tabschema)||'.'||rtrim( v_tabname) as varchar(80)));
end if;
fetch from v_rscur into v_tabschema, v_tabname, v_type;
end while;
return;
end@
select * from table(allstatviews())
@