sql >> Databasteknik >  >> RDS >> PostgreSQL

Markörbaserade poster i PostgreSQL

1. Implicit markör

Det är nästan alltid bättre att använda den implicita markören för en FOR loop än att tillgripa en något långsammare och svårhanterlig explicit markör. Jag har skrivit tusentals plpgsql-funktioner och bara en hand full av gånger explicita markörer var vettigt.

CREATE OR REPLACE FUNCTION avoidable_states()
  RETURNS SETOF varchar AS
$func$
DECLARE
    rec record;
BEGIN   
   FOR rec IN
      SELECT *
      FROM   address ad
      JOIN   city    ct USING (city_id)
   LOOP
      IF rec.city LIKE '%hi%' THEN
          RETURN NEXT rec.city;               
      END IF;
   END LOOP;
END
$func$  LANGUAGE plpgsql STABLE;

Bortsett från:det finns inget i funktionen som skulle behöva volatilitet VOLATILE . Använd STABLE .

2. Uppsättningsbaserat tillvägagångssätt

Det är nästan alltid bättre att använda en uppsättningsbaserad metod om möjligt . Använd RETURN QUERY för att returnera som set från en fråga direkt.

CREATE OR REPLACE FUNCTION avoidable_states()
  RETURNS SETOF varchar AS
$func$
BEGIN   
   RETURN QUERY
   SELECT ct.city
   FROM   address ad
   JOIN   city    ct USING (city_id)
   WHERE  ct.city LIKE '%hi%';
END
$func$  LANGUAGE plpgsql STABLE;

3. SQL-funktion

För det enkla fallet (förmodligen en förenkling), kan du också använda en enkel SQL-funktion eller till och med bara frågan:

CREATE OR REPLACE FUNCTION avoidable_states()
  RETURNS SETOF varchar AS
$func$
   SELECT ct.city
   FROM   address ad
   JOIN   city    ct USING (city_id)
   WHERE  ct.city LIKE '%hi%';
$func$  LANGUAGE sql STABLE;


  1. Hur man distribuerar applikationer med SQL Server-databas på klienter

  2. android.database.sqlite.SQLiteException:nära s:syntaxfel (kod 1):,

  3. Hjälp till att förbättra SQL Server-statistiken!

  4. SQLite Union