如何在DB2中对存储过程的结果进行筛选

如何在DB2中对存储过程的结果进行筛选,db2,db2-luw,Db2,Db2 Luw,我在DB2中有一个存储过程,它返回一组列。我需要应用一个“WHERE”条件,或者对它返回的一列进行排序。我不想在调用存储过程时触摸存储过程并进行过滤/排序,如下所示 select * from 'call SP1()' as T where T.column1 > 10 这在DB2中是可能的吗?这里是一个经过精心设计的流水线UDF示例,它过滤SQLPL过程的结果集 在现实世界的编码中,大多数程序员都会避免在存储过程之外进行过滤,原因很简单,因为它更容易、性能更好,而且在尽可能早的时候进行

我在DB2中有一个存储过程,它返回一组列。我需要应用一个“WHERE”条件,或者对它返回的一列进行排序。我不想在调用存储过程时触摸存储过程并进行过滤/排序,如下所示

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())
@