Гость
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / Как в процедуре работать с записями а не отдельными полями? / 12 сообщений из 12, страница 1 из 1
21.09.2011, 11:44
    #37449424
Andron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в процедуре работать с записями а не отдельными полями?
Пример того чего пытаюсь сделать (псевдокод):

Код: plaintext
1.
2.
3.
4.
5.
define
  row_emp employees%rowtype;
...
  select * into row_emp from employees  where employee_id = Val1;
end;

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

Код: plaintext
1.
2.
3.
 select f1, f2, ..., fn into v1, v2, ..., vn from table1 ;
 ...
 insert into table2 values (v1, v2, ..., vn);
...
Рейтинг: 0 / 0
21.09.2011, 12:57
    #37449620
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в процедуре работать с записями а не отдельными полями?
Andron
Код: plaintext
1.
2.
3.
 select f1, f2, ..., fn into v1, v2, ..., vn from table1 ;
 ...
 insert into table2 values (v1, v2, ..., vn);



Код: plaintext
1.
2.
insert into table2 
 select f1, f2, ..., fn from table1 ;
не?
...
Рейтинг: 0 / 0
21.09.2011, 14:23
    #37449897
Andron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в процедуре работать с записями а не отдельными полями?
АнатоЛой,

Нет, не то. Я не зря там многоточие между select и insert поставил, там много чего может быть, проверки разные, и т.д. Поэтому простой insert тут не пойдет.
Было бы неплохо иметь в SPL тип record как в некоторых других базах со свойствами которые я описал в первом посте а также с доступом к отдельным полям (это же record).
...
Рейтинг: 0 / 0
21.09.2011, 14:51
    #37449946
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в процедуре работать с записями а не отдельными полями?
Andron, в 7.31 для этой цели годились TEMP TABLE WITH NO LOG...
Даже если в них одна строчка :). Правда, возня с "дропаньем"...
Вариант?
...
Рейтинг: 0 / 0
21.09.2011, 14:58
    #37449961
Andron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в процедуре работать с записями а не отдельными полями?
АнатоЛой,

У меня 11.50, вариант с временной таблицей я тоже рассматривал, вполне кстати может и подойдет. Но придется как то ограничивать чтобы в такой таблице было не больше одной записи. Триггер before insert например навешивать на нее. Да и с производительностью такого решения тоже не все ясно.
...
Рейтинг: 0 / 0
21.09.2011, 14:59
    #37449963
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в процедуре работать с записями а не отдельными полями?
Andron, а ещё ты же версию не наззвал :). В IDS c 10-ки появился тип данных ROW :).
Для 11.70 смотри тут . Особенности использования могут понравиться, могут нет - на любителя :).
...
Рейтинг: 0 / 0
21.09.2011, 15:05
    #37449978
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в процедуре работать с записями а не отдельными полями?
AndronАнатоЛой,

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

Проверок типа "SELECT count(*) FROM temp_table" или "SELECT dbinfo("sqlca.sqlerrdx")" после INSERT'а тебе не хватит?
Кроме того, в некоторых случаях от доп.записей даже польза - с чувством, толком и расстановкой можешь выяснить чем же "лишние" данные отличаются от искомой строки при отладке... :). А с производительностью всегда вопрос, не только с временными таблицами, производительность проверять и так, и так надо :(.
...
Рейтинг: 0 / 0
21.09.2011, 15:26
    #37450035
Andron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в процедуре работать с записями а не отдельными полями?
АнатоЛойAndron, а ещё ты же версию не наззвал :). В IDS c 10-ки появился тип данных ROW :).
...


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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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, и вот это на мой взгляд является недоработкой данного типа.
...
Рейтинг: 0 / 0
21.09.2011, 15:29
    #37450043
Andron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в процедуре работать с записями а не отдельными полями?
Там в примере обновление статистики и запуск конечно для процедуры row_test а не для row_test2 т.е. так:

Код: plaintext
1.
2.
3.
4.
...

update statistics for procedure row_test;
execute procedure row_test();
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
17.02.2015, 09:39
    #38881320
cpr
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();
...
Рейтинг: 0 / 0
17.02.2015, 09:40
    #38881322
cpr
cpr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в процедуре работать с записями а не отдельными полями?
cprAndron,

--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();

В том смысле, что так работает.
...
Рейтинг: 0 / 0
17.02.2015, 09:42
    #38881324
cpr
cpr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в процедуре работать с записями а не отдельными полями?
Коллеги, подскажите плиз.
Старая проблема если я создаю таблицу с типом row, то ее нельзя альтерить - осталась в 12.10?
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / Как в процедуре работать с записями а не отдельными полями? / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]