2011-05-17 114 views
0

我只是無法完全掌握它們(從今天開始使用PostgreSQL)。在Windows上使用版本9.0.4,使用pgAdmin III。 我對MS SQL Server功能和SP有相當長的經驗。 據我瞭解,到目前爲止,PostgreSQL中沒有直接模擬MSSQL SP-s(但函數看起來是一樣的)。但是你可以創建其他語言的程序,這些語言可以被構建到postgres中。到目前爲止,我能夠產生如下:說明PostgreSQL存儲過程

CREATE OR REPLACE FUNCTION GetProduct() 
    RETURNS refcursor AS 

$BODY$ 
DECLARE pr_cur refcursor; 

BEGIN 
    OPEN pr_cur FOR 
     SELECT * FROM "Product"; 
    RETURN pr_cur; 
END; 
$BODY$ 

LANGUAGE plpgsql VOLATILE 
    COST 100; 

而且使用這樣的(Npgsql的使用庫):

NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=*;Password=*;Database=Warehouse;"); 
conn.Open(); 
NpgsqlTransaction t = conn.BeginTransaction(); 

NpgsqlCommand command = new NpgsqlCommand("GetProduct", conn); 
command.CommandType = CommandType.StoredProcedure; 
NpgsqlDataAdapter da = new NpgsqlDataAdapter(command); 

DataSet myDS = new DataSet(); 
da.Fill(myDS); 

t.Commit(); 
conn.Close(); 

myDS.WriteXml("out.xml"); 

它的工作原理,但我不完全怎麼理解。首先,我還沒有在pgAdmin的創建函數對話框的返回類型中找到refcursor(它是否是其他東西的synonim?)。第二,我仍然無法設法從pgAdmin獲得行輸出功能:

SELECT * FROM GetProduct(); 

不符合預期:)。 第三:這個「功能」的工作方式與SQL Server的SP相同嗎(編譯,執行速度快等)?或者,這仍然只是一些解決方法,以獲得幾乎相同的行爲?

最後但並非最不重要的 - 任何從SQL Server遷移的好教程?

UPDATE:

調查問題進一步的它看起來確實有直接等同爲MSSQL的SP在pgSQL的,但你可以使用函數來代替。所以現在還有一個問題,使用pgSQL函數而不是SP是否合理?據我現在瞭解,我的查詢返回某種流水遊標結果。我幾乎從來沒有在MSSQL中使用過遊標,並且知道不建議這樣做,因爲它非常低效。或者是我們在這裏處理的某種其他類型的光標?

回答

2

你可以寫一個這樣的函數。

create function GetProduct() 
returns setof Product as 
    'select * from "Product";' 
language 'sql'; 

你可以得到像這樣的結果。

select * from GetProduct(); 

如果你的函數沒有返回任何數據,就像這樣調用它。

select procedure_name(arg1, arg2) 
+0

嗯,它可能更接近於想要實現但仍然返回的結果集不同於原始查詢「select * from」Product「;」 - 5列,而不是你的查詢返回的一些奇怪的(也許這對Npgsql沒有什麼不同,還沒有測試過)。 – 2011-05-17 12:00:16

+0

我做了一個轉錄錯誤。你可能想再試一次。 – 2011-05-17 13:44:21

+0

我注意到並糾正了第一次嘗試中的錯誤。它將返回一列所有5列數據。不過,我想收到5列。 – 2011-05-17 15:08:30