Списки значений из хранимых процедур

Списки значений из хранимых процедур

Для получения списков значений параметров и списков значений ячеек можно использовать хранимые процедуры.

Использование хранимых процедур является лучшим выбором, т.к. позволяет возвращать списки на разных языках.

Ниже приведен пример настройки в таблице xls.handlers для хранимых процедур.

IDTABLE_SCHEMATABLE_NAMECOLUMN_NAMEEVENT_NAMEHANDLER_SCHEMAHANDLER_NAMEHANDLER_TYPEHANDLER_CODETARGET_WORKSHEETMENU_ORDEREDIT_PARAMETERS
 s02usp_cashbookcompany_idValidationLists02xl_list_company_idPROCEDURE
 s02usp_cashbookcompany_idParameterValuess02xl_list_company_idPROCEDURE

Примеры получения списков значений хранимыми процедурами

Ниже представлены примеры хранимых процедур получения списков значений для всех поддерживаем платформ баз данных.

Используйте предлагаемые решения для получения данных.

Все процедуры примера возвращают колонки id и name из таблицы s02.companies.

Также, в процедурах демонстрируется простой подход к переводу списков значений на любой язык с использованием таблицы xls.translations и параметра @data_language.

Конечно, можно использовать собственное решение для перевода, и даже просто использовать обычный SELECT типа

SELECT id, name FROM s02.company ORDER BY name, id

Больше примеров приведено в Sample 02 - Advanced Features из состава SaveToDB SDK.

SQL Server | MySQL | PostgreSQL | Oracle | DB2 | NuoDB | Snowflake

Пример получения списка значений хранимой процедурой для Microsoft SQL Server

Обратите внимание на команду SET NOCOUNT ON, которая требуется для использования хранимых процедур SQL Server в Microsoft Excel.

CREATE PROCEDURE [s02].[xl_list_company_id]
    @data_language char(2) = NULL
AS
BEGIN

SET NOCOUNT ON

SELECT
    c.id
    , COALESCE(t.TRANSLATED_NAME, c.name) AS name
FROM
    s02.companies c
    LEFT OUTER JOIN xls.translations t ON t.TABLE_SCHEMA = 's02' AND t.TABLE_NAME = 'strings'
            AND t.LANGUAGE_NAME = @data_language AND t.COLUMN_NAME = c.name
ORDER BY
    name
    , id

END

Пример получения списка значений хранимой процедурой для MySQL

CREATE PROCEDURE s02.xl_list_company_id (
    data_language char(2)
    )
BEGIN

SELECT
    c.id
    , COALESCE(t.TRANSLATED_NAME, c.name) AS name
FROM
    s02.companies c
    LEFT OUTER JOIN xls.translations t ON t.TABLE_SCHEMA = 's02' AND t.TABLE_NAME = 'strings'
            AND t.LANGUAGE_NAME = data_language AND t.COLUMN_NAME = c.name
ORDER BY
    name
    , id;

END
//

Пример получения списка значений хранимой процедурой для PostgreSQL

CREATE OR REPLACE FUNCTION s02.xl_list_company_id (
    data_language varchar(2)
    )
    RETURNS table (
        id integer
        , name varchar
    )
    LANGUAGE plpgsql
    SECURITY DEFINER
AS $$
BEGIN

RETURN QUERY
SELECT
    c.id
    , COALESCE(t.TRANSLATED_NAME, c.name) AS name
FROM
    s02.companies c
    LEFT OUTER JOIN xls.translations t ON t.TABLE_SCHEMA = 's02' AND t.TABLE_NAME = 'strings'
            AND t.LANGUAGE_NAME = data_language AND t.COLUMN_NAME = c.name
ORDER BY
    name NULLS FIRST
    , id NULLS FIRST;

END
$$;

Пример получения списка значений хранимой процедурой для Oracle Database

CREATE PROCEDURE S02.XL_LIST_COMPANY_ID (
    DATA_LANGUAGE CHAR
    , DATA OUT SYS_REFCURSOR
    )
AS
BEGIN

OPEN DATA FOR
SELECT
    c.ID
    , COALESCE(t.TRANSLATED_NAME, N'' || c.NAME) AS NAME
FROM
    S02.COMPANIES c
    LEFT OUTER JOIN XLS.TRANSLATIONS t ON t.TABLE_SCHEMA = 's02' AND t.TABLE_NAME = 'strings'
            AND t.LANGUAGE_NAME = DATA_LANGUAGE AND t.COLUMN_NAME = c.NAME
ORDER BY
    NAME
    , ID;

END;
/

Пример получения списка значений хранимой процедурой для IBM DB2

--#SET TERMINATOR %%

CREATE PROCEDURE S02.XL_LIST_COMPANY_ID (
    DATA_LANGUAGE CHAR(2)
    )
    DYNAMIC RESULT SETS 1
    READS SQL DATA
    DETERMINISTIC
    CALLED ON NULL INPUT
    COMMIT ON RETURN NO
    LANGUAGE SQL
P1: BEGIN

DECLARE Cursor1 CURSOR WITH RETURN FOR
SELECT
    c.ID
    , COALESCE(t.TRANSLATED_NAME, c.NAME) AS NAME
FROM
    S02.COMPANIES c
    LEFT OUTER JOIN XLS.TRANSLATIONS t ON t.TABLE_SCHEMA = 's02' AND t.TABLE_NAME = 'strings'
            AND t.LANGUAGE_NAME = DATA_LANGUAGE AND t.COLUMN_NAME = c.NAME
ORDER BY
    NAME
    , ID;

OPEN Cursor1;

END P1
%%

--#SET TERMINATOR ;

Пример получения списка значений хранимой процедурой для NuoDB

CREATE PROCEDURE S02.XL_LIST_COMPANY_ID (
    DATA_LANGUAGE CHAR(2)
    )
RETURNS tmp_tab (
    ID INTEGER,
    NAME VARCHAR(50)
    )
AS

INSERT INTO tmp_tab
SELECT
    c.ID
    , COALESCE(t.TRANSLATED_NAME, c.NAME) AS NAME
FROM
    S02.COMPANIES c
    LEFT OUTER JOIN XLS.TRANSLATIONS t ON t.TABLE_SCHEMA = 's02' AND t.TABLE_NAME = 'strings'
            AND t.LANGUAGE_NAME = DATA_LANGUAGE AND t.COLUMN_NAME = c.NAME
ORDER BY
    NAME
    , ID;

END_PROCEDURE
@@

Пример получения списка значений хранимой процедурой для Snowflake

Snowflake поддерживает хранимые процедуры на языке JavaScript, которые используются аналогично.