Informix возвращают тип строки в представлении, присваивая столбцы - PullRequest
1 голос
/ 12 февраля 2011

Я пытаюсь использовать именованный тип строки, который возвращается в хранимой процедуре, и помещаю эти столбцы в представление.Конечной целью было бы следующее представление:

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.Одна мысль, которая у меня возникла, состояла в том, чтобы присоединиться к процедуре в виде таблицы, а затем извлечь из нее, но я не могу найти формат, который будет работать здесь -

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

возвращает b. * Как строку () поэтому, если я попытаюсь

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

, тогда произойдет столбец f1, не найденный ни в одной таблице в запросе.

1 Ответ

0 голосов
/ 21 февраля 2011

Я, кажется, наткнулся на ошибку в 11.5 FC6W2, если я делаю это на FC6 или FC4, хранимая процедура выполняется только один раз в моем первом примере.Таким образом, обновление решило мою проблему.

...