Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по работе с транзакциями, Oracle10g XE + Delphi 
V
    Опции темы
killerbean
Дата 11.9.2006, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 18.5.2006

Репутация: нет
Всего: нет



Есть 2 таблици:

Requests
-------------
req_code
req_name
...

request_items
-------------
ri_code
req_code
fi_name
...

связанные по req_code. Они должны заполняться следующим образом:

BeginTransaction
insert into Requests .....
insert into Request_items .....
EndTransaction

Суть проблемы следующая:
если в табл. Requests я запись могу добавить без проблем, то для добавления в Request_items мне необходимо знать req_code последней записи внесенной в табл. Requests. Как его(Requests.req_code) можно определить, ведь до фиксации транзакции данные в таблицу не занесуться?

PM MAIL   Вверх
LSD
Дата 11.9.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



1. Данные в таблицу будут вставлены и до завершения транзакции, только они будут видимы только для этой транзакции.
2. А как ты гененируешь req_code, что сам не можешь узнать его?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
killerbean
Дата 11.9.2006, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 18.5.2006

Репутация: нет
Всего: нет



Цитата

1. Данные в таблицу будут вставлены и до завершения транзакции, только они будут видимы только для этой транзакции.

1. Значить мне тогда надо считать данные из последней вставленой записи. Тогда вопрос как обратиться именно к нужной мне записи?
Цитата

2. А как ты гененируешь req_code, что сам не можешь узнать его?

2. req_code генерирую не я а Oracle через sequence.
PM MAIL   Вверх
LSD
Дата 11.9.2006, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Цитата(killerbean @  11.9.2006,  12:42 Найти цитируемый пост)
Тогда вопрос как обратиться именно к нужной мне записи?

Тебе видней какая именно запись тебе нужна. Генерируй req_code сам, вначале:
Код
select req_code from dual

а потом уже INSERT. Или напиши процедуру, которая вставляла бы записи в Requests и возвращала через returning сгенерированный req_code.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
killerbean
Дата 11.9.2006, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 18.5.2006

Репутация: нет
Всего: нет



Цитата

Тебе видней какая именно запись тебе нужна.


Ну я делаю insert  и и сразу же мне нужно получить код этой записи, а потом запросом
Код

insert into request_items values(1, (select req_code from requests where ......), ...);

вставить в табл. request_items, где на месте ...... должен определяться номер записи.
Как его определить?



Это сообщение отредактировал(а) killerbean - 11.9.2006, 12:18
PM MAIL   Вверх
LSD
Дата 11.9.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Я тебе уже объяснил, надо или предварительно генерировать значение ключа. Или получать сгенерированное значение ключа, это можно сделать в PL/SQL, и вроде ODAC еще так умеют.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
killerbean
Дата 11.9.2006, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 18.5.2006

Репутация: нет
Всего: нет



А как можно получить значение сгенерированого ключа в PL/SQL?
PM MAIL   Вверх
LSD
Дата 11.9.2006, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Код
INSERT INTO employees 
      (employee_id, last_name, email, hire_date, job_id, salary)
   VALUES 
   (employees_seq.nextval, 'Doe', '[email protected]', 
       SYSDATE, 'SH_CLERK', 2400) 
   RETURNING salary*12, job_id INTO :bnd1, :bnd2;



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
killerbean
Дата 12.9.2006, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 18.5.2006

Репутация: нет
Всего: нет



такой вариант не получилось реализовать. Пробую запрсом:
Код

SELECT TO_CHAR(SCN_TO_TIMESTAMP(ORA_ROWSCN)) as "FLD", REQ_CODE FROM requests order by FLD
 
по ходу в последней записи должен лежать тот REQ_CODE, что мне надо. 
Но там лежит код последней добавленной записи до начала транзакции. Как это можно объяснить? 
И можно ли както это обойти
PM MAIL   Вверх
LSD
Дата 12.9.2006, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Вот только не надо извращений с SCN. У sequence есть две псевдоколонки currval и nextval, используй уж лучше currval для получения последнего сгенерированного в данной сессии значения.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
killerbean
Дата 12.9.2006, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 18.5.2006

Репутация: нет
Всего: нет



пробовал. Если использую CURRVAL
Код

select REQUESTS_SEQ.CURRVAL as "Ключ" from REQUESTS

вылетает следующая ошибка
Код

ORA-08002: sequence REQUESTS_SEQ.CURRVAL is not yet defined in this session


если NEXTVAL
Код

select REQUESTS_SEQ.NEXTVAL as "Ключ" from REQUESTS


то результат такой
Код

Ключ 
---------------
261 
262 
263 
264 
265 
266 
267 

и кто же из них NEXTVAL?
PM MAIL   Вверх
LSD
Дата 12.9.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



В первом insert-е используешь nextval, а во втором insert-е currval. Главное следить, чтобы между этими двумя insert-ами не вклинилось обращение к этому sequence-у.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
killerbean
Дата 12.9.2006, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 18.5.2006

Репутация: нет
Всего: нет



мне кажеться в Delphi я могу реализовать следующим образом:
1. select REQUESTS_SEQ.NEXTVAL as "Ключ" from REQUESTS
2. Сохранить значение "Ключ" в переменную
3. Выполнить первый insert, что позволит присвоить новой записи значение, которое я сохранил в переменную
4. Выполнить второй insert, где я подставлю свою переменную

но после выполнения п.1 я получаю не значение а набор значений. Как с этим быть. Если бы я получил одно значение, то проблем бы небыло  smile 
PM MAIL   Вверх
batigoal
Дата 12.9.2006, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 2
Всего: 151



Цитата(killerbean @  12.9.2006,  17:34 Найти цитируемый пост)
но после выполнения п.1 я получаю не значение а набор значений. Как с этим быть. Если бы я получил одно значение, то проблем бы небыло  smile  

А за чем ты делаешь этот SELECT? Так ты получишь его столько раз, сколько у тебя записей в таблице. Если уж хочешь сделать это запросом, тогда можно так:
Код

SELECT REQUESTS_SEQ.NEXTVAL FROM DUAL;



--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 12.9.2006, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Я тебе про этот способ еще во втором посте писал.

1.
Код
select req_code from dual

и далее по списку.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0671 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.