PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Записи, базирани на курсора в PostgreSQL

1. Неявен курсор

Почти винаги е по-добре да използвате неявния курсор на FOR контура отколкото да прибягвате до малко по-бавен и тромав изричен курсор. Написал съм хиляди plpgsql функции и само една ръка, пълна с пъти, че явните курсори са имали някакъв смисъл.

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;

Настрана:във функцията няма нищо, което да се нуждае от волатилност VOLATILE . Използвайте STABLE .

2. Подход, базиран на набор

Почти винаги е по-добре да използвате подход, базиран на набори, ако е възможно . Използвайте RETURN QUERY за да върнете както е зададено от заявка директно.

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 функция

За простия случай (вероятно опростяване) можете също да използвате проста SQL функция или дори само заявката:

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. PostgreSQL външен ключ не съществува, проблем с наследяването?

  2. Postgres сървърът не отговаря на заявка за nodejs

  3. Възстановяване на архивен файл на postgres с помощта на командния ред?

  4. PostgreSQL 9.3:Динамична въртяща се таблица

  5. Postgres грешка при вмъкване - ГРЕШКА:невалидна последователност от байтове за кодиране UTF8:0x00