Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вытащить Identity / 12 сообщений из 12, страница 1 из 1
20.03.2003, 12:09
    #32123608
aproximate
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить Identity
Привет всем!
Задача проста до безобразия - надо вытащить текущий Identity из Sequence для определенной таблицы. Sequence заранее не известен. Ктонить сталкивался с такой проблемой?
...
Рейтинг: 0 / 0
20.03.2003, 12:21
    #32123621
ora600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить Identity
select last_number from user_sequences where sequence_name = 'YOUR_SEQ'


только не понятно
>Sequence заранее не известен
неизвестно из какого seq-а генерится ключ для таблицы ? Посмотри триггер на инсерт или трассируй сессию с приложением
...
Рейтинг: 0 / 0
20.03.2003, 12:35
    #32123636
aproximate
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить Identity
2ora600
Надо адаптировать код который работает, на SQL для работы на оракле. Грубо говоря существует COM сервер транслирующий запросы на базу данных (в данном случае Insert) и возвращающий Identity.
Если напрямую отображать MSSQL на Oracle, то известно все, кроме самого sequence... можно ли както программно решить этот трабл?

Хотелось бы сменить просто провайдера с MicroSofta на ORACLE и чтобы это заработало, но получаем кучу мелких и не очень проблем :( Сам я к сожалению в Oracle пока не в зуб ногой.
...
Рейтинг: 0 / 0
20.03.2003, 12:46
    #32123648
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить Identity
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create table test (
    test_id number( 9 )
  , name varchar2( 32 )
  , constraint pk_test primary key (test_id)
)
/

create sequence sq_test;


Код: plaintext
1.
2.
3.
insert into test (test_id, name)
values (sq_test.nextval, :name)
return test_id into :test_id;


Код: plaintext
1.
2.
3.
select sq_test.nextval into :test_id from dual;
insert into test (test_id, name)
values (:test_id, :name)


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create or replace trigger tbiur_test
before insert or update on test
for each row
begin
  if :new.test_id is null then
    select sq_test.nextval into :new.test_id from dual;
  end if;
end;
/

insert into test (name)
values ('name2')
return test_id into :test_id;


Ну и так далее:) Ты про это?
...
Рейтинг: 0 / 0
20.03.2003, 13:01
    #32123668
ora600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить Identity
2 Denis
Это надо в рамочку и в FAQ :-)

только, чтоб уж совсем красиво
>before insert or update on test
before insert or update of test_id on test

и
>insert into test (name)
>values ('name2')
>return test_id into :test_id;
returning test_id into :test_id;
...
Рейтинг: 0 / 0
20.03.2003, 13:11
    #32123683
aproximate
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить Identity
2Denis Popov:
Близко, но:

insert into test (name)
values ('name2')
return test_id into :test_id;

Я не знаю как называется поле с Identity , т.е не знаю test_Id :( ....

у меня тут мысль родилась - Может быть на этапе экспорта базы в Oracle создать тип объекта для каждой таблицы типа obj_TableName и в нем завести поле identity с идентификатором Sequence .... а потом если надо узнать identity, всегда можно поднять этот объект и узнать этот identity...
...
Рейтинг: 0 / 0
20.03.2003, 13:34
    #32123718
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить Identity
У тебя есть первичный ключ в таблице, он состоит из поля с типом identity? Может быть тебе стоит сделат ьследующее: на каждую требуемую таблицу создать триггер, определять в нем значение первичного ключа, а с клиента после insert'а спрашивать текущее значение sequence:

Код: plaintext
1.
2.
insert into test (name) values ('name2');
select sq_test.currval into :identity from dual;


подразумевая, что сработал триггер, в котором дернулся sequence. Учти, что currval ты имеешь право спрашивать тогда, когда хотя бы раз перед ним в сессии прошел nextval. В данном случае это произошло в триггере.
...
Рейтинг: 0 / 0
20.03.2003, 13:41
    #32123728
ora600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить Identity
А почему бы взамен MSSQL-ой колонки identity не завести колонку с одинаковым для всех таблиц именем ( "ID" конечно же :-))) ) ? По большему счету и сиквенс может быть один на все таблицы. И получите то что хотите (насколько я понял) - унифицированный вид инсерта на любую таблицу с получением ключа.
...
Рейтинг: 0 / 0
20.03.2003, 13:47
    #32123734
Alex_D
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить Identity
2 ora600

только, чтоб уж совсем красиво
>before insert or update on test
before insert or update of test_id on test

Замечательно !!! :((((
Только вопросец зачем update - первичный ключ ???

Если уж совсем грамотно и красиво ...
то на мой скромный взгляд надо так
before insert on test
- и без указания полей так как первичный ключ обычно not null ...
т.е вставлять его надо в любом случаи ....
...
Рейтинг: 0 / 0
20.03.2003, 13:48
    #32123738
aproximate
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить Identity
2 Denis Popov
Первичный ключ может состоять из нескольких полей

2 ora600
Исторически сложилось так что эти поля имеют свои названия, и куча кода их пользует... это было до меня и я ничего здесь исправить не могу...
...
Рейтинг: 0 / 0
20.03.2003, 14:50
    #32123832
ora600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить Identity
2Alex_D
>Замечательно !!! :((((
>Только вопросец зачем update - первичный ключ ???

А почему СТРОГО ЗАПРЕЩАЕТСЯ делать
update tablename set test_id = null, ... where ... ?
Насчет грамотности - представьте себя на месте кодера, правящего давно напИсанное монстроидальное приложение и встретившего такой апдейт. Кричать что ЭТО не правильно и пытаться переделать кучу кода (со вносом свеженьких багов, конечно же) или убедиться в наличии корректного триггера ? Как грамотнее ?

>Если уж совсем грамотно и красиво ...
>то на мой скромный взгляд надо так
>before insert on test
>- и без указания полей так как первичный ключ обычно not null ...
>т.е вставлять его надо в любом случаи ....
в before insert можно поля указывать ? первичный ключ ОБЫЧНО not null ?
...
Рейтинг: 0 / 0
20.03.2003, 15:16
    #32123872
aproximate
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить Identity
Кстати в Oracle есть чтонить типа sysname? Чтобы я мог компоновать имя объекта, таблицы и т.д. из разных частей?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вытащить Identity / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]