2013-03-08 67 views
0

我在尋找的是我稱之爲「參數化視圖」的內容。當在互聯網上瀏覽時,我瞭解到PostgreSQL不支持這種功能,而應該使用函數。功能中的參數化視圖或通用返回值

所以我創建了一個功能:

CREATE OR REPLACE FUNCTION public.student_get_byschool(
    _schoolid integer 
) RETURNS SETOF student AS 
$body$ 
    SELECT * FROM student WHERE schoolid=_schoolid; 
$body$ 
LANGUAGE 'sql'; 

不過,如果我想通過加入其他記錄來選擇多一點的是學生,我RETURNS條款是不正確的了。我可以解決這個問題有兩種方法:

  1. 使用RETURNS SETOF RECORD,但似乎在我的C#.NET應用程序的一些問題,因爲它沒有給我任何列定義。
  2. 創建一個新類型,它包含我想要返回的所有數據,但是這會引入冗餘,這是我非常想在數據庫設計中避免的。

我現在的問題是,這些是唯一的選擇,還是更有可能的。請注意,我剛開始使用PostgreSQL和C#.NET。

+0

使用'returns table(col1 integer,...)' – 2013-03-08 14:16:31

回答

1

根據documentation for CREATE FUNCTION您可以使用OUT參數或RETURNS TABLE爲此。 RETURNS TABLE往往更具可讀性。

This Postgres Online article可能證明是有趣的,雖然我沒有詳細閱讀它來檢查它,並確保它是最新的和正確的。

+0

是的,我也找到了'RETURNS TABLE',儘管它全部在一個定義中,但仍然有一些冗餘。我現在傾向於用WHERE子句來看待視圖。 – 2013-03-08 14:22:00

+0

@BartFriederichs如果變體的數量很少,那麼這可能是一個不錯的選擇 - 而且視圖有時也更好地內聯。如果您使用函數,請使用普通的'SQL'函數,如果您希望它們能夠內聯,請*標記* STRICT'。不幸的是有些冗餘是必須的,因爲Pg需要知道函數中查詢的輸出類型,才能真正檢查函數體;這是能夠支持各種可插入過程語言的成本之一。 – 2013-03-08 14:33:44

+0

感謝您的信息,我會牢記在心。我也在檢查我的想法顯然是有效的。 – 2013-03-08 14:36:55