Я пытаюсь записать функцию в PL/PgSQL, которые должны работать с таблицей, которую она получает в качестве параметра.
Я использую, ВЫПОЛНЯЮТСЯ.. В.. ИСПОЛЬЗУЯ Операторы в рамках функционального определения для создания динамических запросов (это - единственный способ, которым я знаю, чтобы сделать это), но... Я встретился с проблемой с РЕКОРДНЫМИ типами данных.
Давайте считать следование (чрезвычайно упрощенным) пример.
-- A table with some values.
DROP TABLE IF EXISTS table1;
CREATE TABLE table1 (
code INT,
descr TEXT
);
INSERT INTO table1 VALUES ('1','a');
INSERT INTO table1 VALUES ('2','b');
-- The function code.
DROP FUNCTION IF EXISTS foo (TEXT);
CREATE FUNCTION foo (tbl_name TEXT) RETURNS VOID AS $$
DECLARE
r RECORD;
d TEXT;
BEGIN
FOR r IN
EXECUTE 'SELECT * FROM ' || tbl_name
LOOP
--SELECT r.descr INTO d; --IT WORK
EXECUTE 'SELECT ($1)' || '.descr' INTO d USING r; --IT DOES NOT WORK
RAISE NOTICE '%', d;
END LOOP;
END;
$$ LANGUAGE plpgsql STRICT;
-- Call foo function on table1
SELECT foo('table1');
Это произвело следующую ошибку:
ОШИБКА: не мог определить столбец "descr" в рекордном типе данных
хотя синтаксис, который я использовал, кажется допустимым мне. Я не могу использовать статический выбор (прокомментировал в примере), потому что я хочу динамично отослать названия столбцов.
Так.. кто-то знает что случилось с вышеупомянутым кодом?
Это правда. Вы не можете использовать тип записи на внешнем пространстве PL / PGSQL.
Значение записи действительно только в PLPGSQL.
Вы можете сделать
EXECUTE 'SELECT $1.descr' INTO d USING r::text::xx;