Как создать временную таблицу с правильными типами полей на основе переданного 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 $$;