더북(TheBook)

③ INSERT문, UPDATE문, DELETE문, MERGE문 처리

SELECT문 뿐만 아니라 INSERT문, UPDATE문, DELETE문, MERGE문에 대해서도 동적 SQL을 사용할 수 있다. 먼저 다음과 같이 테이블을 생성해 보자.

입력

    CREATE TABLE ch13_physicist ( ids       NUMBER,
           names     VARCHAR2(50),
           birth_dt  DATE );

결과

    table CH13_PHYSICIST이(가) 생성되었습니다.

이제 ch13_physicist 테이블에 데이터를 넣는 INSERT문을 동적 쿼리로 만들어 보자. 바인드 변수 처리 방법을 배웠으니 앞으로는 모든 동적 SQL에서 바인드 변수를 사용할 것이다.

입력

    DECLARE
      vn_ids ch13_physicist.ids%TYPE := 10;
      vs_name ch13_physicist.names%TYPE := 'Albert Einstein';
      vd_dt ch13_physicist.birth_dt%TYPE := TO_DATE('1879-03-14', 'YYYY-MM-DD');

      vs_sql   VARCHAR2(1000);

    BEGIN
      -- INSERT문 작성
      vs_sql := 'INSERT INTO ch13_physicist VALUES (:a, :a, :a)';

      EXECUTE IMMEDIATE vs_sql USING vn_ids, vs_name, vd_dt;

      COMMIT;
    END;

테이블을 확인해 보면 데이터가 성공적으로 저장됐음을 알 수 있다. INSERT문에서도 동적 SQL의 처리 방법과 바인드 변수 사용법은 SELECT문과 동일하다. UPDATE문과 DELETE문 역시 같은 방식으로 처리된다.

입력

    DECLARE
      vn_ids ch13_physicist.ids%TYPE := 10;
      vs_name ch13_physicist.names%TYPE := 'Max Planck';
      vd_dt ch13_physicist.birth_dt%TYPE := TO_DATE('1858-04-23', 'YYYY-MM-DD');

      vs_sql VARCHAR2(1000);

      vn_cnt  NUMBER := 0;

    BEGIN
      -- UPDATE문
      vs_sql := 'UPDATE ch13_physicist
                    SET names = :a,
                        birth_dt = :a
                  WHERE ids = :a ';

      EXECUTE IMMEDIATE vs_sql USING vs_name, vd_dt, vn_ids;

      SELECT names
        INTO vs_name
        FROM ch13_physicist;

      DBMS_OUTPUT.PUT_LINE('UPDATE 후 이름: ' || vs_name);

      -- DELETE 문
      vs_sql := 'DELETE ch13_physicist
                  WHERE ids = :a ';

      EXECUTE IMMEDIATE vs_sql USING vn_ids;

      SELECT COUNT(*)
        INTO vn_cnt
        FROM ch13_physicist;

      DBMS_OUTPUT.PUT_LINE('vn_cnt : ' || vn_cnt);

      COMMIT;
    END;

결과

    UPDATE 후 이름: Max Planck
    vn_cnt : 0

UPDATE문이나 DELETE문도 사용법은 같다. 동적으로 구성하는 SQL문 구문과 바인드 변수 순서만 잘 맞춰주면 된다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.