PostgreSQL-过程中不是已知变量

时间:2018-11-30 17:50:11

标签: postgresql postgresql-10

我无法在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 :(得分:1)

您的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生成CREATE OR REPLACE ...代码的TEXT版本,然后执行它。