2014-11-06 46 views
-1

我在我的數據庫中有以下代碼片段{代碼#1,代碼#2,代碼#3}。爲什麼PostgreSQL中SETOF的奇怪行爲?

CODE#1:創建類似「JAVA中的ENUM」的表「Class_Type」的語句。

它包含了一些數據,{ 「A級」,「B類」, 「體育-A」, 「紅」, 「藍」,...}

我現在想使用存儲過程是CODE#2CODE#3抓取這些值

預期的CODE#2和輸出代碼#3:

{ 

      | classtype character varying | 

      | class-A   | 

      | class-B   | 

      | sports-A   | 

      | RED    | 

      | BLUE    | 

      | .......   | 

} 

What did i find Strange?

CODE#2正在返回預期的輸出一些時間和一些倍它返回「意外的輸出」。背後的原因是什麼?

代碼#3工作正常,每次都會產生預期輸出。

的CODE#意外輸出2:

{

 | get_class_type_list character varying | 

     | class-A   | 

     | class-B   | 

     | sports-A  | 

     | RED     | 

     | BLUE    | 

     | .......    | 

}

以下是代碼段:

CODE#1

{ 

        CREATE TABLE test.class_type 
       (
        value character varying(80) NOT NULL, 
        is_active boolean NOT NULL DEFAULT true, 
        sort_order integer, 
        CONSTRAINT class_type_pkey PRIMARY KEY (value) 
       ) 
       WITH (
        OIDS=FALSE 
       ); 

} 

CODE#2

{ 
        CREATE OR REPLACE FUNCTION test.get_class_type_list() 
         RETURNS SETOF character varying AS 
       $BODY$ 
       DECLARE 
         SQL VARCHAR; 
        BEGIN 
         RETURN QUERY 
           (SELECT value AS "classType" 
           FROM TEST.CLASS_TYPE); 
        END; 
       $BODY$ 
       LANGUAGE plpgsql VOLATILE 
       COST 100 
       ROWS 1000; 

} 

CODE#3

{ 
      CREATE OR REPLACE FUNCTION test.get_class_type_list() 
       RETURNS TABLE(classType character varying) AS 
      $BODY$ 
      DECLARE 
        SQL VARCHAR; 
       BEGIN 
        RETURN QUERY 
        (SELECT value AS "classType" 
         FROM TEST.CLASS_TYPE); 

       END; 
       $BODY$ 
      LANGUAGE plpgsql VOLATILE 
      COST 100 
      ROWS 1000; 

} 

SQL Fiddle Sample Code

Edited:

我希望返回函數的列名爲「classType」,但不是函數名。

+4

「預期」和「意外」結果之間的實際區別是什麼? (你的格式很難跟蹤,爲什麼你不顯示'psql'的實際輸出?) – 2014-11-06 10:40:07

+0

@CraigRinger我已經添加了一個SQLFiddle示例代碼 – 09Q71AO534 2014-11-06 16:02:48

+0

那麼你的問題是什麼? – 2014-11-06 19:02:36

回答

0

我在結果中看到的唯一區別是列名(它實際上是一個別名)。您可以完全控制調用上下文中的列別名:sqlfiddle(以及原因,有時它的行爲不同,這是因爲RETURNS SETOF <primitive-type>是一個特殊的返回子句)。

經驗法則是,如果你在函數定義別名(如OUT參數,RETURNS TABLE & RETURNS SETOF <composite/row-type>;但不能在函數體本身),PostgreSQL會使用,除非有明確的別名。如果您使用RETURNS SETOF <primitive/simple-type>而沒有OUT參數,則默認別名是該列的函數名稱。

注意:我沒有在第一次發佈這個答案的原因是,因爲不幸的是,我在文檔中找不到任何這方面的參考。