sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL vrátí funkci s uživatelským typem dat

Tohle by prostě mělo fungovat. enum by neměl být problém. Testováno s Postgres 9.1 a 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);

Kromě ...

  • Ve verzích starších než 9.2 můžete použít pouze poziční (číselné) parametry ($1 ) ve funkcích SQL (na rozdíl od funkcí plpgsql).
    Ve 9.2+ název sloupce by měl přednost, takže WHERE klauzule vašeho původního kódu by vždy měla hodnotu PRAVDA a všechny řádky by se kvalifikovaly – kromě toho, že vaše funkce vrací pouze první, protože nevrací SETOF building_code .
    Buď přejmenujte svůj parametr, nebo použijte poziční parametr, nebo nejlépe obojí.
    Pokud musíte použít konfliktní názvy parametrů, můžete předvolbu přepsat pomocí názvu funkce a kvalifikovat parametr. Jako:

    ... WHERE v.id = room_code.id
    
  • Jako název sloupce byste neměli používat název typu.

  • Neměli byste používat smíšené názvy velkých a malých písmen v uvozovkách jako roomCode , který bude složen na malá písmena, pokud neuvedete dvojité uvozovky:"roomCode" .

->SQLfiddle se 3 variantami




  1. Analýza protokolů PostgreSQL s pgBadger

  2. Jak automatizovat nasazení databáze PostgreSQL

  3. Vypněte varování a chyby na PHP a MySQL

  4. Aktualizujte záznamy v tabulce z CTE