我正在处理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年4月19日编辑
Postgres->Postgres
我试过像一样
select my_function(params) from pg_stat_activity;
没事。
如果像一样编辑该功能
create or replace function my_function (
...
select true into result;
它在任何情况下都可以工作。
在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中不起作用,这里有一个如何在函数中临时设置搜索路径的示例。
最后,我找到了一种方法,虽然不完善,但可以工作。
由于我可以从段访问的表。因此,将该函数作为子查询从段移到段将解决这个问题。
SQL脚本如下:
select t.*, f.* from my_table2 t join (select my_function(params)) f on true;
尽管如此,我们还是欢迎所有的建议。
答案是函数类型。
通过官方文件
http://www.greenplumdba.com/greenplum-dba-faq/whatareimmutablestableandvolatilefunctionsingreenplum