2015-04-07 62 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; 

儘管如此,所有的建議都歡迎。