Вызов хранимых процедур в той же схеме из 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();
Однако не так просто установить динамическое значение схемы. Вы должны либо:
- Сделайте что-нибудь с переменными хоста (если вы находитесь в вызывающем приложении) или
- Построить и выполнить строку динамического оператора SQL.
В этот момент, вероятно, становится больше проблем, чем стоит.
Более подробную информацию можно найти в документации по SET SCHEMA
командование