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

Záznamy založené na kurzoru v PostgreSQL

1. Implicitní kurzor

Téměř vždy je lepší použít implicitní kurzor FOR smyčka než se uchýlit k poněkud pomalejšímu a nemotornému explicitnímu kurzoru. Napsal jsem tisíce funkcí plpgsql a jen ruka plná krát explicitních kurzorů dávala smysl.

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;

Stranou:ve funkci není nic, co by vyžadovalo volatilitu VOLATILE . Použijte STABLE .

2. Set-based přístup

Téměř vždy je lepší použít přístup založený na množinách pokud je to možné . Použijte RETURN QUERY vrátit jako nastavenou přímo z dotazu.

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. Funkce SQL

Pro jednoduchý případ (pravděpodobně zjednodušení) můžete také použít jednoduchou funkci SQL nebo dokonce pouze dotaz:

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. Funkce Escape pro regulární výraz nebo vzory LIKE

  2. Jak provedu hromadné vložení do mySQL pomocí node.js

  3. Získejte zřetelný součet spojeného sloupce tabulky

  4. ORA-01882:Oblast časového pásma nenalezena