2. 가능한 한 적게 작성하라


/* 절차적 코드 */
BEGIN
    FOR x IN (SELECT * FROM table@remote_db)
    LOOP
        INSERT INTO table (c1, c2, ...) VALUES(x.c1, x.c2, ...);
    END LOOP;
END;



/* 한방 SQL */
INSERT INTO table (c1, c2, ...)
SELECT c1, c2, ... FROM table@remote_db;



BEGIN
    FOR i IN 1 .. 1000
    LOOP
        FOR x IN (SELECT t1.a t1a, t1.y t1y
                       , t2.b t2b, t2.a t2a, t2.y t2y
                       , t3.c t3c, t3.b t3b, t3.y t3y
                    FROM t1, t2, t3
                   WHERE t1.a = i
                     AND t2.a(+) = t1.a
                     AND t3.b(+) = t2.b )
        LOOP
            NULL;
        END LOOP;
    END LOOP;
END;
/



BEGIN
    FOR i IN 1 .. 1000
    LOOP
        FOR a IN (SELECT t1.a, t1.y
                    FROM t1 WHERE t1.a = i)
        LOOP
            FOR b IN (SELECT t2.b, t2.a, t2.y
                        FROM t2 WHERE t2.a = a.a)
            LOOP
                FOR c IN (SELECT t3.c, t3.b, t3.y
                            FROM t3 WHERE t3.b = b.b)
                LOOP
                    NULL;
                END LOOP;
            END LOOP;
        END LOOP;
    END LOOP;
END;
/


절차적으로 수행하지 않기.


INSERT INTO t (c1, c2, ...)
SELECT c1, c2, ...
  FROM t1, t2, t3, t4
 WHERE ..Join Condition..;
LOOP
    DELETE FROM t
     WHERE (c1, c2) IN (SELECT c1, MIN(c2)
                          FROM t
                         GROUP BY c1
                        HAVING COUNT(1) > 1);
    EXIT WHEN SQL%ROWCOUNT = 0;
END LOOP;
/

  • C1이 같다면 보다 오래된 C2값을 갖는 행을 삭제한다.
  • 특정 C1의 모든 행이 같은 C2값을 갖는다면 이들 행도 삭제한다.

INSERT INTO t (c1, c2, ...)
SELECT
  FROM (SELECT c1, c2, ...
             , MAX(c2)  OVER(PARTITION BY c1) max_c2
             , COUNT(*) OVER(PARTITION BY c1, c2) cnt
          FROM t1, t2, t3, t4
         WHERE ..Join Condition..)
 WHERE c2  = max_c2
   AND cnt = 1
;


화면에 코드를 맞춰라

  • 코드를 작성할때 루틴(메소드, 프로시져, 함수 등등)을 화면 크기에 맞춰 작성해야 한다.
  • 다시 말하면, 로직의 처음과 끝이 한 화면에 모두 보일 수 있어야 한다.
  • 이 규칙은 모듈 방식의 사고를 하게 만들며
  • 코드가 보다 쉽게 이해될 수 있는 크기로 쪼개진다.