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;

 

 

 회사에서 Pipedrive 라는 프로그램을 사용하고 있다.  회사 자체적인 사내 시스템에 Pipedrive API를 연동해서 사용하고 있다. 그러다 버그가 있어 Pipedrive 에서 제공하는 chang log 를 확인해 보았다. 
 거기서 지난주 수요일 오전 12:10 이라고 되어 있는 부분에 문제가 발생했다. 그래서 회사 서버의 로그와 비교해 보았다. 그런데 이상하게도 회사 서버에서 Pipedrive API 를 사용한 로그가 없었다. 그러다 지난주 수요일이 지난 수요일을 잘못 표시한 거라는 것을 알게되었다( 이건 번역상의 실수로 보인다. ). 다행히 시간에 mouse 를 over 하니 날짜가 보였다.   그리고 좀 많이 오해를 살 만한 표현이다. 2025년 1월 17일(금요일)을 기준으로 지난 수요일은 1월 15일이고 지난주 수요일은 1월 8일 이어야 한다. 

   어째든 다시 지난 수요일로 로그를 확인해 보았다. 그런데도 회사 서버에서 로그를 찾을 수 없었다. 한참을 헛짓하다 오전 12:10 이라는 시간이 24시간 기준으로 00:10 이라는 것을 깨달았다. 사실 오전 12시라는 표현을 쓰지 않고 밤 12시라는 표현을 더 많이 사용하다보니 이런 일이 생겨버렸다. 

 그렇다. 그냥 2025-01-15 00:10 이랬으면 쉽게 날짜와 시간을 알았을 텐데, 지난주 수요일 오전 12:10  라는 표시 때문에 2번이나 고생했다. 날짜 시간이 중요한 요소인 곳에서는 제발 그냥 YYYY-MM-DD HH:mm:ss 를 사용하자. Change Log 정도는 날짜 시간이 꽤 중요한데, 그런 곳에서 까지 ~일 전, ~ 시간 전 이런 것을 좀 사용하지 말자. 

 오늘 javascript 을 사용하다가 dict을 for 문으로 돌리는데 key 가 number 가 아니라 계속 string type으로 유지되는 현상을 발견했다. 처음에는 내가 사용한 Object.entries 의 특성인지 알고 다른 방법들을 사용해 보았다. 그러다 검색을 통해 javascript 에서 dictionary 의 key는 자동으로 string 으로 형 변환 된다는 것을 알게 되었다. (참고 : https://stackoverflow.com/a/3633390/6652082

 내가 python 코드를 작성할 때, key 를 integer 를 사용하거나 파이썬은 아래 처럼 key를 tuple(리스트 같은 것이지만 변경이 불가능한 것)로 사용할 수도 있다. 

 a = {(1,2) : "test"}



그렇기에 당연히 javascript 에서도 사용 가능할 줄 알았다.  만약 정말 number 형 key 가 필요하다면 stackoverflow 에서 제시되었듯이 Map() 을 사용해야 한다.

const map1 = new Map();

map1.set(1,3)
map1.set('1','string')

 

javascript 에서 dictionary 가 key 만 사용된다는 것을 이제 알게 되다니, 아직 배워야 할 것들이 너무 많다.