powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Деплоинг процедур
6 сообщений из 6, страница 1 из 1
Деплоинг процедур
    #36061641
шубин_ду
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, наконец, встала задача подготовить деплоинг SQL PL процедур в клиентскую базу на UNIX AIX. И призадумался я, а как это правильно сделать.

Имеется набор процедур. Процедуры лежат в схеме SCHEMA1 и предназначены для работы как с объектами в SCHEMA1 так и в SCHEMA2. Заранее до развертывания имена схем неизвестны. Это знает только админ клиента. Поэтому исходные коды процедур не должны иметь внутри себя имена схем. Предполагается, что админ устанавливает значения переменных ${SCHEMA1}, ${SCHEMA2} и запускает срипт для установки приложения. Само приложение схем не знает.

Процедуры из SCHEMA1 имеют доступ к

1. таблицам,
2. процедурам и
3. сиквенсам

из SCHEMA2.

1. Чтобы обеспечить доступ к таблицам без указания схем в SCHEMA1 сделаны алиасы на имена таблиц:

Код: plaintext
db2 -v create alias address_2                   for ${SCHEMA2}.address 

и в коде используется address_2 вместо schema2.address.

2. Для доступа к процедурам в операторе CALL без имен схем используем current path:

db2 -v set current path = sysibm, sysfun, sysproc, sysibmadm, ${SCHEMA2}

3. Но вот что делать с сиквенсами непонятно. Для сиквенсов алиасы не предусмотрены. current path на них тоже не распространяется. Как избавиться от схемы в коде SQL PL для сиквенсов? Речь идет об этом:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create procedure prc_map(
   in    ext_id          bigint
)
  specific prc_map
  modifies sql data
  language sql
begin

-- blablabla

   for row as
      select address_id from address2
   do
      insert into map_address values( row.address_id, next value for schema2.seq_address_id );
      set loc_record_processed = loc_record_processed +  1 ;
      call prc_get_next_unit( ext_id );
   end for;

-- blablabla

end@

Тут address2 - это таблица их SCHEMA2, доступ к ней обеспечивает алиас
prc_get_next_unit - это процедура из SCHEMA2. Компиляция проходит поскольку задан current path.

А вот что делать с schema2.seq_address_id? В коде не должно быть упоминания schema2, так как имя schema2 определяет админ клиента. Заменить его на ${SCHEMA2} не получится поскольку CLP не понимает переменных Юникса. Насколько я знаю своих переменных подстановки у CLP нет.

Конечно, можно сделать в SCHEMA2 функцию, которая запрашивала бы сиквенс и возвращала бы значение и вызывать эту функцию в SCHEMA1, но хотелось бы попроще. Может есть на этот счет "Бест практис"?
...
Рейтинг: 0 / 0
Деплоинг процедур
    #36061828
herr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шубин_ду,

У вас там такая хитрая миграция app?

кстати, в 9.7 можно делать алиас на sequence
...
Рейтинг: 0 / 0
Деплоинг процедур
    #36061930
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
шубин_ду,

Этот подход не поможет?
...
Рейтинг: 0 / 0
Деплоинг процедур
    #36062141
шубин_ду
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein,

Спасибо. Да, наверное с sed сделаю. Я думал, может как-нибудь попроще можно.
...
Рейтинг: 0 / 0
Деплоинг процедур
    #36062157
шубин_ду
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
herrшубин_ду,

У вас там такая хитрая миграция app?

кстати, в 9.7 можно делать алиас на sequence

До 9.7 еще дожить надо. Пока 9.5. Миграция не хитрая. Но миграционное приложение должно быть отделено от продукционного путем размещения в своей собственной схеме. Отсюда проблема доступа к объектам в чужой схеме. По-моему достаточно обычная ситуация.
...
Рейтинг: 0 / 0
Деплоинг процедур
    #36068705
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
под AIX можно собрать и поставить bash
я обычно так делаю:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#!/bin/bash


SCHEMA_NAME=db2admin

db2 -td@ -v << :ENDSQL
    connect to xu_lunm user db2admin using ibmdb2@
    create table x (id int)@
    --
    drop procedure my_proc@
    create procedure my_proc(out schema_name varchar( 50 ))
    begin
        insert into ${SCHEMA_NAME}.x values( 1 );
        set schema_name='${SCHEMA_NAME}';
    end
    @
    --
    commit
    @
    call my_proc(?)
    @
:ENDSQL

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


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