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

PostgreSQL зацикля извън функциите. Това възможно ли е?

Вие не можете DECLARE (глобални) променливи (има има заобиколни решения ), нито цикъл с обикновен SQL - с изключение на рекурсивни CTE, предоставени от @bma (което всъщност е итериране над редове, без зацикляне, строго погледнато).

Въпреки това , има DO изявление за такъв ad hoc процедурен код. Въведено с Postgres 9.0. Работи като еднократна функция, но не приема никакви параметри и не връща нищо. Можете да RAISE забележки и др., така че вашият пример ще работи добре:

DO
$do$
DECLARE
   _counter int := 0;
BEGIN
   WHILE _counter < 10
   LOOP
      _counter := _counter + 1;
      RAISE NOTICE 'The counter is %', _counter;  -- coerced to text automatically
   END LOOP;
END
$do$

Ако не е указано друго, езикът в тялото по подразбиране е plpgsql . Можете да използвате всеки регистриран процедурен език въпреки това, ако го декларирате (като:LANGUAGE plpython ).

Postgres също предлага generate_series() за генериране на набори ad hoc, което може да премахне необходимостта от зацикляне в много случаи. Опитайте да търсите тук в SO за примери.

Освен това можете да използвате WHERE клауза в CTE, модифицираща данни в обикновен SQL за разклоняване на случаи и емулиране на IF .. THEN .. ELSE .. END ...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да разбера кой дял ще се използва при разделяне на хеш на Postgres?

  2. Spring JDBC - Последно въведен идентификатор

  3. Как да създадете потребител с PSQL

  4. Позовавайки се на променливи на сесията (\set var='value') от PL/PGSQL

  5. Избройте безвъзмездни средства и привилегии за материализиран изглед в PostgreSQL