如何过滤DB2

时间:2018-04-19 14:32:54

标签: db2 db2-luw

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

select * from 'call SP1()' as T where T.column1 > 10

这在DB2中是否可行?

1 个答案:

答案 0 :(得分:1)

这是一个流水线UDF的故意人工示例,用于过滤SQLPL过程的结果集。

在现实世界的编码中,大多数程序员都会避免在存储过程之外进行过滤,只是因为它更容易,性能更好,并且更自然地尽早过滤。

在Db2-LUW v11.1.3.3和11.1.2.2上使用DB2_COMPATIBILITY_MODE = ORA进行测试(或至少将Bit-17设置为1,如0x10000,对P.Vernon的确认澄清):

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