PostgreSQL - неизвестная переменная в процедуре - PullRequest
0 голосов
/ 30 ноября 2018

У меня проблемы с написанием процедуры в PostgreSQL.Я могу создать процедуру, но когда я пытаюсь ее выполнить, я получаю сообщение об ошибке. Я получаю

ERROR: "v_all_atts" is not a known variable 

запрос:

CREATE OR REPLACE FUNCTION rebuild_views_with_extra_atts()
RETURNS VOID AS $$
DECLARE
v_all_atts varchar(4000);

BEGIN
CREATE OR REPLACE FUNCTION add_column(p_table text, p_column text,p_category text) RETURNS VOID AS $nothing$
declare
  v_column_exists bigint := false ;
 BEGIN
 SELECT
 string_agg( CASE WHEN owner='alarm' THEN 'ai'  WHEN owner='fault' THEN 'fi' 
        END ||'.'||lower(alias) , ', '   ORDER BY owner, alias) AS string
 INTO STRICT
   v_all_atts
 FROM
   extra_attribute_cfg
 WHERE
   owner NOT LIKE 'virtual' and enable = true and v_column_exists = true;
 IF LENGTH(v_all_atts) is not null THEN
   v_all_atts := ', '||v_all_atts;
 END IF;

 v_view:= q'#
  CREATE OR REPLACE VIEW alarm_view AS
    SELECT
      fi.fault_id, ai.alarm_id, 

      #'||v_all_atts||q'#

    FROM
     alarm ai
      INNER JOIN fault fi
          ON fi.fault_id = ai.fault_id
#';
EXECUTE v_view;
END;
$nothing$ language plpgsql;

end;
$$ LANGUAGE plpgsql;

Я долго смотрел наДокументация Postgres и не может найти, что не так, и не нашел ответа на эту конкретную ситуацию

1 Ответ

0 голосов
/ 30 ноября 2018

Ваша функция rebuild_views_with_extra_atts() создает функцию add_column().

add_column() использует переменную v_all_atts, но она не существует в этой функции, она существует только в функции rebuild_views_with_extra_atts().

Чтобы решить эту проблему, она действительно зависит отчто ты пытаешься сделатьЕсли эта переменная должна существовать в функции add_column(), объявите ее там.Если вы пытаетесь использовать значение v_all_atts при создании add_column() (например, чтобы содержимое тела функции зависело от значения этой переменной), тогда вам действительно нужно использовать динамический sql для генерации TEXT.версия кода CREATE OR REPLACE ..., затем ВЫПОЛНИТЬ.

...