Главная страница
    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-54486
Andrio
2003-03-30 12:06
2003.04.17
свойство Params в TIBSQL ???


3-54502
malkolinge
2003-03-31 14:57
2003.04.17
Как сделать целочисленное деление ?


3-54430
jocko
2003-03-27 09:40
2003.04.17
Как определить какая запись?


3-54490
elena
2003-03-31 10:42
2003.04.17
Компоненты для работы с dbf


3-54408
Silver_
2003-03-27 10:20
2003.04.17
ADODataSetBeforeDelete





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский