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

时间:2014-08-22 21:10:20

标签: 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_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多个模式。做这个的最好方式是什么?我可以在哪里为此目的创建函数?

1 个答案:

答案 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();

重点