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