我在DB2存储过程返回一串列。 我需要应用“WHERE”条件或做一个排序上返回的一列。 我不想碰的存储过程和调用存储过程时这样做过滤/排序,类似下面
select * from 'call SP1()' as T where T.column1 > 10
这是可能的DB2?
我在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(或至少位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())
@