我在DB2中有一个存储过程,它返回一堆列。我需要应用'WHERE'条件或对它返回的一个列进行排序。我不想触摸存储过程并在调用存储过程时执行此过滤/排序,如下所示
select * from 'call SP1()' as T where T.column1 > 10
这在DB2中是否可行?
答案 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())
@