Как создать временную таблицу с правильными типами полей на основе переданного REFCURSOR

Необходимо из переданного курсора создать временную таблицу, при этом важно сохранить все типы полей. Пытался динамически подставлять поля, крутил-вертел ничего не вышло.

Если обращаться к RECORD по конкретному имени вне динамического запроса, тип получить можно, но в том и проблема, что заранее структура REFCURSOR не известна.

Пример:

DO $$
DECLARE
    v_result_cursor REFCURSOR;
    v_row RECORD;
    v_column_names TEXT[];
    v_field_name TEXT;
    v_field_type TEXT;
BEGIN
    OPEN v_result_cursor FOR 
        SELECT X.id::int
            , X.prefix::character varying(2)
            , X.code::smallint
            , X.name::text
            , X.sname::character varying(25)
            , X.is_enabled::int
        FROM (
            VALUES
                (1,  'AM', 2, 'Текст строки 1', 'Текст строки 1.1', 1),
                (2,  'PM', 2, 'Текст строки 2', 'Текст строки 2.1', 1)
        ) X(id, prefix, code, name, sname, is_enabled)
        ;

    FETCH v_result_cursor INTO v_row;

    IF NOT FOUND THEN
        RAISE WARNING 'The cursor is empty.';
        CLOSE v_result_cursor;
        RETURN;
    END IF;

    v_column_names := ARRAY(SELECT jsonb_object_keys(to_jsonb(v_row)));

    RAISE INFO 'Fields name: %', v_column_names;

    FOREACH v_field_name IN ARRAY v_column_names
    LOOP

        FETCH v_result_cursor INTO v_row;
        EXIT WHEN NOT FOUND;

        v_field_type = pg_typeof(v_row.code); -- Вот так работает
        RAISE INFO 'Field: %, Type: %', v_field_name, v_field_type;

    END LOOP;

    CLOSE v_result_cursor;
END $$;

Ответы (0 шт):