ВЫПОЛНИТЕСЬ … оператор USING в PL/pgSQL не работает с типом записи?

Я пытаюсь записать функцию в 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" в рекордном типе данных

хотя синтаксис, который я использовал, кажется допустимым мне. Я не могу использовать статический выбор (прокомментировал в примере), потому что я хочу динамично отослать названия столбцов.

Так.. кто-то знает что случилось с вышеупомянутым кодом?

6
задан Hobbes 20 January 2010 в 20:43
поделиться

1 ответ

Это правда. Вы не можете использовать тип записи на внешнем пространстве PL / PGSQL.

Значение записи действительно только в PLPGSQL.

Вы можете сделать

EXECUTE 'SELECT $1.descr' INTO d USING r::text::xx;
7
ответ дан 10 December 2019 в 02:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: