Форум: "Базы";
Текущий архив: 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