Как вызвать пользовательскую функцию без имени схемы в динамическом запросе в процедуре DB2 - PullRequest
0 голосов
/ 18 октября 2019

Без имени схемы невозможно вызвать пользовательскую функцию.

CREATE PROCEDURE TEST_PROC (
    IN IN_EMP_ID INT
)
LANGUAGE SQL
DYNAMIC RESULT SETS 1
ISOLATION LEVEL CS
DISABLE DEBUG MODE
VALIDATE BIND
DYNAMICRULES BIND
QUALIFIER ABC
BEGIN
DECLARE STMT VARCHAR(500) ;
        DECLARE emp_curr CURSOR WITH RETURN FOR TRANSACTIONS;
        SET STMT = '';

        SET STMT = STMT ||'SELECT ' ||
                                      'EMP_ID, ' ||
                                      'ABC.TEST_FUNCTION(EMP_ID), ' ||
                                      'EMP_NAME, ' ||
                                      'SALARY, ' ||
                                      'COMPANY ' ||
                                    'FROM ' ||
                                      'EMP_DETAILS ' ||
                                    'WHERE 1=1 ';
            IF IN_EMP_ID IS NOT NULL THEN
                SET STMT = STMT || ' AND EMP_ID =' || IN_EMP_ID ;
            END IF ;

            PREPARE TRANSACTIONS FROM STMT ;
        OPEN emp_curr;
END;

, когда я пытаюсь выполнить эту процедуру, но она работает, но если я удаляю псевдоним из моей функции, как выделено, поэтому он не можетвызовите функцию определения пользователя. Пожалуйста, помогите мне спасибо заранее.

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Разрешение имен для программных объектов, таких как функции, в динамическом SQL контролируется переменной CURRENT PATH :

CURRENT PATH (или CURRENT_PATH)специальный регистр задает значение VARCHAR(2048), которое определяет путь SQL, используемый при разрешении неквалифицированных имен функций, имен процедур, имен типов данных, имен глобальных переменных и имен объектов модулей в динамически подготовленных инструкциях SQL.

SET PATH влияние на динамическое выражение внутри примера процедуры:

--#SET TERMINATOR @

CREATE OR REPLACE FUNCTION S1.TEST_SCALAR() RETURNS INT RETURN 1@

CREATE OR REPLACE FUNCTION S2.TEST_SCALAR() RETURNS INT RETURN 2@

CREATE OR REPLACE PROCEDURE TEST_DYN()
DYNAMIC RESULT SETS 1
BEGIN
  DECLARE C1 CURSOR WITH RETURN FOR S1;

  PREPARE S1 FROM 'SELECT TEST_SCALAR() AS RES FROM (VALUES 1) T(I)';
  OPEN C1;
END@

SET PATH = "S1", USER, SYSTEM PATH@
CALL TEST_DYN@

SET PATH = "S2", USER, SYSTEM PATH@
CALL TEST_DYN@

Результат:

SET PATH = "S1", USER, SYSTEM PATH
DB20000I  The SQL command completed successfully.

CALL TEST_DYN


  Result set 1
  --------------

  RES
  -----------
            1

  1 record(s) selected.

  Return Status = 0

SET PATH = "S2", USER, SYSTEM PATH
DB20000I  The SQL command completed successfully.

CALL TEST_DYN


  Result set 1
  --------------

  RES
  -----------
            2

  1 record(s) selected.

  Return Status = 0
0 голосов
/ 18 октября 2019

Вы можете использовать оператор SET PATH, чтобы помочь разрешить неквалифицированные имена функций (и имена типов данных), и это работает на всех платформах, с некоторыми изменениями в правилах и синтаксисе. Поэтому выберите платформу Db2-сервера по одной из ссылок ниже.

Идея состоит в том, что вы говорите Db2, как искать неквалифицированное имя функции. Обратите внимание, что это отличается от неквалифицированных таблиц / представлений и т. Д.

Для Db2 для Z / OS см. Документацию здесь.

Для Db2 для i-series см. Это page .

Для Db2 для Linux / Unix / Windows см. здесь для получения подробной информации об изменении специального регистра CURRENT PATH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...