2011-02-11 7 views
1

ストアドプロシージャで返される名前付きの行タイプを使用して、これらの列をビューに配置しようとしています。 最終目標は、このようなビューになります:Informixのrowtypeは、列を割り当てるビューに戻ります。

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回実行されます(データ賢明にし、パフォーマンスが賢明) 私の手順は、行型を返すので、どのように私はそれを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にあります。一つは、私がテーブルとして手続に参加して、そこからプルするだろうと思っていたが、私はhere-動作する形式見つけることができません:。

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が見つかりません。

答えて

0

私はFC6またはFC4でこれを行うと11.5 FC6W2のバグに遭遇したようですが、ストアドプロシージャは最初の例では1回しか実行されません。そこで、アップグレードで私の問題は解決しました。

関連する問題