执行plpgsql脚本时出现奇怪的“未知表”

执行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

我在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_日志类型不存在 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();