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

时间:2015-04-07 00:55:31

标签: postgresql greenplum hawq

我正在努力 PostgreSQL 8.2.15(Greenplum数据库4.2.0版本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移至公开
  • 将功能移至公众
  • 添加模式前缀,如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;

无论如何都可以。

3 个答案:

答案 0 :(得分: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示例如何在函数内临时设置搜索路径。

答案 1 :(得分:0)

最后,我找到了一种方法,但并不完美,但可以发挥作用。

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

SQL脚本如下:

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

尽管如此,欢迎提出所有建议。

答案 2 :(得分:0)