-
База Oracle. Это получилось сделать. Теперь возник такой вопрос. Я в TUpdateSql вешаю запрос:
insert into NPATS_GTP (NAME, NPATSID) values (:NAME, :NPATSID) returning gtpid into :gtpid
чтобы вернул первичный ключ-поле для дальнейшего его использования. Но вываливается ошибка
update error.
Подскажите, пржалуйста, как правильно использовать предложение returning или есть какой другой способ?
Спасибо.
-
> [0] Наталья (04.08.10 17:11) > База Oracle. Это получилось сделать.
Так Oracle - это ваше? Круто! 8-)
> insert into и > update error.
противоречие однако, не находите?
-
> [0] Наталья (04.08.10 17:11)
И при чем тут "NavigatorButtons в cxGrid"?
-
> Но вываливается ошибка > > update error.
правильно вываливается. UpdateSQL не понимает таких операторов, насколько я помню
-
я к тому, что UpdateSQL считает, что у него все параметры будут входными, а в приведенном операторе параметр :gtpid - выходной.
-
>И при чем тут "NavigatorButtons в cxGrid"?
Использую именно этот грид и его панель с кнопками.
> insert into > update error. >противоречие однако, не находите?
При нажатии на кнопку + (добавить запись), в список добавляется запись и в базу тоже, тут же пытаюсь редактировать эту же запись, но вылетает ошибка, вот где update, не понимает, что нужно вернуть индекс и по нему редактировать.
> я к тому, что UpdateSQL считает, что у него все параметры будут входными А как можно сделать, что б понимал? Или как-то обойти это непонимание?
Спасибо.
-
> А как можно сделать, что б понимал? Или как-то обойти это > непонимание?
например, не использовать returning
-
Попробую переформулировать.
Используется BDE, отказаться от него нельзя, т.к. многое придется переделывать. Имеется СУБД Oracle. В ней создана база. В Oracle организовано автоинкрементное добавление записи для того. Запись в таблицу добавляется, но редактировать не удается, т.к. похоже, что на клиентсую сторону не возвращается автоинкрементный ключ.
А реализовано так: В TUpdateSql в событии Insert создаю запрос: insert into NPATS_GTP (NAME, NPATSID) values (:NAME, :NPATSID) returning gtpid into :gtpid Такое ощущение, что TUpdateSql не обрабатывает предложение returning.
Подскажите, пожалуйста, как можно решить эту задачу?
-
> Запись в таблицу добавляется, но редактировать не удается, > т.к. похоже, что на клиентсую сторону не возвращается автоинкрементный > ключ. >
а БДЕ это умеет делать?
-
> [7] Наталья (05.08.10 09:36) > Подскажите, пожалуйста, как можно решить эту задачу?
1. Новое значение ключа можно сгенерировать заранее и вставлять его в запросе явно. 2. Готовить запись заранее, чтобы не нужно было ее после вставки редактировать 3. Переоткрывать датасет после вставки и позиционирование на новую запись - это конечно совсем изврат, но...
-
> а БДЕ это умеет делать?
Ну а зачем тогда в Delphi есть свойство AutoGenerateValue со значением arAutoInc. Может, для его использования нужно еще что-то настраивать?
-
> Ну а зачем тогда в Delphi есть свойство AutoGenerateValue > со значением arAutoInc.
для Парадокса, например. Но не для оракла.
-
Автоинкремент в O делается через последовательности, вроде Хоть и боюсь, что ИШ убъет, но может как то так? oqLoadPrice.SQL.Text := 'select PRICE_ID.NEXTVAL as IdPrice from dual';
oqLoadPrice.Open;
IdPrice := oqLoadPrice.FieldByName('IdPrice').AsInteger;
oqLoadPrice.Close; потом oqLoadPrice.SQL.Text := ' Insert into price '+
' ( id_price, subscriber_id, start_data, stop_data, address, phone, ready) '+
' values (:id_price, :subscriber_Id, :start_data, :stop_data, :address, :phone, :ready)';
oqLoadPrice.ParamByName('id_price').AsInteger := IdPrice; где create sequence PRICE_ID
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1 или если не надо получить id в программу create or replace trigger tg_GenerateFILIALID
before insert ON FILIAL
for each row
begin
select FILIAL_ID.NEXTVAL
into :new.ID_FILIAL
from dual;
end tg_GenerateFILIALID; и тогда вставляем в таблицу, id не указываем, сам поставится
|