2015-04-07 118 views
9

我正在研究 PostgreSQL 8.2.15(Greenplum数据库4.2.0构建1)(HAWQ 1.2.1.0构建10335)。错误:关系不存在,关于greenplum数据库

我写了一个函数一样

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的告诉我说你错了!

ERROR: relation "my_table1" does not exist (segXX sliceX xx.xx.xx:40003 pid=570406)

  • 那些表和功能都在同一个模式。
  • 我可以访问它们。
  • 这两个名字都是小写。

所以,请帮助我。

我试过

  • 移动从my_schema这些表公共
  • 移动功能的公共
  • 添加模式前缀像my_schema.my_table1。

编辑由2015年4月19日

Postgre - > Postgres的

我试着像

select my_function(params) from pg_stat_activity; 

这是确定的。

如果编辑功能类似

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

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

+0

如果你需要一个答案,你可以帮助它一起通过提供完整的功能定义,表定义,每个对象的模式,你会得到什么' SHOW search_path'。另外:你是否在相同的会话中使用相同的设置运行所有测试?顺便说一下,[“Postgre”不是Postgres的公认名称](https://wiki.postgresql.org/wiki/Identity_Guidelines)。 –

+0

@Cixy:不知道你的情况,但是你是否将“my_table1”创建为临时表? AFAIK,Postgres 8.2有一个错误,当你尝试选择一个由函数创建并由另一个选择的临时表时会引发一个错误...解决方法是使用“execute”语句“选择”临时表。检查了这一点:http://stackoverflow.com/questions/19353438/postgres-doesnt-recognize-temp-table-in-function – Christian

+0

@Christian B. Almeida。不,不是临时桌子。正常 – Clxy

回答

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示例如何在函数内暂时设置搜索路径。

+0

的greenplum一起使用这显然不是它,因为'表和函数在相同的模式中。如果可以找到'my_table2','my_table1'也是如此。 –

+0

这将有助于甚至有一个展示问题的可编译代码的最小示例,以便我们可以重现它。 –

+0

对不起,这么晚回答。我们采取了不同的方式。 我今天测试了你的答案。 它可以工作(使用你给的链接中的方法)。 非常感谢你! 尝试添加赏金,但失败。我会稍后再试。 – Clxy

0

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

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

SQL脚本如下喜欢:

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

尽管如此,所有的建议都欢迎。