Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обновление LONG RAW [D1, D2, D3, D4, D5, D6]


Mixa ©   (2003-04-01 12:17:00) 

Есть таблица
create table test ( n numeric, l long raw)
Необходимо в случае, если запись с заданным n уже
существует, модифицировать в ней поле l, иначе
добавить новую запись с соответствующими значениями полей.

update ... where ..., insert into ... не подходит из-за наличия поля типа long raw заменить его на blob я не могу: база - тяжелое наследие прошлого ;[

я реализовал это таким образом (использую BDE):

Вариант 1.
1. delete from test where n=:key
2. Table.Append;
Table.FieldByName("N").Value := key;
Table.FieldByName("L").Value := ...;
Table.Post;

Вариант 2.
if Table.Locate("N",key,[]) then
Table.Edit;
else
begin
Table.Append;
Table.FieldByName("N").Value := key;
end;
Table.FieldByName("L").Value := ...;
Table.Post;

Вариант 1 мне не нравится, так как я считаю, что постоянное удаление/добавление записей не улучшит производительности БД,
в варианте 2 сомнение вызывает функция Locate - я не знаю,
поиск происходит на стороне клиента или сервера ?

Хотелось бы узнать, а как надо.


Mixa   (2003-04-01 16:02:00) [1]

Понял, спасибо.


Соловьев   (2003-04-01 16:00:00) [2]


> Как я смогу отменить добавление этой записи ?

удалить дубликат.


Mixa   (2003-04-01 15:36:00) [3]

Допустим в таблице есть запись (1, "ААА...") и я пытаюсь
добавить запись (1, "БББ..."). Мне нужно, чтобы была найдена
запись (1, "ААА...") и "ААА..." поменялось на "БББ...". После
этого в таблице должна быть единственная запись (1, "БББ...").
Если сделать триггер AFTER|BEFORE INSERT, СУБД добавит запись
и вызовет мою ХП. Допустим я в своей ХП организую поиск
и найду существующую запись (1, "ААА..."), сделаю UPDATE и т.д,
но после в этого в таблице будет две записи: (1, "БББ...") и
пустая (), только что добавленная.
Как я смогу отменить добавление этой записи ?
Или я чего то не понимаю ?


Соловьев   (2003-04-01 15:10:00) [4]


> добавлена, даже если
> она уже существует ?

это как?


Mixa   (2003-04-01 15:08:00) [5]

Но ведь запись все равно будет добавлена, даже если
она уже существует ?


Соловьев   (2003-04-01 15:02:00) [6]

ставим траггер на добавление записи и там запускаем ХП.


Mixa   (2003-04-01 15:00:00) [7]

Всем спасибо, метод, предложенный Наталией мне подошел.

2 Соловьев. Я, вроде, поставил галочку возле "Oracle", а
в заголовке темы он не появился :( я и не обратил внимания.
А про триггер то объяснить можешь?


Соловьев   (2003-04-01 12:41:00) [8]

с Oracle не знаком. А догадаться я не мог - не телепат.


Наталия   (2003-04-01 12:40:00) [9]

Для обновления поля long raw я использовала обычный запрос update ... where с параметрами (у меня в этом поле хранится картинка)
примерно таким образом:
sql.add("update vid set icon:=p1 where id=:p2");
ParamByname("p2").asinteger:=...
ParamByname("p1").DataType:=ftBlob;
ParamByname("p1").ParamType:=ptInput;
ParamByname("p1").LoadFromStream(ms,ftBlob);
ms- это TMemoryStream
Если через BDE, то вроде и BlobStream должен работать...




Mixa   (2003-04-01 12:37:00) [10]

А зачем триггер?
Для ХП хотел использовать PL/SQL, но как оказалось, он не умеет работать с достаточно длинным LONG RAW.
По идее он преобразует его в varchar2 (max 32767 bytes),
однако есть подозрение что преобразование происходит с
использованием RAWTOHEX, то есть каждый байт преобразуется в
два символа, что приводит к ограничению в 16К, что не может
не огорчать.
Подозреваю что придется писать ХП на каком нибудь gnuc с
использованием Oracle Call Interface (OCI), но так не хочется :(
Нет ли способа по проще?


Соловьев   (2003-04-01 12:20:00) [11]


> функция Locate - я не знаю,
> поиск происходит на стороне клиента или сервера ?

клиент


> Необходимо в случае, если запись с заданным n уже
> существует, модифицировать в ней поле l, иначе
> добавить новую запись с соответствующими значениями полей.

ХП+триггер. И будет то что доктор прописал.


Наверх

Титульная страница Поиск, карта сайта Написать письмо