PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Rekordy oparte na kursorach w PostgreSQL

1. Niejawny kursor

Prawie zawsze lepiej jest użyć niejawnego kursora FOR pętla niż uciekać się do nieco wolniejszego i nieporęcznego wyraźnego kursora. Napisałem tysiące funkcji plpgsql i tylko garść pełna jawnych kursorów miała sens.

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;

Poza tym:w funkcji nie ma nic, co wymagałoby zmienności VOLATILE . Użyj STABLE .

2. Podejście oparte na zbiorach

Prawie zawsze lepiej jest zastosować podejście oparte na zbiorach jeśli to możliwe . Użyj RETURN QUERY aby powrócić jako zestaw bezpośrednio z zapytania.

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

W prostym przypadku (prawdopodobnie uproszczenie) możesz również użyć prostej funkcji SQL lub nawet samego zapytania:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Łączenie wyników z dwóch oddzielnych baz danych

  2. kolejność kolumn w instrukcji SELECT * - gwarantowana?

  3. Gotcha do logicznej replikacji PostgreSQL

  4. postgres użytkownika uruchamia proces, który zużywa 100% wszystkich procesorów

  5. Postgres i indeksy dotyczące kluczy obcych i kluczy podstawowych