Конкататные текстовые переменные в функции postgresql - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть этот код, и я хочу объединить переменные, но не работаю.Это мой код DDL для представления:

CREATE OR REPLACE function acd.add_credito2()
RETURNS void
SET SCHEMA 'acd'
SET search_path = acd
AS $$
DECLARE
    auxsigla text;
    auxnome text;
    _sql text := 'CREATE OR REPLACE VIEW acd.teste AS SELECT md.matriz_disciplina_id AS id, dcp.nome, mc.curso, mc.versao AS matriz';    
    _join text := ' FROM matriz_disciplina as md LEFT JOIN disciplina as dcp ON md.disciplina_id = dcp.disciplina_id LEFT JOIN matriz_curricular as mc ON md.matriz_curricular_id = mc.matriz_curricular_id';

BEGIN
    select into auxsigla, auxnome from ( select sigla, nome from acd.categoria_credito where categoria_credito_id = 9) as foo;
    _join := _join || ' LEFT JOIN (SELECT creditos, matriz_disciplina_id FROM acd.disciplina_credito WHERE categoria_credito_id = ' || x || ') AS ' || "auxsigla" ' ON ' || "auxsigla" || '.matriz_disciplina_id = md.matriz_disciplina_id';
        _sql := _sql || ', ' || "auxsigla" || '.' || auxnome || ' AS ' || auxnome;

    _sql := _sql || _join;

    EXECUTE _sql;
END;
$$ LANGUAGE plpgsql

Итак, когда я выполняю функцию

database-1=# select acd.add_credito2();

Появляется эта ошибка:

ERROR:  type "auxsigla" does not exist
LINE 1: ...WHERE categoria_credito_id = ' || x || ') AS ' || "auxsigla"...
                                                             ^
QUERY:  SELECT _join || ' LEFT JOIN (SELECT creditos, matriz_disciplina_id FROM acd.disciplina_credito WHERE categoria_credito_id = ' || x || ') AS ' || "auxsigla" ' ON ' || "auxsigla" || '.matriz_disciplina_id = md.matriz_disciplina_id'
CONTEXT:  PL/pgSQL function add_credito2() line 13 at assignment

Может кто-нибудь помочьмне?Я не знаю, что делать сейчас.

(я знаю, у этого исследования нет цели, но это идея, которую я хочу использовать в реальном представлении)

1 Ответ

0 голосов
/ 19 сентября 2018

Ошибка возникает из этой конструкции:

"auxsigla" ' ON '

Вы забыли оператор объединения || между этими двумя токенами, и теперь анализатор SQL интерпретирует его как

data_type string_constant

, чтоспособ указать константы определенного типа данных.

Рабочими примерами могут быть DATE '2018-09-20' или INTEGER '-20'.

В вашей функции есть множество других проблем, две из которых я мог заметить:

  • select into auxsigla, auxnome from всегда будет устанавливать переменные на NULL, потому что вы забыли указать, какие столбцы вы хотите выбрать.

  • вы делаетенеправильно экранировать одинарные кавычки при составлении динамической строки запроса.Что если auxsigla имеет значение with'quote?

    Используйте для этого format() или quote_literal() и quote_ident().

...