Postgresql 에도 여러 제어문이 존재한다. IF, FOR 같은 구문이 존재한다.  (https://www.postgresql.org/docs/current/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING)
그런데 실제 동작시켜보면 에러가 발생한다. 보통 이 구문 예제에는 함수에서 등작하는 편이다. 그래서 이 것은 함수 밖에 동작하지 않는다고 생각하고 있었다. 그런데 do 라는 것과 같이 사용할 수 있다는 것을 알게 되었다.

참고: Postgresql DO 구문 ( https://www.postgresql.org/docs/current/sql-do.html)

 code block 에 대해 찾아보면 딱히 설명이 메뉴얼에 안 나와있는데, 이상하게 DO 구문 설명에서는 "anonymous code blocks" 이라는 단어가 나온다. 내 추측으로는 저 설명은 Structure of PL/pgSQL(https://www.postgresql.org/docs/current/plpgsql-structure.html)을 말하는 것 같다. 

[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
END [ label ];

이 형태는 일반적으로 function 을 정의할 때 사용되는데 DO 라는 구문과 조합할 수 있다. 

이 때 https://www.postgresql.org/docs/current/plpgsql-control-structures.html#PLPGSQL-CONDITIONALS 에기 나온 control 구문을 조합할 수 있다. 

여기에 더해서 Postgresql 에서는 마치 print 처럼 사용할 수 있는 구문이 있다. 

DO
$$ BEGIN
    raise notice 'Hello world';
END $$;

이 구문을 이용하면 'Hello world' 를 출력할 수 있다. psql 나 dbeaver 에서 이것을 출력할 수 있다. 

그래서 IF 문 다음과 같이 만들 수 있다.

DO
$$
DECLARE
  a INTEGER := 10;
  b INTEGER := 20;
  result INTEGER := 0;
BEGIN
  IF a > b THEN
    result := 1;
  ELSIF a < b THEN 
    result := -1;
  ELSE
    result := 0;
  END IF;  

  raise notice 'result : %', result;
END;
$$ LANGUAGE plpgsql;


그리고  아래 같은 For 문도 만들 수 있다.

DO
$$ 
DECLARE
  n INTEGER := 10;
  total INTEGER := 0;
BEGIN
  FOR i IN 1..n LOOP
    total := total + i;
  END LOOP;
  raise notice 'total : %', total;
END;
$$ LANGUAGE plpgsql;