我无法在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文档,找不到问题所在,也没有找到针对这种情况的答案
答案 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版本,然后执行它。