【问题标题】:Error : relation does not exist, on greenplum database错误:关系不存在,在greenplum数据库上
【发布时间】:2015-06-11 11:36:12
【问题描述】:

我正在努力 PostgreSQL 8.2.15(Greenplum 数据库 4.2.0 build 1)(HAWQ 1.2.1.0 build 10335)。

我写了一个类似的函数

create or replace function my_function ( 
...
    select exists(select 1 from my_table1 where condition) into result;

我测试过

select my_function(params);

完全可以!

这就是问题所在,如果我像这样调用函数

select my_function(params) from my_table2;

Postgres 告诉我你错了!

错误:关系“my_table1”不存在(segXX sliceX xx.xx.xx:40003 pid=570406)

  • 这些表和函数在同一架构中。
  • 我可以访问它们。
  • 两个名称都是小写的。

所以,请帮帮我。

我尝试了什么

  • 将这些表从 my_schema 移至 public
  • 将函数公开
  • 添加架构前缀,例如 my_schema.my_table1。

2015/04/19 编辑

Postgre -> Postgres

我试过了

select my_function(params) from pg_stat_activity;

没关系。

如果像这样编辑该函数

create or replace function my_function ( 
...
    select true into result;

它可以在任何情况下工作。

【问题讨论】:

  • 如果您需要这个问题的答案,您可以通过提供完整的函数定义、表定义、每个对象的架构以及您从 SHOW search_path 获得的内容来帮助它。另外:您是否在同一会话中使用相同的设置运行了所有测试?顺便说一句,"Postgre" is not an accepted name for Postgres.
  • @Cixy:不知道是不是你的情况,但你是在创建“my_table1”作为临时表吗? AFAIK,Postgres 8.2 上有一个错误,当您尝试选择一个由函数创建并由另一个函数选择的临时表时,该错误会引发......解决方法是使用“执行”语句“选择”临时表。看看这个:stackoverflow.com/questions/19353438/…
  • @Christian B. Almeida。不,不是临时表。正常的
  • 'exists' 运算符不适用于使用 8.2 postgres 的 greenplum

标签: postgresql greenplum hawq


【解决方案1】:

在 Postgresql 中,函数通常在会话的当前搜索路径中运行,因此问题可能是当您运行该函数时,架构 my_schema 不在当前搜索路径中。

您可以通过将函数的声明更改为:

create or replace function my_function (...) ... as $$
 ....
$$ language plpgsql set search_path from current;

(我不确定这是否适用于版本 8)

如果子句 set search_path from current 在 8.2 中不起作用,here 示例如何在函数内临时设置搜索路径。

【讨论】:

  • 显然不是这样,因为tables and function are in same schema。如果可以找到my_table2,那么my_table1也是如此。
  • 如果有一个最小的可编译代码示例来展示问题,这样我们就可以重现它。
  • 抱歉这么晚才回复。我们搬到了不同的地方。我今天测试了你的答案。它可以工作(使用您提供的链接中的方法)。太感谢了!!!尝试添加赏金,但失败了。我稍后再试一次。
  • 对不起,我弄错了。它不能工作。但也非常感谢你。
【解决方案2】:

最后,我找到了一个方法,虽然不完善但可以工作。

因为我可以从段访问表。因此,将该函数作为子查询移动到 from 段将解决这个问题。

SQL 脚本如下:

select t.*, f.* from my_table2 t join (select my_function(params)) f on true;

仍然欢迎所有建议。

【讨论】:

    【解决方案3】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2013-07-11
    • 2016-03-23
    • 1970-01-01
    • 2021-01-13
    • 2021-09-16
    • 1970-01-01
    相关资源
    最近更新 更多