2012-03-09 57 views
1

之後修改TYPE TYPE我想創建一個返回用戶定義類型的函數。在創建函數後,我希望能夠將類型更新爲其他類型,以便函數使用新類型,例如。PostgreSQL:可以使用TYPE創建一個函數並在

CREATE TYPE my_type AS ("Column1" text, "Column2" text); 

CREATE OR REPLACE FUNCTION my_fucntion() 
RETURNS SETOF my_type 
bla 
bla 
blah 

ALTER TYPE my_type AS ("Name" text, "Address" text) 

這可能嗎?修改將始終只是列的名稱而不是實際的數據格式,它們總是相同的。

編輯:好的事情是我有2個腳本之一是通用的,必須按原樣安裝,沒有變化。它必須安裝在多個地方。第二種是一種配置腳本。

在通用腳本中,我創建了一個函數,它返回一個我想在配置腳本中定義的類型。

我想先安裝配置腳本,但我不能,因爲我需要執行一些基於通用腳本中的函數的插入。

謝謝

回答

1

看不清楚如何才能使它工作。當您更改其定義時,取決於「my_type」的任何內容都會中斷。

也許發佈您正在嘗試解決的實際問題的另一個問題。

編輯(問題澄清後):好的 - 所以你想要爲特定的客戶或網站或某些這樣的重命名列。無論是包裝在一個視圖中的原始功能:

CREATE VIEW local_columns AS 
SELECT column1 AS foo, column2 as bar FROM my_function() 

如果你需要傳遞參數,包你的函數在其他類型和功能:

SELECT * FROM my_outer_function('some','params') 

你的配置文件就必須建立外類型+功能或視圖。

+0

編輯,但它似乎好像我有一個無盡的循環,我不認爲這將是可能的 – 2012-03-09 14:10:29

+0

我想出了一些東西。我只是使用這個安裝過程:安裝配置腳本,它創建類型,然後在調用另一個腳本,然後完成插入 – 2012-03-12 13:20:33

1

這在PostgreSQL中通常是不可能的。我引用在CREATE FUNCTION手動:

同樣,CREATE OR REPLACE FUNCTION 不會讓你更改現有函數的返回類型 。要做到這一點,你必須下降並重新創建 的功能。 (當使用OUT參數時,這意味着您不能更改任何OUT參數的類型,除非丟棄該功能。)

大膽強調我的。爲了促進這個過程(並且消除類型和功能之間的聯繫),您可以考慮使用OUT parameters or RETURNS TABLE而不是RETURNS SETOF my_type。就像這樣:

CREATE OR REPLACE FUNCTION my_function() 
RETURNS TABLE (column1 text, column2 text) AS 
$BODY$ 
-- do something 
$BODY$ language xyz; 

順便說一句:我個人的建議是始終用戶lower case identifiers PostgreSQL中。在這個例子中,我相應地重命名了OUT列。

2

我試着用PostgreSQL 9.1,它似乎只是工作。 例子:

CREATE TYPE my_type as (col1 text, col2 text); 
CREATE TABLE my_table (a my_type); 
INSERT INTO my_table values(('ab','cd')); 
CREATE FUNCTION my_function() returns setof my_type as 
    'begin return query select (a).* from my_table; end;' 
language plpgsql; 

select * from my_function(); 

輸出是:

col1 | col2 
------+------ 
ab | cd 

現在,讓我們重命名my_type列:

alter type my_type rename attribute col1 to address; 
alter type my_type rename attribute col2 to name; 

=>沒有錯誤

現在再次調用該函數:

select * from my_function(); 

沒有錯誤,輸出爲:

address | name 
---------+------ 
ab  | cd 

看起來像預期的結果,不是嗎?

+0

我們使用的是9.0版本,它似乎不起作用,懷疑它們會有任何機會的系統管理員更新它,要感謝 – 2012-03-12 13:16:59

+0

事實上,它不能與PG 9.0一起工作,因爲缺少ALTER TYPE中的RENAME ATTRIBUTE子句(根據文檔:http://www.postgresql.org/docs/9.0/靜態/ SQL-altertype.html) – 2012-03-12 18:17:13

相關問題