Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.17;
Скачать: CL | DM;

Вниз

Обновление 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
3-54420
TohaNik
2003-04-01 12:04
2003.04.17
Как обойтись одним запросом


14-54876
VID
2003-03-29 02:17
2003.04.17
Написание музыки из сэмплов.


14-54813
Supreme 2
2003-03-30 22:32
2003.04.17
Прикольные фразы


3-54454
DenKop
2003-03-22 22:32
2003.04.17
TIBQuery


1-54605
Max1111
2003-04-04 12:57
2003.04.17
Проблема с глобальным динамическим массивом4