8

我正在研究 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;

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

4

3 回答 3

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 中不起作用,这里有一个示例如何在函数内临时设置搜索路径。

于 2015-04-14T12:42:19.570 回答
0

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

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

SQL 脚本如下所示:

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

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

于 2015-05-29T06:47:22.400 回答
0

答案是函数类型。

通过官方文档

http://www.greenplumdba.com/greenplum-dba-faq/whatareimmutablestableandvolatilefunctionsingreenplum

于 2015-06-10T01:23:47.910 回答