Вызов хранимых процедур в той же схеме из SP

Как я могу вызвать хранимую процедуру в той же схеме без указания полного имени схемы при кодировании другой хранимой процедуры. Это процедуры SQL PL в DB2.

Первый ИП:

CREATE PROCEDURE MYSCHEMA.SP_TEST
  LANGUAGE SQL
  BEGIN
  END

Создание SP, вызывающего этот SP напрямую без имени схемы, вызывает ошибку компиляции:

CREATE PROCEDURE MYSCHEMA.SP_TEST2
  LANGUAGE SQL
  BEGIN
    CALL SP_TEST();
  END

Это бросит:

Не найдено авторизованной подпрограммы с именем "SP_TEST" типа "PROCEDURE" с совместимыми аргументами. SQLCODE=-440, SQLSTATE=42884, DRIVER=3.53.71

Непосредственно давая полное имя схемы работает:

CREATE PROCEDURE MYSCHEMA.SP_TEST2
  LANGUAGE SQL
  BEGIN
    CALL MYSCHEMA.SP_TEST();
  END

Однако если я когда-нибудь перейду к другой схеме, мне придется заменить эти ссылки повсюду. Есть ли подходящее решение проблемы?

3 ответа

Решение

CURRENT PATH Специальный регистр используется для разрешения вызовов к неквалифицированным хранимым процедурам и функциям. CURRENT SCHEMA используется для разрешения неквалифицированных имен объектов.

По умолчанию, CURRENT PATH имеет функции IBM плюс ваш AUTHID:

$ db2 "values substr(current path,1,60)"

1
------------------------------------------------------------
"SYSIBM","SYSFUN","SYSPROC","SYSIBMADM","IBJORHOV"

  1 record(s) selected.

Вы можете изменить это с помощью SET CURRENT PATH заявление.

При создании хранимой процедуры DB2 принимает к сведению значение CURRENT PATH во время компиляции и использует их для разрешения неквалифицированных вызовов хранимых процедур и функций внутри хранимой процедуры. Та же логика применяется для CURRENT SCHEMA и неквалифицированные имена таблиц.

Таким образом, правильный способ разрешить неквалифицированные вызовы процедур и функций внутри хранимой процедуры - это установить CURRENT PATH зарегистрируйтесь и затем создайте процедуру.

Пропускать имя SCHEMA не рекомендуется. Сохраняйте имена вашей схемы в ваших звонках. Если вы переходите на другую схему, вы должны сделать это путем извлечения / изменения сценария SQL в любом случае.

SET SCHEMA Команда позволяет изменить текущую схему:

SET CURRENT SCHEMA FOO;
CALL MY_PROC_THAT_RESIDES_IN_FOO();

Однако не так просто установить динамическое значение схемы. Вы должны либо:

  1. Сделайте что-нибудь с переменными хоста (если вы находитесь в вызывающем приложении) или
  2. Построить и выполнить строку динамического оператора SQL.

В этот момент, вероятно, становится больше проблем, чем стоит.

Более подробную информацию можно найти в документации по SET SCHEMA командование

Другие вопросы по тегам