Postgresql 错误:greenplum数据库上不存在关系

Postgresql 错误:greenplum数据库上不存在关系,postgresql,greenplum,hawq,Postgresql,Greenplum,Hawq,我正在工作 PostgreSQL 8.2.15(Greenplum数据库4.2.0版本1)(HAWQ 1.2.1.0版本10335) 我写了一个函数,比如 create or replace function my_function ( ... select exists(select 1 from my_table1 where condition) into result; select my_function(params) from my_table2; create or

我正在工作 PostgreSQL 8.2.15(Greenplum数据库4.2.0版本1)(HAWQ 1.2.1.0版本10335)

我写了一个函数,比如

create or replace function my_function ( 
...
    select exists(select 1 from my_table1 where condition) into result;
select my_function(params) from my_table2;
create or replace function my_function ( 
...
    select true into result;
我试了一下

select my_function(params);
select my_function(params) from pg_stat_activity;
它完全可以工作

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

create or replace function my_function ( 
...
    select exists(select 1 from my_table1 where condition) into result;
select my_function(params) from my_table2;
create or replace function my_function ( 
...
    select true into result;
博士后告诉我你错了

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

  • 这些表和函数位于同一架构中
  • 我可以访问它们
  • 两个名字都是小写的
所以,请帮帮我

我试过的

  • 将这些表从my_架构移动到public
  • 将功能移到公共位置
  • 添加类似my_schema.my_table1的架构前缀

编辑:2015/04/19

博士后->博士后

我试了一下

select my_function(params);
select my_function(params) from pg_stat_activity;
没关系

如果要编辑该函数,请如下所示

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

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

在Postgresql中,函数通常在会话的当前搜索路径中运行,因此,运行函数时,问题可能是模式
我的模式
不在当前搜索路径中

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

create or replace function my_function (...) ... as $$
 ....
$$ language plpgsql set search_path from current;
(我不确定这在版本8中是否有效)


如果从当前设置搜索路径的子句在8.2中不起作用,请举例说明如何在函数中临时设置搜索路径。

最后,我找到了一种不完善但可行的方法

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

SQL脚本如下所示:

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

尽管如此,还是欢迎所有建议。

答案是函数类型

通过官方文件


显然不是这样,因为
表和函数在同一个模式中。如果可以找到
my_table2
,那么
my_table1
也是如此。如果有一个显示问题的可编译代码的最小示例,这样我们就可以重现问题。很抱歉回答得这么晚。我们搬到了不同的地方。我今天测试了你的答案。它可以工作(使用您提供的链接中的方法)。非常感谢你!!!尝试添加悬赏,但失败。我稍后再试。对不起,我弄错了。它不能工作。但也非常感谢。如果您需要答案,您可以通过提供完整的函数定义、表定义、每个对象的架构以及从
显示搜索路径
中获得的内容来帮助它。另外:您是否使用相同的设置在同一会话中运行所有测试?顺便说一句,.@Cixy:不知道这是否是你的情况,但你是否正在创建“my_table1”作为临时表?好吧,Postgres 8.2有一个bug,当您试图选择一个函数创建的临时表,而另一个函数选择了该临时表时,就会出现这个bug。。。解决方法是使用“execute”语句“选择”临时表。看看这个:@Christian B.Almeida。不,不是临时桌。正常情况下,“exists”操作符不能使用8.2 postgres处理greenplum