Команда REQUEST
DaJet Script реализует вызов хранимых процедур баз данных. Данный функционал реализован однообразно для MS SQL Server и PostgreSQL. Для PostgreSQL функционал доступен только начиная с 11-ой версии и выше.
Возврат значений из хранимых процедур возможен только в виде исходящих параметров. Это обусловлено соответствующими ограничениями реализации PostgreSQL. При этом на текущий момент времени DaJet Script поддерживает возврат только одного исходящего параметра. Входящих параметров может быть столько сколько позволяет соответствующая СУБД.
Команда REQUEST не требует использования команды USE для создания соответствующего контекста базы данных. Вызов хранимой процедуры выполняется в собственном контексте, заданном строкой подключения.
Пример вызова хранимой процедуры MS SQL Server
DECLARE @input number = 1 -- Входящий параметр
DECLARE @output number = 1 -- Исходящий параметр
-- Строка подключения к базе данных дополняется именем
-- хранимой процедуры. В данном случае это test_db_proc.
REQUEST 'mssql://server/database/test_db_proc'
WITH @input
INTO @output
PRINT @output -- Фиксируем результат в файле dajet.log
RETURN @output -- Возвращаем результат вызывающей стороне
Код соответствующей хранимой процедуры MS SQL Server
CREATE PROCEDURE [dbo].[test_db_proc]
@input int,
@output int OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @output = @input + 1;
END
Пример вызова хранимой процедуры PostgreSQL
DECLARE @input number = 1 -- Входящий параметр
DECLARE @_output number = 1 -- Исходящий параметр
-- Строка подключения к базе данных дополняется именем
-- хранимой процедуры. В данном случае это test_db_proc.
REQUEST 'pgsql://postgres:postgres@localhost:5432/database/test_db_proc'
WITH _input = @input
INTO @_output
PRINT @_output -- Фиксируем результат в файле dajet.log
RETURN @_output -- Возвращаем результат вызывающей стороне
Код соответствующей хранимой процедуры PostgreSQL
CREATE OR REPLACE PROCEDURE public.test_db_proc(
_input numeric,
INOUT _output numeric)
LANGUAGE 'plpgsql'
AS $BODY$
begin
_output = _input + 1;
end;
$BODY$;