Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];

Вниз

Обновление LONG RAW   Найти похожие ветки 

 
Mixa   (2003-04-01 12:17) [0]

Есть таблица
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 - я не знаю,
поиск происходит на стороне клиента или сервера ?

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


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


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

клиент


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

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


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

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


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

Для обновления поля 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 должен работать...





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

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


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

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

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


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

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


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

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


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


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

это как?


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

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


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


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

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


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

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



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.009 c
3-54458
Алекс
2003-03-28 15:07
2003.04.17
Синхнонизация данных клиента и сервера


4-54946
Long
2003-02-17 18:15
2003.04.17
Как с помощью WinAPI создать окно с кнопкой


7-54916
OlegM
2003-02-27 07:55
2003.04.17
Как прочитать из реестра параметр типа REG_MULTI_SZ


3-54484
panov
2003-03-30 14:11
2003.04.17
блокировка записи в IB6


1-54595
Roki
2003-04-04 09:45
2003.04.17
Как в TreeView при DragDrop узнать что узел может принять ветку?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский