Оператор EXECUTE ... USING в PL / pgSQL не работает с типом записи?

postgresql plpgsql

24191 просмотра

2 ответа

Я пытаюсь написать функцию в PL / PgSQL, которая должна работать с таблицей, которую он получает в качестве параметра.

Я использую операторы EXECUTE..INTO..USING в определении функции для построения динамических запросов (это единственный известный мне способ), но ... Я столкнулся с проблемой с типами данных RECORD.

Давайте рассмотрим следующий (чрезвычайно упрощенный) пример.

 -- 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" в типе данных записи

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

Итак ... кто-то знает, что не так с приведенным выше кодом?

Автор: Hobbes Источник Размещён: 12.11.2019 09:03

Ответы (2)


7 плюса

Решение

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

Значение RECORD действительно только в plpgsql.

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

EXECUTE 'SELECT $1.descr' INTO d USING r::text::xx;
Автор: Pavel Stehule Размещён: 21.01.2010 07:21

2 плюса

$1должно быть внутри ||, как || $1 ||и дать места правильно, тогда он будет работать.

BEGIN

EXECUTE ' delete from  ' ||  quote_ident($1)  || ' where condition ';

END;
Автор: Chinmay R Ullur Размещён: 25.04.2013 12:14
Вопросы из категории :
32x32