sql >> Database teknologi >  >> RDS >> PostgreSQL

Kan jeg få en plpgsql-funktion til at returnere et heltal uden at bruge en variabel?

Ja du kan. Der er en række måder.

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) Brug 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;

Mere i manualen her.

3) (Ab)brug IN parameter

Siden Postgres 9.0 du kan også bruge inputparametre som variable. Udgivelsesbemærkningerne til 9.0:

En inputparameter fungerer nu som en lokal variabel initialiseret til den indsendte værdi.

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 sidste du bruger en variabel implicit, men du behøver ikke DECLARE det eksplicit (som anmodet).

4) Brug en DEFAULT værdi med en INOUT parameter

Dette er lidt af en speciel sag. Funktionens brødtekst kan være 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 er kort notation for INOUT _col1 integer DEFAULT 123 . Mere:

  • Den glemte opgaveoperatør "=" og det almindelige ":="

5) Brug en almindelig SQL-funktion i stedet

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. Hvor meget størrelse Null-værdi tager i SQL Server

  2. Opgradering til PostgreSQL 11 med logisk replikering

  3. Python kalder sql-server lagret procedure med tabelværdiparameter

  4. MariaDB NULLIF() Forklaret