powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно ли передать sequence как параметр в хранимую процедуру
5 сообщений из 5, страница 1 из 1
Можно ли передать sequence как параметр в хранимую процедуру
    #32075494
Антоныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Постановка задачи:
Необходима функция для генерации нового ID для любой таблицы, кот. имеет sequence, и возврата значения ID в клиентское приложение.
Для конкретной таблицы вышеописанное реализуется весьма просто-
CREATE FUNCTION GETNEWEMPL_ID RETURN NUMBER IS
NEWEMPL_ID Number;
BEGIN
SELECT SomeFunction(EMPL_ID_SEQ.NEXTVAL) INTO NEWEMPL_ID from dual;
return(NEWEMPL_ID);
END;

Но нужна универсальная функция для любых таблиц, типа след.
CREATE FUNCTION GETNEWID(<наимен. секвенции>) RETURN NUMBER IS
NEWID Number;
BEGIN
SELECT SomeFunction(EMPL_ID_SEQ.NEXTVAL) INTO NEWID from dual;
return(NEWID);
END;

Можно, конечно, на стороне клиента составить sql-выражение, реализ. то же самое, но тогда придется закрывать/открывать запрос - применительно к Delphi... А это наверно сказывается на производительности ?

Решается ли данная проблемка?

P.S. А можно ли докопаться до секвенции зная только имя таблицы?

P.P.S. Или все таки не извращаться... ;)
...
Рейтинг: 0 / 0
Можно ли передать sequence как параметр в хранимую процедуру
    #32075507
va_kochnev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Варианты:
1) Завести одну секвенцию на все таблицы и не мучиться
2)
create or replace function next_id(p_sequence varchar2) return number is
i number;
begin
execute immediate 'select '||p_sequence||'.nextval from dual' into i;
return i;
end;
/

3) Создать таблицу соответствия таблиц и секвенций
create table tab_seq (tab_name varchar2(30), seq_name varchar2(30));

create or replace function next_id(p_table varchar2) return number is
v_seq_name;
i number;
begin
select seq_name into v_seq_name from tab_seq where tab_name=p_table;
execute immediate 'select '||v_seq_name||'.nextval from dual' into i;
return i;
end;
/

PS: Сам код не проверял. Возможны синтаксические ошибки
...
Рейтинг: 0 / 0
Можно ли передать sequence как параметр в хранимую процедуру
    #32075515
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причём тут таблицы не совсем понятно. Работа с сиквенсами производится абсолютно независимо от чего-либо. Ты можешь значение получать непосредственно при вставке:
insert into <table1> values(seq1.nextval,..,..);

можешь через допополнительный запрос:
select seq1.nextval from dual;

А зачем писать еще какую-то функцию? Зачем так извращаться?
...
Рейтинг: 0 / 0
Можно ли передать sequence как параметр в хранимую процедуру
    #32075553
Антоныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To softbuilder@inbox.ru:
<Причём тут таблицы не совсем понятно>

На стороне клиента имеется dll-ка, к которую передается наименование таблицы - и эта dll позволяет клиентскому приложению взаимодествовать с данной таблицей БД. Т.е. определен только один параметр - <tablename>.
При вставке новой записи нужно на стороне клинта сгенерировать новый ID.

< Работа с сиквенсами производится абсолютно независимо от чего-либо>

Уточню описанную постановку задачи - ID для каждой таблицы генерятся используя некую процедуру - SomeFunction(EMPL_ID_SEQ.NEXTVAL), на основе
секвенций опеределенных для своей таблицы.
....да, так. Это уже заложено в БД, и не мной :)

To va_kochnev:
Упс... Особенно прельщает 2 способ. C PL\SQL пока уважительно на Вы ;)
Т.е. можно попробовать след. образом
CREATE FUNCTION GETNEWID((p_sequence varchar2) RETURN NUMBER IS
i Number;
BEGIN
execute immediate 'select SomeFunction('||p_sequence||'.nextval) from dual' INTO i;
--SELECT SomeFunction(EMPL_ID_SEQ.NEXTVAL) INTO NEWID from dual;
return(i);
END;

P.S. Эх, придется наряду c <tablename>, передавать в dll ещё и <sequence_name>
...
Рейтинг: 0 / 0
Можно ли передать sequence как параметр в хранимую процедуру
    #32076661
Фотография hinotf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а Вы назначайте последовательностям такие имена, чтобы эти имена можно было получить из имени таблицы... например, префикс добавьте
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно ли передать sequence как параметр в хранимую процедуру
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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