Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 схема в функции  [new]
kiruxan
Member

Откуда:
Сообщений: 6
Добрый день, есть некоторая функция в которой есть несколько запросов, не знает ли кто случаем, есть ли возможность менять схему для таблиц в запросе, в идеале было бы вообще чтоб она передавалась через параметр, но и хорошо было бы чтобы все таблицы определялись в той же схеме что и функция.
27 ноя 09, 11:22    [7986460]     Ответить | Цитировать Сообщить модератору
 Re: схема в функции  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4610
kiruxan,

Добрый день.

Только если функция написана на внешнем языке прграммирования с использованием динамического sql (если v9.7, то и в sql скалярной функции можно).
Тогда надо устанавливаеть current schema в нужное значение.
27 ноя 09, 13:30    [7987556]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: схема в функции  [new]
talent
Member

Откуда:
Сообщений: 54
Доброго времени суток. Ситуация следующая - есть хранимая процедура SCHEMA1.STORAGE_PROC() - в ней объявляются курсоры типа
SELECT FIELD1, FIELD2, .... FROM TABLE;

т.е. нет явной привязки к схемам. В БД есть несколько схем(SCHEMA2, SCHEMA3) с однотипными таблицами, нужно в зависимости от условий менять схему этих таблиц. Возможно ли это в данной ситуации?
CURRENT SCHEMA SCHEMA2

не срабатывает почему-то...
Сама процедура примерно такая
CREATE PROCEDURE SCHEMA1.STORAGE_PROC()
BEGIN
   DECLARE CURSOR1 CURSOR WITH RETURN FOR
      SELECT FIELD1, FIELD2, .... FROM TABLE;
   ...
   SET CURRENT SCHEMA SCHEMA2;
   OPEN CURSOR1;
END@

Выборка всегда производится по схеме SCHEMA1. Хотя если в этой же процедуре в определении курсора изменить схему, например, на SCHEMA2, то выборка производится по схеме SCHEMA2
2 окт 17, 20:53    [20837382]     Ответить | Цитировать Сообщить модератору
 Re: схема в функции  [new]
talent
Member

Откуда:
Сообщений: 54
Пробовал перед вызовом
CALL SCHEMA1.STORAGE_PROC()

вызывать
SET CURRENT SCHEMA SCHEMA2

Также безрезультатно...
2 окт 17, 21:14    [20837406]     Ответить | Цитировать Сообщить модератору
 Re: схема в функции  [new]
CawaSPb
Member

Откуда: Питер/Москва/Wroclaw
Сообщений: 761
"Фишка" DB2'шных процедур - статический прекомпилированный SQL с уже составленными и разложенными в базе планами.
В этом смысле весь тот SQL, который Вы пишете просто как SQL PL код, уже жёстко привязан к заданной схеме и от run time значения CURRENT SCHEMA не меняется.

Что, в общем-то логично. Процедура инкапсулирует некоторую логику, и эта логика вот так по щелчку пальцев меняться бы не должна.

Исключение - динамический SQL (используйте prepare + execute или execute immediate).
Но это добавляет нагрузку на компиляцию (если запросов экстремально много).
2 окт 17, 22:53    [20837605]     Ответить | Цитировать Сообщить модератору
 Re: схема в функции  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2512
-- файл xxx.db2
CREATE PROCEDURE STORAGE_PROC()
BEGIN
   DECLARE CURSOR1 CURSOR WITH RETURN FOR
      SELECT FIELD1, FIELD2, .... FROM TABLE;
   ...
   SET CURRENT SCHEMA SCHEMA2;
   OPEN CURSOR1;
END@


Компиляция. Файл xxx.bat
db2 connect to xxx user yyy using zzz
db2 set schema schema1
db2 -f xxx.db2 -vtd@ -z zzz1.txt
db2 set schema schema2
db2 -f xxx.db2 -vtd@ -z zzz2.txt
...


Использование:
set schema schema1@
CALL STORAGE_PROC()@


Так работает?

(Люди, пишущие подобные SP, не перестают меня удивлять).
2 окт 17, 23:32    [20837668]     Ответить | Цитировать Сообщить модератору
 Re: схема в функции  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2512
Просмотрел SET CURRENT SCHEMA внутри процедуры.
CREATE PROCEDURE STORAGE_PROC()
BEGIN
   DECLARE CURSOR1 CURSOR WITH RETURN FOR
      SELECT FIELD1, FIELD2, .... FROM TABLE;
     ...
   --   SET CURRENT SCHEMA SCHEMA2;
   OPEN CURSOR1;
END@


(Но см. http://www.oracle.com/technetwork/testcontent/o27asktom-084983.html )
3 окт 17, 09:25    [20837957]     Ответить | Цитировать Сообщить модератору
 Re: схема в функции  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4610
talent,

Добрый день.

Вам надо использовать динамический SQL.
+ Пример
--#SET TERMINATOR @
create table s1.test_cursor(i int) in userspace1@
insert into s1.test_cursor values 1@

create table s2.test_cursor(i int) in userspace1@
insert into s2.test_cursor values 2@

create or replace procedure test_cursor
dynamic result sets 1
begin
  declare stmt varchar(128) default 'SELECT I FROM TEST_CURSOR';
  declare c1 cursor with return for s1;
  prepare s1 from stmt;
  open c1;
end
@

set schema s1@
call test_cursor@

set schema s2@
call test_cursor@

3 окт 17, 10:51    [20838251]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить