执行plpgsql脚本时出现奇怪的“未知表”
我在PostgreSQL数据库服务器的几个模式中有一个相同的表。我需要 执行一个查询,如下所示:执行plpgsql脚本时出现奇怪的“未知表”,sql,postgresql,plpgsql,dynamic-sql,postgresql-9.3,Sql,Postgresql,Plpgsql,Dynamic Sql,Postgresql 9.3,我在PostgreSQL数据库服务器的几个模式中有一个相同的表。我需要 执行一个查询,如下所示: CREATE OR REPLACE FUNCTION git_search() RETURNS SETOF git_log AS $$ DECLARE sch name; BEGIN FOREACH sch IN select schema_name from information_schema.schemata where schema_name not in ('pg_to
CREATE OR REPLACE FUNCTION git_search() RETURNS SETOF git_log AS $$
DECLARE
sch name;
BEGIN
FOREACH sch IN
select schema_name from information_schema.schemata where schema_name not in ('pg_toast','pg_temp_1','pg_toast_temp_1','pg_catalog','information_schema')
LOOP
qry := 'select count(*) from'|| quote_ident(sch) || '.git_log gl where gl.author_contributor_id = 17';
RETURN QUERY qry;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
select git_search();
但我有一个错误:
错误:git_日志类型不存在
SQL状态:42704
git_日志表在脚本的第一行中未知。子句创建
有人能帮我吗
有100多个模式需要执行针对这种情况进行调整的查询。最好的方法是什么?我可以在哪里为此创建函数?表名可以用作复合类型名,因为每个表都会自动创建一个同名模式限定的复合类型 错误的直接原因是:在当前的表中找不到与之同名的git_log关联的复合类型,因此无法解析类型名 由于您使用许多模式和许多名为git_log的表实例进行操作,因此需要明确无误,并且模式限定表名。只需选择其中一个模式中的任何一个表,它们都共享相同的布局: 但是你的其他功能也不起作用。它不是一个plpgsql脚本,而是一个函数定义。试试这个:
CREATE OR REPLACE FUNCTION git_search()
RETURNS SETOF one_schema.git_log AS
$func$
DECLARE
sch text;
BEGIN
FOR sch IN
SELECT schema_name
FROM information_schema.schemata
WHERE schema_name NOT LIKE 'pg_%'
AND schema_name <> 'information_schema'
ORDER BY schema_name
LOOP
RETURN QUERY EXECUTE format(
'SELECT count(*)
FROM %I.git_log
WHERE author_contributor_id = 17', sch);
END LOOP;
END
$func$ LANGUAGE plpgsql;
电话:
要点
用于在数组中循环,需要一个循环
您需要动态SQL
使用SELECT*FROM调用函数
相关答案众多答案中的一个:
可能git_log在创建函数的模式中不是已知的类型。@GordonLinoff有100多个模式需要执行针对这种情况调整的查询。最好的方法是什么?我可以在哪里为此目的创建函数?您需要定义一个类型,该类型可以是函数当前编写方式的字符串,也可以是一个整数(假设您的意思是返回查询执行)。很抱歉,Gordon的注释完全不正确。在其中创建函数的模式与此处的任何内容都无关。您不必定义更多类型,当然也不必定义字符串类型。。或一个整数。请忽略这一点。我发布了一个全面的答案。@ErwinBrandstetter感谢您的帮助,现在脚本可以正常运行了。在最后的代码中,我的函数返回“SETOF record”,而不是“one_schema.git_log”,并且我调整了调用的上下文:选择*FROM git_search AS foo val bigint@TarcisioM.:我几乎从不使用返回的记录集返回匿名记录。Postgres无法分解记录,每次调用都必须提供列定义列表。而且
SELECT * FROM git_search();