[Конвертум Мастер Классик] Настройка параметра преобразования результирующих наборов для PostgreSQL

Как известно, PostgreSQL не позволяет возвращать результирующие наборы непосредственно из процедуры. Это может стать проблемой при переносе процедур из баз данных, поддерживающих такие процессы (Microsoft SQL Server, Sybase ASE и т. д.). Инструмент Конвертум Мастер может решить эту проблему и преобразовать процедуры, возвращающие результирующие наборы, несколькими способами. Рассмотрим эти способы на примере конвертации процедуры из Microsoft SQL Server в PostgreSQL. Эта процедура возвращает результирующий набор:

 create table test_data(c1 int, c2 varchar(22))
 create procedure result_set_pr @p1 Date as
 select @p1 as c0, c1, c2 from test_data

Параметр RETURN_RESULT_FROM_SP_AND_FN в разделе [POSTGRE] ini-файла отвечает за результат преобразования подобных процедур в нашем инструменте (как установить параметры в Конвертум Мастере):

RETURN_RESULT_FROM_SP_AND_FN может иметь следующие значения:

  • RETURN_RESULT_FROM_SP_AND_FN=SETOF В этом случае преобразование таких процедур будет осуществляться в функцию, возвращающую тип setof. Этот тип будет предварительно создан (имя типа = имя процедуры + _\rs). Все вызовы этой процедуры в других объектах будут соответствующим образом заменены на выборку из функции. Преобразование при использовании параметра со значением SETOF:

    CREATE TYPE result_set_pr_rs AS(c0 DATE, c1 INTEGER, c2 VARCHAR(22));
    CREATE OR REPLACE FUNCTION result_set_pr(v_p1 DATE)
    RETURNS SETOF result_set_pr_rs LANGUAGE plpgsql
    AS $$
    BEGIN
    return query select v_p1 as c0, c1, c2 from test_data;
    END; $$;
  • RETURN_RESULT_FROM_SP_AND_FN=REFCURSOR
    Если установлен параметр REFCURSOR, все наборы результатов будут преобразованы в дополнительные параметры INOUT. Также соответствующим образом изменятся вызовы этой процедуры в других объектах.
    Преобразование при использовании опции со значением REFCURSOR:

    CREATE OR REPLACE PROCEDURE result_set_pr(v_p1 DATE, INOUT SWV_RefCur refcursor)
    LANGUAGE plpgsql
    AS $$
    BEGIN
    open SWV_RefCur for
    select v_p1 as c0, c1, c2 from test_data;
    END; $$;

Если параметр RETURN_RESULT_FROM_SP_AND_FN не установлен, то по умолчанию преобразование происходит так, как если бы был установлен параметр SETOF. Если в исходной процедуре возвращается 2 или более результирующих набора, то они будут преобразованы в REFCURSORS, независимо от установленного параметра.
Данный параметр также влияет на преобразование функций, возвращающих таблицу. Все вышеописанное применимо и к ним. Единственное отличие заключается в том, что если вы не установите данный параметр, то по умолчанию такие функции будут преобразованы в функции, возвращающие таблицу.
Все вышеописанные значения параметра применимы ко всем исходным базам данных, которые позволяют возвращать результирующий набор в процедурах или возвращать таблицу из функций и преобразование которых поддерживается инструментом Конвертум. Более подробную информацию о том, какие базы данных поддерживает инструмент, можно найти здесь.

Выбор параметра зависит от потребностей вашей базы данных и приложения. Мы рекомендуем начинать преобразование с использования параметра по умолчанию. Однако если в вашей базе данных имеется большое количество процедур, возвращающих результирующие наборы и вызовы из приложения, мы рекомендуем использовать преобразование через рефкурсоры. Такой вариант сохраняет тип объекта (процедуру) и упрощает работу по модифкации приложения.


Если у вас есть другие вопросы, пожалуйста, свяжитесь с нами: support@convertum.ru