我在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_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_log"类型不存在
SQL状态:42704
{1}}表在第一行脚本中未知。 (条款git_log
)
任何人都可以帮助我?
我需要执行针对此情况调整的查询的100多个模式。做这个的最好方式是什么?我可以在哪里为此目的创建函数?
答案 0 :(得分:1)
表名称可以作为复合类型名称使用,因为自动为每个表创建同名的复合类型(模式限定)。
错误的直接原因:在当前search_path
中找不到任何名为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;
呼叫:
SELECT * FROM git_search();
使用SELECT * FROM
。
相关答案(众多之一):