powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / схема в функции
8 сообщений из 8, страница 1 из 1
схема в функции
    #36335213
kiruxan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, есть некоторая функция в которой есть несколько запросов, не знает ли кто случаем, есть ли возможность менять схему для таблиц в запросе, в идеале было бы вообще чтоб она передавалась через параметр, но и хорошо было бы чтобы все таблицы определялись в той же схеме что и функция.
...
Рейтинг: 0 / 0
схема в функции
    #36335604
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kiruxan,

Добрый день.

Только если функция написана на внешнем языке прграммирования с использованием динамического sql (если v9.7, то и в sql скалярной функции можно).
Тогда надо устанавливаеть current schema в нужное значение.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
схема в функции
    #39529687
talent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток. Ситуация следующая - есть хранимая процедура SCHEMA1.STORAGE_PROC() - в ней объявляются курсоры типа
Код: plsql
1.
SELECT FIELD1, FIELD2, .... FROM TABLE;


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


не срабатывает почему-то...
Сама процедура примерно такая
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
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
...
Рейтинг: 0 / 0
схема в функции
    #39529691
talent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробовал перед вызовом
Код: plsql
1.
CALL SCHEMA1.STORAGE_PROC()


вызывать
Код: plsql
1.
SET CURRENT SCHEMA SCHEMA2


Также безрезультатно...
...
Рейтинг: 0 / 0
схема в функции
    #39529724
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Фишка" DB2'шных процедур - статический прекомпилированный SQL с уже составленными и разложенными в базе планами.
В этом смысле весь тот SQL, который Вы пишете просто как SQL PL код, уже жёстко привязан к заданной схеме и от run time значения CURRENT SCHEMA не меняется.

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

Исключение - динамический SQL (используйте prepare + execute или execute immediate).
Но это добавляет нагрузку на компиляцию (если запросов экстремально много).
...
Рейтинг: 0 / 0
схема в функции
    #39529739
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-- файл xxx.db2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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
Код: powershell
1.
2.
3.
4.
5.
6.
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
...



Использование:
Код: sql
1.
2.
set schema schema1@
CALL STORAGE_PROC()@



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

(Люди, пишущие подобные SP, не перестают меня удивлять).
...
Рейтинг: 0 / 0
схема в функции
    #39529818
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просмотрел SET CURRENT SCHEMA внутри процедуры.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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 )
...
Рейтинг: 0 / 0
схема в функции
    #39529948
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
talent,

Добрый день.

Вам надо использовать динамический SQL.
Пример
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
--#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@


...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / схема в функции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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