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

Deklarujte proměnnou složeného typu v PostgreSQL pomocí %TYPE

Použijte %ROWTYPE v tom případě.

Upravit – jednoduchý případ

Testy A.H. a DavidEG ukázaly, že to nebude fungovat. Zajímavý problém!
Můžete zkusit řešení . Pokud je vaše definice jako v příkladu, můžete se jednoduše uchýlit k

CREATE FUNCTION test(param1 comp_type)
  RETURNS integer AS
$BODY$ 
DECLARE
    myvar comp_type;
BEGIN
    return 1;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE;

Ale váš skutečný problém pravděpodobně není tak jednoduchý?

Úprava 2 – skutečný problém

Jak se dalo očekávat, skutečný problém je složitější:polymorfní typ vstupu .
Řešení tento scénář byl těžší, ale měl by fungovat bezchybně:

CREATE FUNCTION test(param1 anyelement, OUT a integer, OUT myvar anyelement)
  RETURNS record AS
$BODY$
BEGIN
    myvar := $1;  -- myvar has now the required type.

    --- do stuff with myvar.

    myvar := NULL;  -- reset if you don't want to output ..
    a := 1;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE;

Volejte:

SELECT a FROM test('("foo")'::comp_type); -- just retrieve a, ignore myvar

Zobrazit úplný výstup:

SELECT * FROM test('("foo")'::comp_type);

Poznámka pro PostgreSQL 9.0+

Ve verzi 9.0 došlo k zásadní aktualizaci. Cituji poznámky k vydání :

Takže kromě mého řešení můžete přímo využívat vstupní proměnné.

Názvy dynamických souborů




  1. Dynamický odkaz MySQL pro načtení správného řádku

  2. Jak vytvořit přehled z tabulky v Accessu 2016

  3. Opakovaný přesun dat ze serveru SQL Server do Oracle

  4. Je možné použít operátor přiřazení MySql (:=) v MySqlCommand?