Хранимые процедуры

Пример SQL и хранимых процедур DB2, которые можно использовать с провайдером данных JDBC.

Провайдер данных JDBC может обрабатывать наборы результатов, возвращенные хранимой процедурой. В хранимую процедуру можно передать строковые или числовые входные параметры. Ниже приведен синтаксис запуска хранимой процедуры:
call[:индекс] имя_процедуры [аргумент] ...
Где:
индекс
Дополнительное целое число, указывающее, какой набор результатов должен использоваться провайдером данных. Этот параметр имеет смысл использовать, если хранимая процедура возвращает несколько наборов результатов, а вы хотите собрать значения только из одного из них. Если индекс не указан, то собираются и возвращаются данные из всех наборов результатов.
имя_процедуры
Имя хранимой процедуры, которую должен запустить провайдер данных.
аргумент
Входной аргумент хранимой процедуры. Несколько аргументов разделяются пробелами. Если имя аргумента содержит пробел, то заключите имя в кавычки. Если аргумент можно проанализировать как целое число, то он передается в хранимую процедуру как целочисленный аргумент. Любой аргумент, заключенный в кавычки, передается как строковый аргумент.

Примеры SQL Server

call sp_helpdb

Выполняет процедуру call sp_helpdb; аргументы для этой процедуры не требуются. В данные, возвращенные провайдером данных, включаются данные из всех возвращенных наборов результатов.

call:2 sp_helpdb master

Выполняет процедуру sp_helpdb с аргументом master. Это входной строковый аргумент. В данные, возвращенные провайдером данных, включаются только данные из второго набора результатов, возвращенного хранимой процедурой.

Если не указан индекс, то собираются данные из всех возвращенных наборов результатов. В этом случае убедитесь, что возвращенные данные совместимы с заданными атрибутами. Agent Builder создает атрибуты из первого возвращенного набора результатов; предполагается, что все ожидаемые дополнительные наборы результатов совместимы с первым набором.

Хранимые процедуры DB2

Ниже приведен пример функции DB2, написанной на SQL. В примере показано, как возвратить результаты, которые может обработать провайдер данных JDBC Agent Builder:
-- Этот сценарий запускается так:
-- db2 -td# -vf db2sample.sql

-- Эта процедура показывает, как возвратить запрос из
-- хранимой процедуры DB2; этот запрос может использоваться 
-- провайдером JDBC Agent Builder. Хранимая процедура
-- возвращает следующие столбцы:
-- Имя                Описание                 Тип данных
-- current_timestamp  Текущее системное время  отметка времени
-- lock_timeout       Срок ожидания блокировки      числовая шкала 0
-- user               Пользователь сеанса      строка из 128 символов
DROP procedure db2sample#

CREATE PROCEDURE db2sample()
  RESULT SETS 1
  LANGUAGE SQL
BEGIN ATOMIC
  
  -- Задать SQL для запроса
  DECLARE c1 CURSOR WITH HOLD WITH RETURN FOR
  SELECT CURRENT TIMESTAMP as current_timestamp, 
CURRENT LOCK TIMEOUT as lock_timeout, CURRENT USER as user
  FROM sysibm.sysdummy1; 

  -- Передать запрос и возвратить данные
  OPEN c1;
END#

Эту функцию можно вызвать из Agent Builder, используя синтаксис, определенный для других хранимых процедур. Для выполнения этой хранимой процедуры в качестве оператора JDBC нужно задать call db2sample.

Хранимые процедуры Oracle

Хранимые процедуры Oracle не возвращают наборы результатов. Вместо этого нужно создать функцию, которая возвращает указатель ссылки Oracle. Ниже приведен пример функции Oracle, написанной на PL/SQL; в примере показано, как возвратить результаты, которые может обработать провайдер данных JDBC Agent Builder:
CREATE OR REPLACE FUNCTION ITMTEST
RETURN SYS_REFCURSOR
IS
        v_rc SYS_REFCURSOR;
НАЧАТЬ
  OPEN v_rc FOR SELECT * FROM ALL_CLUSTERS;
  RETURN v_rc;
END;

Эту функцию можно вызвать из Agent Builder, используя синтаксис, определенный для других хранимых процедур. Для выполнения этой хранимой процедуры в качестве оператора JDBC нужно задать call ITMTEST. Так как функция Oracle должна возвращать ссылку указателя, функции Oracle могут обрабатывать только один набор результатов. Это значит, что опция индекса не поддерживается для Oracle, так как методов для возвращения нескольких наборов результатов нет.