Informix rowtype在视图中返回分配列

时间:2011-02-11 21:39:52

标签: sql informix

我正在尝试使用在存储过程中返回的命名行类型,并将这些列放入视图中。 最终目标是这样的观点:

select * from view_tmp
table_f1  table_f1_val
table_f2  1
table_f3  2
f1        f1_val
f2        f2_val
f3        v3_val

我遇到的问题是存储过程对于我要撤回的每个字段都运行一次。

create view view_tmp (table_f1,table_f2,table_f3, f1, f2, f3) as (
select  a.table_f1,a.table_f2,a.table_f3,
        feat_proc_tmp(a.table_f1,a.table_f2).f1,
        feat_proc_tmp(a.table_f1,a.table_f2).f2,
        feat_proc_tmp(a.table_f1,a.table_f2).f3
from table_tmp a)

这会运行feat_proc_tmp 3次,这是不好的(数据明智和性能明智) 我的过程返回一个rowtype,那么如何以不同的方式访问它们以将数据放入视图而不运行它3次?这与我的尝试尽可能接近,但这不会进入视图(也许它可以,我无法弄明白?):

select *,feat_proc_tmp('1',1) from table_tmp
table_f1      table_f1_val
table_f2      1
table_f3      2
(expression)  ROW('f1_val','f2_val','v3_val')

这是重新创建的SQL:

drop row type features_tmp restrict;
drop procedure feat_proc_tmp;
drop table table_tmp;
drop view view_tmp;
create row type features_tmp (
f1 varchar(255),
f2 varchar(255),
f3 varchar(255)
);
create procedure feat_proc_tmp (Ipass char(10), product_id int)
returning features_tmp;
RETURN ROW('f1_val','f2_val','v3_val')::features_tmp;
end procedure;
create table table_tmp (
        table_f1 char(16),
        table_f2 int,
        table_f3 int
);
insert into table_tmp values ('table_f1_val',1,2);
create view view_tmp (table_f1,table_f2,table_f3, f1, f2, f3) as (
select  a.table_f1,a.table_f2,a.table_f3,
        feat_proc_tmp(a.table_f1,a.table_f2).f1,
        feat_proc_tmp(a.table_f1,a.table_f2).f2,
        feat_proc_tmp(a.table_f1,a.table_f2).f3
from table_tmp a)

这是在Informix v11上。我有一个想法就是把这个程序作为一个表加入,然后从中拉出来,但我找不到一个可以在这里工作的格式 - :

select a.*,b.* from table_tmp a CROSS JOIN TABLE (feat_proc_tmp('1',1)) b

将b。*作为ROW()返回,如果我尝试

select a.*,b.f1 from table_tmp a CROSS JOIN TABLE (feat_proc_tmp('1',1)) b

然后在查询的任何表中找不到列f1。

1 个答案:

答案 0 :(得分:0)

我似乎偶然发现11.5 FC6W2中的错误,如果我在FC6或FC4上执行此操作,则存储过程仅在我的第一个示例中执行一次。所以升级解决了我的问题。