PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL zwraca funkcję z niestandardowym typem danych

To powinno po prostu działać. enum nie powinno być problemem. Testowane z Postgresem 9.1 i 9.2

CREATE TYPE building_code AS ENUM ('IT','EMS','HSB','ENG');
CREATE TEMP TABLE venue (id int PRIMARY KEY, building_code building_code);
INSERT INTO venue VALUES (1, 'ENG');

CREATE OR REPLACE FUNCTION room_code(_id int) --!
  RETURNS building_code AS 
$func$
SELECT building_code FROM venue v WHERE v.id = $1 -- !
$func$ LANGUAGE SQL;

SELECT * FROM room_code(1);

Z wyjątkiem ...

  • W wersjach przed 9.2 możesz używać tylko parametrów pozycyjnych (numerycznych) ($1 ) w funkcjach SQL (w przeciwieństwie do funkcji plpgsql).
    W 9.2+ nazwa kolumny miałaby pierwszeństwo, więc WHERE klauzula twojego oryginalnego kodu zawsze będzie TRUE i wszystkie wiersze będą się kwalifikować - z wyjątkiem tego, że twoja funkcja zwraca tylko pierwszy, ponieważ nie zwraca SETOF building_code .
    Zmień nazwę parametru lub użyj parametru pozycyjnego, a najlepiej obu.
    Jeśli musisz użyć sprzecznych nazw parametrów, możesz zastąpić preferencję, używając nazwy funkcji do zakwalifikowania parametru. Na przykład:

    ... WHERE v.id = room_code.id
    
  • Nie należy używać nazwy typu jako nazwy kolumny.

  • Nie należy używać niecytowanych nazw mieszanych wielkości liter, takich jak roomCode , który zostanie złożony małymi literami, chyba że umieścisz cudzysłów:"roomCode" .

->SQLfiddle z 3 wariantami




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zwiększyć maksymalną liczbę połączeń w postgresie?

  2. Dodaj lata do daty w PostgreSQL

  3. W jaki sposób pgBouncer pomaga przyspieszyć działanie Django?

  4. Gdzie PostgreSQL przechowuje bazę danych?

  5. Aktualizacje pola JSON nie są zachowywane w DB