Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Informix Новый топик    Ответить
 Как в процедуре работать с записями а не отдельными полями?  [new]
Andron
Member

Откуда: Cherepovets
Сообщений: 1816
Пример того чего пытаюсь сделать (псевдокод):

define
  row_emp employees%rowtype;
...
  select * into row_emp from employees  where employee_id = Val1;
end;

Т.е. просто определяю запись с типом записи из таблицы, и потом работаю целиком с этой записью.
Как это сделать в Информиксе? Пытался использовать row type но это вроде немного не то. Тут бы тип record ...
Надо чтобы не перечислять определения переменных и кучу полей в выборках типа

 select f1, f2, ..., fn into v1, v2, ..., vn from table1 ;
 ...
 insert into table2 values (v1, v2, ..., vn);
21 сен 11, 11:44    [11310386]     Ответить | Цитировать Сообщить модератору
 Re: Как в процедуре работать с записями а не отдельными полями?  [new]
АнатоЛой
Member

Откуда: Киев, Украина
Сообщений: 2893
Блог
Andron

 select f1, f2, ..., fn into v1, v2, ..., vn from table1 ;
 ...
 insert into table2 values (v1, v2, ..., vn);



insert into table2 
 select f1, f2, ..., fn from table1 ;
не?
21 сен 11, 12:57    [11311170]     Ответить | Цитировать Сообщить модератору
 Re: Как в процедуре работать с записями а не отдельными полями?  [new]
Andron
Member

Откуда: Cherepovets
Сообщений: 1816
АнатоЛой,

Нет, не то. Я не зря там многоточие между select и insert поставил, там много чего может быть, проверки разные, и т.д. Поэтому простой insert тут не пойдет.
Было бы неплохо иметь в SPL тип record как в некоторых других базах со свойствами которые я описал в первом посте а также с доступом к отдельным полям (это же record).
21 сен 11, 14:23    [11312171]     Ответить | Цитировать Сообщить модератору
 Re: Как в процедуре работать с записями а не отдельными полями?  [new]
АнатоЛой
Member

Откуда: Киев, Украина
Сообщений: 2893
Блог
Andron, в 7.31 для этой цели годились TEMP TABLE WITH NO LOG...
Даже если в них одна строчка :). Правда, возня с "дропаньем"...
Вариант?
21 сен 11, 14:51    [11312495]     Ответить | Цитировать Сообщить модератору
 Re: Как в процедуре работать с записями а не отдельными полями?  [new]
Andron
Member

Откуда: Cherepovets
Сообщений: 1816
АнатоЛой,

У меня 11.50, вариант с временной таблицей я тоже рассматривал, вполне кстати может и подойдет. Но придется как то ограничивать чтобы в такой таблице было не больше одной записи. Триггер before insert например навешивать на нее. Да и с производительностью такого решения тоже не все ясно.
21 сен 11, 14:58    [11312561]     Ответить | Цитировать Сообщить модератору
 Re: Как в процедуре работать с записями а не отдельными полями?  [new]
АнатоЛой
Member

Откуда: Киев, Украина
Сообщений: 2893
Блог
Andron, а ещё ты же версию не наззвал :). В IDS c 10-ки появился тип данных ROW :).
Для 11.70 смотри тут. Особенности использования могут понравиться, могут нет - на любителя :).
21 сен 11, 14:59    [11312566]     Ответить | Цитировать Сообщить модератору
 Re: Как в процедуре работать с записями а не отдельными полями?  [new]
АнатоЛой
Member

Откуда: Киев, Украина
Сообщений: 2893
Блог
Andron
АнатоЛой,

У меня 11.50, вариант с временной таблицей я тоже рассматривал, вполне кстати может и подойдет. Но придется как то ограничивать чтобы в такой таблице было не больше одной записи. Триггер before insert например навешивать на нее. Да и с производительностью такого решения тоже не все ясно.

С триггером для временной таблицы - это ты жёстко...

Проверок типа "SELECT count(*) FROM temp_table" или "SELECT dbinfo("sqlca.sqlerrdx")" после INSERT'а тебе не хватит?
Кроме того, в некоторых случаях от доп.записей даже польза - с чувством, толком и расстановкой можешь выяснить чем же "лишние" данные отличаются от искомой строки при отладке... :). А с производительностью всегда вопрос, не только с временными таблицами, производительность проверять и так, и так надо :(.
21 сен 11, 15:05    [11312618]     Ответить | Цитировать Сообщить модератору
 Re: Как в процедуре работать с записями а не отдельными полями?  [new]
Andron
Member

Откуда: Cherepovets
Сообщений: 1816
АнатоЛой
Andron, а ещё ты же версию не наззвал :). В IDS c 10-ки появился тип данных ROW :).
...


Я про row в первом посте написал, не получаются с ним такие фокусы, мб я неправильно его готовил но работает только так:

create table t1 (
id int,
f1 char);

insert into t1 values (1, 'a');

create procedure row_test ()
define
  row1 row (id int, f1 char);
  let row1 = row(null, null); -- если значение не инициализировать то при execute будет ошибка !!!
  select * into row1.id, row1.f1 from t1 where id = 1; 
  -- select * into row1 from t1 where id = 1; -- -661    Number of variables does not match number of values returned.
end procedure;

update statistics for procedure row_test2;
execute procedure row_test2();

Т.е. получается примерно то же самое как и при использовании с переменными, а вот например так не работает

select * into row1 from t1 where id = 1; -- -661 Number of variables does not match number of values returned.

он как бы не видит что я ему не просто переменную подставляю а row, и вот это на мой взгляд является недоработкой данного типа.
21 сен 11, 15:26    [11312841]     Ответить | Цитировать Сообщить модератору
 Re: Как в процедуре работать с записями а не отдельными полями?  [new]
Andron
Member

Откуда: Cherepovets
Сообщений: 1816
Там в примере обновление статистики и запуск конечно для процедуры row_test а не для row_test2 т.е. так:

...

update statistics for procedure row_test;
execute procedure row_test();
21 сен 11, 15:29    [11312868]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как в процедуре работать с записями а не отдельными полями?  [new]
cpr
Member

Откуда: Rostov-on-Don
Сообщений: 697
Andron,

--drop procedure row_test;
create procedure row_test ()
define row1 row (id int, f1 char);
let row1 = row(null, null); -- если значение не инициализировать то при execute будет ошибка !!!
select row (id, f1) into row1 from t1 where id = 1; -- -661 Number of variables does not match number of values returned.
end procedure;

update statistics for procedure row_test;
execute procedure row_test();
17 фев 15, 09:39    [17274788]     Ответить | Цитировать Сообщить модератору
 Re: Как в процедуре работать с записями а не отдельными полями?  [new]
cpr
Member

Откуда: Rostov-on-Don
Сообщений: 697
cpr
Andron,

--drop procedure row_test;
create procedure row_test ()
define row1 row (id int, f1 char);
let row1 = row(null, null); -- если значение не инициализировать то при execute будет ошибка !!!
select row (id, f1) into row1 from t1 where id = 1; -- -661 Number of variables does not match number of values returned.
end procedure;

update statistics for procedure row_test;
execute procedure row_test();


В том смысле, что так работает.
17 фев 15, 09:40    [17274791]     Ответить | Цитировать Сообщить модератору
 Re: Как в процедуре работать с записями а не отдельными полями?  [new]
cpr
Member

Откуда: Rostov-on-Don
Сообщений: 697
Коллеги, подскажите плиз.
Старая проблема если я создаю таблицу с типом row, то ее нельзя альтерить - осталась в 12.10?
17 фев 15, 09:42    [17274795]     Ответить | Цитировать Сообщить модератору
Все форумы / Informix Ответить