|
Можно ли передать sequence как параметр в хранимую процедуру
|
|||
---|---|---|---|
#18+
Постановка задачи: Необходима функция для генерации нового 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. Или все таки не извращаться... ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2002, 11:46 |
|
Можно ли передать sequence как параметр в хранимую процедуру
|
|||
---|---|---|---|
#18+
Варианты: 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: Сам код не проверял. Возможны синтаксические ошибки ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2002, 12:01 |
|
Можно ли передать sequence как параметр в хранимую процедуру
|
|||
---|---|---|---|
#18+
Причём тут таблицы не совсем понятно. Работа с сиквенсами производится абсолютно независимо от чего-либо. Ты можешь значение получать непосредственно при вставке: insert into <table1> values(seq1.nextval,..,..); можешь через допополнительный запрос: select seq1.nextval from dual; А зачем писать еще какую-то функцию? Зачем так извращаться? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2002, 12:10 |
|
Можно ли передать sequence как параметр в хранимую процедуру
|
|||
---|---|---|---|
#18+
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> ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2002, 13:11 |
|
|
start [/forum/topic.php?fid=52&tid=1992532]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 323ms |
total: | 447ms |
0 / 0 |