Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите с синтаксисом хранимых процедур в Interbase  (Прочитано 12724 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RomCom
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« : 10-07-2005 12:15 » 

Хочу сделать универсальную процедуру для получения значения генератора. Смысл которой очень прост, процедура в качестве параметра принимает текстову переменную GEN_NAME с именем генератора и по имени в этой переменной выполняет стандартную процедуру получения следующего значения генератора.
Вот два варианта которыми я пытался это сделать:
Код:
ALTER PROCEDURE NEW_PROCEDURE (
    GEN_NAME VARCHAR(20))
RETURNS (
    NEW_ID INTEGER)
AS
begin

   /*первый вариант*/
    select gen_id(:gen_name, 1) from RDB$DATABASE into :new_id;
  /*второй вариант*/
    NEW_ID = gen_id(GEN_NAME, 1);

  suspend;
end
В обоих случаях выдается ошибка.
Мне не понятно почему нельзя подставить имя в SQL запрос, т.е. gen_id(:gen_name, 1), а так же загвоздка в том что я не знаю как получить сам объект (генератор) через его имя в переменной (второй вариант).
Подскажите пожалуста как это можно сделать.
Записан

R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 11-07-2005 05:48 » 

...
If GEN_NAME = 'Generator1' Then  select gen_id(Generator1, 1) from RDB$DATABASE into :new_id;
If GEN_NAME = 'Generator2' Then  select gen_id(Generator2, 1) from RDB$DATABASE into :new_id;
...
« Последнее редактирование: 20-12-2007 20:10 от Алексей1153++ » Записан

С уважением, Oldy.
RomCom
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 11-07-2005 14:02 » 

Спасибо Oldy!
Конечно не универсально получается, но главное работает Улыбаюсь
Записан

R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 12-07-2005 09:55 » 

Не стОит благодарности. А что-бы получилось универсально, нужно уходить с InterBase на FireBird 1.5.x - 2.0 или Yaffil - там добавлены функции "execute varchar", "execute statement" и пр., а так-же исправлены многие баги Interbase. 
Записан

С уважением, Oldy.
RomCom
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 13-07-2005 12:33 » 

А здесь прошу поподробней Улыбаюсь
Дело в том, что прога пишется как раз с ориентацией на FireBird 1.5 (InterBase в вопросе я написал т.к. думал что у них полная совместимость по языку). Oldy подскажи пожалуста где можно почитать информацию про отличия по языку запросов и процедур в InterBase, FireBird 1.5.x - 2.0 и Yaffil, а тек же вооббще какие встроеных процедуры имеются. Я купил книгу "Мир InterBase. Архитектура, администрирование..." но там как-то скудно написано и нет даже перечня встроенных функций Жаль
Записан

R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 14-07-2005 18:19 » new

Отличия по языку, а так-же список устраненных багов публикуется в ReleaseNotes.pdf поставляемом вместе с FireBird. То есть, в FireBird конкретной версии имеется все, что есть в InterBase 6.0 плюс то, что перечислено в ReleaseNotes предыдущих версий плюс ReleaseNotes текущей. Улыбаюсь Так "EXECUTE STATEMENT" будет описана в ReleaseNotec для FiteBird 1.5. Что-же касается новшеств в Yaffil, то их можно посмотреть здесь:
http://yaffil.ibase.ru/changes.htm
« Последнее редактирование: 14-07-2005 18:32 от Oldy » Записан

С уважением, Oldy.
RomCom
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 16-07-2005 11:51 » 

Спасибо Oldy!
Похоже я стал жертвой стереотипа "документацию читают только ламеры" Улыбаюсь Оказывается в комплекте с FireBird 1.5 идет хорошая документация! А я даже не соизволил посматреть что находится в папке с FireBird. Что ж буду штудировать.
Еще раз спасибо.
Записан

R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #7 : 25-07-2005 20:25 » 

можно сделать и универсальный на 1.0.ХХ. для этого надо прочитать текущее значение генератора из  rdb$(не помню что) по его имени, увеличить это значение на единицу, сохранить новое значение в ту же системную таблицу (rdb$-не-помню-что) и вернуть его в NEW_ID. это иногда полезно, когда требуется сделать "видящий транзакции" генератор ключа, т.к., как известно, в ИБ значения генераторов при откате транзакции не откатываются. но данный подход череват тем, что в некоторых случаях можно получить два одинаковых значения генератора. т.е. надо чётко отслеживать ситуации, когда дважды подряд вызывается одна и та же процедура из двух разных транзакций, по одной из которых коммит ещё не завершён.
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines