PostgreSQL 9.5: возвращать столбцы на основе входного параметра - PullRequest
0 голосов
/ 05 мая 2018

У меня есть следующая таблица.

Таблица

CREATE TABLE tblTest
(
    Column1 int,
    Column2 int,
    Column3 int,
    Column11 int,
    Column111 int,
    Column1111 int,
    Column22 int,
    Column222 int,
    Column33 int
);

Отчеты

INSERT INTO tblTest VALUES(1,2,3,11,111,1111,22,222,33);

Я пишу FUNCTION, чтобы вернуть результат из приведенной выше таблицы на основе переданного параметра.

Параметр p_ColumnName используется для передачи имени столбца. На основе имени столбца должен отображаться список столбцов.

Функция

CREATE OR REPLACE FUNCTION ufn_test
(
    p_ColumnName text
)
RETURNS -- ? How to specify the dynamic return type or dynamic column list ?
AS

$BODY$

DECLARE v_ColumnsList text;
    v_query text;
BEGIN

    IF p_ColumnName = 'Column1'
    THEN
        v_ColumnsList := 'Column11,Column111,Column1111';

    ELSIF p_ColumnName = 'Column2'
    THEN
        v_ColumnsList := 'Column22,Column222';

    ELSIF p_ColumnName = 'Column3'
    THEN
        v_ColumnsList := 'Column33';

    END IF;

    v_query := 'SELECT '|| v_ColumnsList ||' FROM tblTest';

    RETURN QUERY EXECUTE v_query;

END;

$BODY$

LANGUAGE PLPGSQL;

1 Ответ

0 голосов
/ 05 мая 2018

Я полагаю, вы используете тип RefCursor в Returns.

Основываясь на языке, который вы используете (SQL, Java ...), вы можете получать данные из этого курсора.

Итак, ваша функция станет

CREATE OR REPLACE FUNCTION ufn_test( p_ColumnName text )
RETURNS refcursor AS
$BODY$
DECLARE 
    v_ColumnsList text;
    v_query text;
    ref_cursor refcursor;
BEGIN

    IF (p_ColumnName = 'Column1') THEN
        v_ColumnsList := 'Column11,Column111,Column1111';
    ELSIF (p_ColumnName = 'Column2') THEN
        v_ColumnsList := 'Column22,Column222';
    ELSIF (p_ColumnName = 'Column3') THEN
        v_ColumnsList := 'Column33';
    END IF;

    v_query := 'SELECT '|| v_ColumnsList ||' FROM tblTest';

    OPEN ref_cursor FOR EXECUTE (v_query);

    RETURN ref_cursor;

END;
$BODY$
LANGUAGE plpgsql;

Надеюсь, это поможет вам.

...