sql >> Databasteknik >  >> RDS >> PostgreSQL

Kan jag få en plpgsql-funktion att returnera ett heltal utan att använda en variabel?

Jo det kan du. Det finns ett antal sätt.

1) RETURN (SELECT ...)

CREATE OR REPLACE FUNCTION get(_param_id integer)
  RETURNS integer AS
$func$
BEGIN
   RETURN (SELECT col1 FROM TABLE WHERE id = _param_id);
END
$func$  LANGUAGE plpgsql;

2) Använd en OUT eller INOUT parameter

CREATE OR REPLACE FUNCTION get(_param_id integer, OUT _col1 integer)
-- RETURNS integer -- "RETURNS integer" is optional noise in this case
  AS  
$func$
BEGIN
   SELECT INTO _col1  col1 FROM TABLE WHERE id = _param_id;

   -- also valid, but discouraged:
   -- _col1 := col1 FROM TABLE WHERE id = _param_id;
END
$func$  LANGUAGE plpgsql;

Mer i manualen här.

3) (Ab)använd IN parameter

Sedan Postgres 9.0 du kan också använda inmatningsparametrar som variabler. Utgivningsinformationen för 9.0:

En indataparameter fungerar nu som en lokal variabel initierad till det inmatade värdet.

CREATE OR REPLACE FUNCTION get(_param_id integer)
  RETURNS integer AS
$func$
BEGIN
   SELECT INTO _param1  col1 FROM TABLE WHERE id = _param1;
   RETURN _param1;

   -- Also possible, but discouraged:
   -- $1 := col1 FROM TABLE WHERE id = $1;
   -- RETURN $1;
END
$func$  LANGUAGE plpgsql;

Med de sista du använder en variabel implicit, men du behöver inte DECLARE det uttryckligen (som begärt).

4) Använd en DEFAULT värde med en INOUT parameter

Det här är lite av ett specialfall. Funktionskroppen kan vara tom.

CREATE OR REPLACE FUNCTION get(_param_id integer, INOUT _col1 integer = 123)
  RETURNS integer AS
$func$
BEGIN
   -- You can assign some (other) value to _col1:
   -- SELECT INTO _col1  col1 FROM TABLE WHERE id = _param_id;
   -- If you don't, the DEFAULT 123 will be returned.
END
$func$  LANGUAGE plpgsql;

INOUT _col1 integer = 123 är kort notation för INOUT _col1 integer DEFAULT 123 . Mer:

  • Den bortglömda uppdragsoperatören "=" och det vanliga ":="

5) Använd en vanlig SQL-funktion istället

CREATE OR REPLACE FUNCTION get(_param_id integer)
  RETURNS integer AS
$func$
   SELECT col1 FROM TABLE WHERE id = _param_id;
   -- use positional reference $1 instead of param name in Postgres 9.1 or older
$func$  LANGUAGE sql;



  1. Oracle FOR LOOP SELECT Statement Exempel

  2. Att reda ut PostgreSQL-uppgraderingen

  3. Beräknar skillnaden mellan två tidsstämplar i Oracle i millisekunder

  4. Hur skapar man en främmande nyckel med ON UPDATE CASCADE på Oracle?