Procedury składowane w PostgreSQL/Operatory konwersji typów
Wygląd
Do zdefiniowania operatora konwersji typów (CAST X AS Y) potrzebna jest jedynie funkcja, która przyjmuje jako argument wartość typu źródłowego X, a zwraca typ docelowy Y. Na przykład:
CREATE TYPE xyz AS (x integer, y integer, z integer);
CREATE OR REPLACE FUNCTION xyz_as_integer(r xyz) RETURNS integer AS $$
BEGIN
RAISE NOTICE 'xyz_as_integer()';
-- w tym przypadku nic sensownego
RETURN r.x + r.y + r.z;
END
$$ LANGUAGE 'plpgsql';
DROP CAST (xyz AS integer);
CREATE CAST (xyz AS integer)
WITH FUNCTION xyz_as_integer(xyz)
-- AS ASSIGNMENT
-- AS IMPLICIT
;
Domyślnie zawsze należy wprost podać sposób konwersji, np.
SELECT 5 + CAST(((1,2,3)::xyz) AS integer);
Operator można zadeklarować również jako:
- AS IMPLICIT - domyślny,
- AS ASSIGNMENT - domyślny przy przypisaniu.
W pierwszym przypadku, zawsze jeśli tylko system znajdzie jednoznaczne rzutowanie, automatycznie je wywoła.
W drugim przypadku konwersja następuje wyłącznie przy wstawianiu (INSERT) lub aktualizacji danych (UPDATE), a więc w przykładzie nie wykona się tylko pierwsze zapytanie.
-- 1. tylko IMPLICIT
SELECT 5 + (1,2,3)::xyz;
-- 2. IMPLICIT oraz ASSIGNMENT
UPDATE table SET pole_calkowite=(5,6,1)::xyz WHERE warunek;
-- 3. IMPLICIT oraz ASSIGNMENT
INSERT INTO table (pole_calkowite) VALUES ((5,6,1)::xyz);