Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Запрос на выборку в функции


Автор: zhefran 9.4.2010, 10:22
Здравствуйте уважаемые.
Подскажите мне как написать функцию для такого SELECT:
Код

select sqname.currval from dual;


Я хочу узнавать текущее значение sequence передавая ее имя в функцию. Это реально?

Автор: DimW 9.4.2010, 10:31
Цитата(zhefran @  9.4.2010,  10:22 Найти цитируемый пост)
Это реально?

нет, текущее занечение сиквенса можно определить только получив его предварительно в этой же транзакции.

Автор: Zloxa 9.4.2010, 10:57
zhefran, вообще краткость далеко не всегда сестра таланта. Ваш вопрос можно трактовать многояко. Я полностью согласен с предыдущим оратором касательно заключения которого он дал по своей трактовке Вашей сентенции. Тем не менее я суть вопроса понял по другому. И мое понимание сути решается средствами динамического SQL. А касательно того, что ж Вам действительно надо, то Вам лишь ведомо.
Код

SQL> create sequence testseq;
 
Sequence created
SQL> create or replace function testseqf(seq_name varchar2) return number is
  2    result number;
  3  begin
  4    execute immediate 'select '||seq_name||'.currval from dual'
  5      into result;
  6    return result;
  7  end;
  8  /
 
Function created
SQL> select testseq.nextval, testseqf('testseq') from dual;
 
   NEXTVAL TESTSEQF('TESTSEQ')
---------- -------------------
         1                   1
 

Автор: zhefran 9.4.2010, 11:19
Zloxa, спасибо, это то, что нужно!

В целом мне нужно сделать аналог в Oracle функции MySQL  mysql_insert_id().
Функцию буду обязательно вызывать после инсерта.

Автор: DimW 9.4.2010, 11:24
Цитата(Zloxa @  9.4.2010,  10:57 Найти цитируемый пост)
Тем не менее я суть вопроса понял по другому.

думаю мы суть вопроса поняли одинаково, просто на мой НЕТ, можно ответить - "да, НО..."  smile 

Автор: Zloxa 9.4.2010, 11:39
Цитата(zhefran @  9.4.2010,  11:19 Найти цитируемый пост)
В целом мне нужно

А вот если бы Вы все таки озвучили что же вам нужно "в целом", то выяснилось бы что функция вам и в пень не вдулась, потому как что ни наесть рассово-кошерный способ достижения вашей цели - использовать http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_9014.htm#i2122356 кляузу оператора insert  smile 

Автор: DimW 9.4.2010, 12:07
Цитата(Zloxa @  9.4.2010,  11:39 Найти цитируемый пост)
использовать returning кляузу оператора insert 

ловко подмечено  smile 

Автор: zhefran 9.4.2010, 12:29
Я находил такое решение.

Код

declare 
i number;
begin
insert into testa(aname) values('тест') returning id into i;
end;


Но я не знаю как потом это i отправить в php страницу. 

Автор: DimW 9.4.2010, 12:40
Цитата(zhefran @  9.4.2010,  12:29 Найти цитируемый пост)
как потом это i отправить в php страницу.  

Код

create procedure add_value(p_value in varchar2
                          ,p_curr_id out number)
as
begin
 insert into testa(aname) values(p_value) returning id into p_curr_id;
end; 


вызывай в PHP и обрабатывай OUT параметр(p_curr_id)

Автор: Zloxa 9.4.2010, 12:59
Цитата(zhefran @  9.4.2010,  12:29 Найти цитируемый пост)
я не знаю как потом это i отправить в php страницу.  

Ох и как же далеко оказалась суть от изначально поставленного вопроса smile)))
И, по сути, выходит, вопрос должен звучать не в этот форум вовсе  smile 

Автор: azesmcar 9.4.2010, 13:02
Цитата(Zloxa @  9.4.2010,  12:59 Найти цитируемый пост)
Ох и как же далеко оказалась суть от изначально поставленного вопроса 

 smile 

Цитата(zhefran @  9.4.2010,  11:19 Найти цитируемый пост)
В целом мне нужно сделать аналог в Oracle функции MySQL  mysql_insert_id().

только вот ты не учел что mysql_insert_id() работает для конкретно твоей сессии, а как ты обеспечишь, чтобы вставка в чужой сессии не изменяла текущего значения твоего sequence -а я не знаю smile

Автор: DimW 9.4.2010, 13:06
Цитата(Zloxa @  9.4.2010,  12:59 Найти цитируемый пост)
И, по сути, выходит, вопрос должен звучать не в этот форум вовсе 

не совсем, здесь вопрос должен был быть "как ОТДАТЬ значение", а в форуме по ПХП, "как взять". smile 

Автор: azesmcar 9.4.2010, 13:07
Цитата(DimW @  9.4.2010,  13:06 Найти цитируемый пост)
не совсем, здесь вопрос должен был быть "как ОТДАТЬ значение", а в форуме по ПХП, "как взять". smile  

а как отдать он (по его же словам) знал smile

Автор: DimW 9.4.2010, 13:10
Цитата(azesmcar @  9.4.2010,  13:02 Найти цитируемый пост)
чтобы вставка в чужой сессии не изменяла текущего значения твоего sequence

насколько я понял из доки - не меняет, каждая сессия оперирует своими, после выпондения оператора который меняет инкрементное поле.

Добавлено через 3 минуты и 8 секунд
Цитата(azesmcar @  9.4.2010,  13:07 Найти цитируемый пост)
а как отдать он (по его же словам) знал

согласись - получение параметра из функции и из процедуры не одно и тоже, хотя возможно API для работы с конкретной БД делает это различие минимальным.

Автор: azesmcar 9.4.2010, 13:15
Цитата(DimW @  9.4.2010,  13:10 Найти цитируемый пост)
насколько я понял из доки - не меняет, каждая сессия оперирует своими, после выпондения оператора который меняет инкрементное поле. 

хм..будет немного странно, а если мне нужно именно текущее значение? надо будет проверить.

Автор: DimW 9.4.2010, 13:17
Цитата(DimW @  9.4.2010,  13:10 Найти цитируемый пост)
получение параметра из функции и из процедуры

хотел сказать - значения из функции и параметра из процедуры.

Автор: azesmcar 9.4.2010, 13:19
DimW

ты прав
Цитата

The sequence name is used to fetch the value of the sequence, using two special suffixes, called
pseudo columns, which either force the return of a new value (NEXTVAL), or return the current
value (CURRVAL) for the current session.

хм..задумался smile

Автор: DimW 9.4.2010, 13:20
Цитата(azesmcar @  9.4.2010,  13:15 Найти цитируемый пост)
а если мне нужно именно текущее значение?

будет странно если тебе нужно твое значения инкремента, а ты получишь значение "десятого" пользователя, но проверить надо smile

Автор: azesmcar 9.4.2010, 13:21
Цитата(DimW @  9.4.2010,  13:20 Найти цитируемый пост)
будет странно если тебе нужно твое значения инкремента, а ты получишь значение "десятого" пользователя, но проверить надо smile 

да, но мое значение инкремента я могу получить во время вставки..а вот глобальное - видимо никак..точнее только запросом?

Автор: DimW 9.4.2010, 13:21
Цитата(azesmcar @  9.4.2010,  13:19 Найти цитируемый пост)
ты прав

ну и слава богу - неожидонности не произошло smile

Автор: DimW 9.4.2010, 13:23
Цитата(azesmcar @  9.4.2010,  13:21 Найти цитируемый пост)
а вот глобальное - видимо никак

логично, иначе необходимо наличие блокировки на объект инкримента.  smile

Автор: azesmcar 9.4.2010, 13:29
Цитата(DimW @  9.4.2010,  13:23 Найти цитируемый пост)
логично, иначе необходимо наличие блокировки на объект инкримента.  smile

Ну это уже другой вопрос как было бы правильнее. Я видимо запутался в базах, может в MSSQL была что-то такое.. smile 

Автор: DimW 9.4.2010, 13:34
Цитата(azesmcar @  9.4.2010,  13:29 Найти цитируемый пост)
Я видимо запутался в базах


azesmcar, какой прок от значения, которое не характиризует состояние бъекта для текущей сессии, т.к. в любой момент может измениться?

Автор: azesmcar 9.4.2010, 13:35
Цитата(DimW @  9.4.2010,  13:34 Найти цитируемый пост)
azesmcar, какой прок от значения, которое не характиризует состояние бъекта для текущей сессии, т.к. в любой момент может измениться? 

Ну оно характеризует значение текущего состояние таблицы. Насчет прока сложно сказать smile 
Вот например в MSSQL есть IDENT_CURRENT( 'table_name' ), выдает глобальное значение счетчика.

Автор: DimW 9.4.2010, 13:39
Цитата(azesmcar @  9.4.2010,  13:35 Найти цитируемый пост)
Ну оно характеризует значение текущего состояние таблицы

оно характеризует состояние таблицы в прошлом.  smile 

Цитата(azesmcar @  9.4.2010,  13:35 Найти цитируемый пост)
Вот например в MSSQL есть IDENT_CURRENT( 'table_name' ),

ща гляну - интересно.

Автор: azesmcar 9.4.2010, 13:44
Цитата(DimW @  9.4.2010,  13:39 Найти цитируемый пост)
оно характеризует состояние таблицы в прошлом.  smile 

машина времени smile 

Автор: DimW 9.4.2010, 13:47
Цитата(azesmcar @  9.4.2010,  13:35 Найти цитируемый пост)
Насчет прока сложно сказать

ну я про то:
Цитата

Будьте внимательны при использовании функции IDENT_CURRENT для прогнозирования следующего создаваемого значения идентификатора. Действительное создаваемое значение может отличаться от полученного с помощью функций IDENT_CURRENT и IDENTITY_SEED, потому что в других сеансах тоже могут выполняться операции вставки.

http://msdn.microsoft.com/ru-ru/library/ms175098.aspx

спасибо что предупредили:
Код

exec kill all session;
exec IDENT_CURRENT( 'table_name' );
exec send_message(всем спасибо, можете работать дальше);


 smile 

Автор: azesmcar 9.4.2010, 13:51
Цитата(DimW @  9.4.2010,  13:47 Найти цитируемый пост)

exec kill all session;
exec IDENT_CURRENT( 'table_name' );
exec send_message(всем спасибо, можете работать дальше);

 smile 

ну наверное где-то это может понадобится, не просто так ведь микрософт это придумал (хотя...) smile

Автор: Zloxa 9.4.2010, 13:59
чота вы ваще в офотп ушли.. я вас ваще перестал понимать, о чем вы? ах, ну да, об очевидных вещах, зато с умным человеком ;)

Агде суть то? Где суть? Да там прям на месте и ссут!(с)  smile  

Автор: azesmcar 9.4.2010, 14:03
Цитата(Zloxa @  9.4.2010,  13:59 Найти цитируемый пост)
чота вы ваще в офотп ушли.. я вас ваще перестал понимать, о чем вы? ах, ну да, об очевидных вещах, зато с умным человеком ;)

Я вот задумался, действительно..зачем это может понадобится, стараюсь понимаешь, задачи выдумываю...не выходит smile 

Автор: DimW 9.4.2010, 14:11
Цитата(Zloxa @  9.4.2010,  13:59 Найти цитируемый пост)
чота вы ваще в офотп ушли..

вот зануда... smile
а потом пришел муж и все испортил (с)

Автор: Zloxa 9.4.2010, 14:17
Цитата(azesmcar @  9.4.2010,  14:03 Найти цитируемый пост)
зачем это может понадобится

бывает нам нужно не точно знать, а достаточно приблизительно.
Ну чтобы оценить например, сколько нам лет нужно еще такими темпами двигаться, чтобы до переполнения разрядности значения сиквенса/*идента*/ дожить, потому что некий гарных хлопец решил вдруг гдета в связанной табличке ограничить разрадность восемью знаками.
Или чтобы оценить а вообще используется сиквенс/*идент*/ или нет.
Или когда смотришь на значение колонки cust_value_3=546549 и думаешь, что это явно с-ка чейта ПК, только вот хз чей. Соответственно можно смело отсечь все таблы где ПК < 546549 

вообще, гипопетитечно очень полезная фича, жаль мне не приходило в голову ей пользоваться.

Автор: azesmcar 9.4.2010, 14:24
Цитата(Zloxa @  9.4.2010,  14:17 Найти цитируемый пост)
вообще, гипотетитечно очень полезная фича, жаль мне не приходило в голову ей пользоваться.

Ну вот видишь, есть польза от офтопа smile 

Автор: Zloxa 9.4.2010, 15:56
Цитата(azesmcar @  9.4.2010,  14:24 Найти цитируемый пост)
есть польза

[sarcasm tone="dark"]
Блин.. надо учиться не забывать пользоваться тэгом [sarcasm]
[/sarcasm]
 smile 

Автор: azesmcar 9.4.2010, 16:02
Zloxa

эээ...ну я тоже как бы не очень серьезно говорил smile 

Автор: LSD 9.4.2010, 16:04
Хватит офтопить, а то щас как позабаниваю всех налево и направо smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)