1HOON
논리적 코딩
1HOON
전체 방문자
오늘
어제
  • HOME (186)
    • ☕️ JAVA (28)
      • WhiteShip Java LIVE Study (6)
      • Effective JAVA (10)
    • 🔮 KOTLIN (4)
    • 🌱 SPRING (51)
      • 스프링 인 액션 (22)
      • JPA (18)
    • ☕️ JAVASCRIPT (6)
    • 📃 DATABASE (40)
      • ORACLE (37)
      • MSSQL (2)
    • 🐧 LINUX (4)
    • 🐳 DOCKER (5)
    • 🐙 KUBERNETES (4)
    • 🏗️ ARCHITECTURE (8)
    • 📦 ETC (26)
      • TOY PROJECT (5)
      • RECRUIT (1)
      • 그냥 쓰고 싶어서요 (14)
    • 🤿 DEEP DIVE (1)
    • 🚽 Deprecated (9)
      • PYTHON (3)
      • AWS (2)
      • HTTP 완벽가이드 (3)
      • WEB (1)

블로그 메뉴

  • 홈
  • 방명록
  • 관리

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
1HOON

논리적 코딩

[PL/SQL] DBMS_SQL (2) : 기본활용
📃 DATABASE/ORACLE

[PL/SQL] DBMS_SQL (2) : 기본활용

2018. 3. 26. 15:14

DBMS_SQL (2)

기본 활용

1. SELECT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
DECLARE
    -- 출력 변수 선언
    VN_EMP_ID       EMPLOYEES.EMPLOYEE_ID%TYPE;
    VS_EMP_NAME     EMPLOYEES.EMP_NAME%TYPE;
    VS_JOB_ID       EMPLOYEES.JOB_ID%TYPE;
    
    VS_SQL          VARCHAR2(1000);
    
    -- 바인드 변수 선언과 값 설정
    VS_JOB          EMPLOYEES.JOB_ID%TYPE       := 'SA_REP';
    VN_SAL          EMPLOYEES.SALARY%TYPE       := 7000;
    VN_MANAGER      EMPLOYEES.MANAGER_ID%TYPE   := 148;
    
    -- DBMS_SQL 패키지 관련 변수
    -- 1. 커서를 연다
    VN_CUR_ID       NUMBER  := DBMS_SQL.OPEN_CURSOR();
    VN_RETURN       NUMBER;
BEGIN
    VS_SQL := 'SELECT   EMPLOYEE_ID, EMP_NAME, JOB_ID
               FROM     EMPLOYEES
               WHERE    JOB_ID = :A
               AND      SALARY < :B
               AND      MANAGER_ID = :C';
    
    -- 2. 파싱
    DBMS_SQL.PARSE(VN_CUR_ID, VS_SQL, DBMS_SQL.NATIVE);
    
    -- 3. 바인드변수 연결(WHERE 절에 사용한 변수가 3개이므로 각 변수별로 3번 호출)
    DBMS_SQL.BIND_VARIABLE(VN_CUR_ID, ':A', VS_JOB);
    DBMS_SQL.BIND_VARIABLE(VN_CUR_ID, ':B', VN_SAL);
    DBMS_SQL.BIND_VARIABLE(VN_CUR_ID, ':C', VN_MANAGER);
    
    -- 4. 결과 선택 컬럼 정의
    -- SELECT 순서에 따라 순번을 맞추고 결과를 담을 변수와 연결
    DBMS_SQL.DEFINE_COLUMN(VN_CUR_ID, 1, VN_EMP_ID);
    DBMS_SQL.DEFINE_COLUMN(VN_CUR_ID, 2, VS_EMP_NAME, 80);
    DBMS_SQL.DEFINE_COLUMN(VN_CUR_ID, 3, VS_JOB_ID, 10);
    
    -- 5. 쿼리 실행
    VN_RETURN := DBMS_SQL.EXECUTE(VN_CUR_ID);
    
    -- 6. 결과 패치
    LOOP
        IF DBMS_SQL.FETCH_ROWS(VN_CUR_ID) = 0 THEN
            EXIT;
        END IF;
        
        -- 7. 패치된 결과 값 받아오기
        DBMS_SQL.COLUMN_VALUE(VN_CUR_ID, 1, VN_EMP_ID);
        DBMS_SQL.COLUMN_VALUE(VN_CUR_ID, 2, VS_EMP_NAME);
        DBMS_SQL.COLUMN_VALUE(VN_CUR_ID, 3, VS_JOB_ID);
        
        -- 결과 출력
        DBMS_OUTPUT.PUT_LINE('EMP_ID   : ' || VN_EMP_ID);
        DBMS_OUTPUT.PUT_LINE('EMP_NAME : ' || VS_EMP_NAME);
        DBMS_OUTPUT.PUT_LINE('JOB_ID   : ' || VS_JOB_ID);
    END LOOP;
    
    -- 8. 커서 닫기
    DBMS_SQL.CLOSE_CURSOR(VN_CUR_ID);
END;
Colored by Color Scripter
cs



정말 길다... 복잡하다... 확실히 DBMS_SQL 보다는 NDS가 편한것이 느껴진다.


2. INSERT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
TRUNCATE TABLE CH13_PHYSICIST;
 
DECLARE
    VN_IDS      CH13_PHYSICIST.IDS%TYPE     := 1;
    VS_NAME     CH13_PHYSICIST.NAMES%TYPE    := 'Galileo Galilei';
    VD_DT       CH13_PHYSICIST.BIRTH_DT%TYPE:= TO_DATE('1564-02-15', 'YYYY-MM-DD');
    
    VS_SQL      VARCHAR2(1000);
    
    -- 1. 커서를 연다
    VN_CUR_ID   NUMBER := DBMS_SQL.OPEN_CURSOR();
    VN_RETURN   NUMBER;
BEGIN
    VS_SQL  := 'INSERT INTO CH13_PHYSICIST VALUES(:A, :B, :C)';
    
    -- 2. 파싱
    DBMS_SQL.PARSE(VN_CUR_ID, VS_SQL, DBMS_SQL.NATIVE);
    
    -- 3. 바인드 변수 연결
    -- 바인드 변수명을 직접 매개변수로 사용하므로 바인드 변수명을 반드시 맞춰주어야한다.
    DBMS_SQL.BIND_VARIABLE(VN_CUR_ID, ':A', VN_IDS);
    DBMS_SQL.BIND_VARIABLE(VN_CUR_ID, ':B', VS_NAME);
    DBMS_SQL.BIND_VARIABLE(VN_CUR_ID, ':C', VD_DT);
    
    -- 4. 쿼리실행
    VN_RETURN := DBMS_SQL.EXECUTE(VN_CUR_ID);
    
    -- 5. 커서 닫기
    DBMS_SQL.CLOSE_CURSOR(VN_CUR_ID);
    
    -- 결과 건수출력
    DBMS_OUTPUT.PUT_LINE('결과 건수 : ' || VN_RETURN);
    COMMIT;
END;
Colored by Color Scripter
cs



주석 내용과 같이 바인드 변수를 연결할 때, 바인드 변수명을 직접 매개변수로 이용하므로 바인드 변수명은 반드시 일치해야한다.


3. UPDATE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
INSERT INTO CH13_PHYSICIST VALUES (2, 'Isaac Newton', TO_DATE('1643-01-04', 'YYYY-MM-DD'));
INSERT INTO CH13_PHYSICIST VALUES (3, 'Max Plank', TO_DATE('1858-04-23', 'YYYY-MM-DD'));
INSERT INTO CH13_PHYSICIST VALUES (4, 'Albert Einstein', TO_DATE('1879-03-14', 'YYYY-MM-DD'));
 
DECLARE
    VN_IDS      CH13_PHYSICIST.IDS%TYPE     := 3;
    VS_NAME     CH13_PHYSICIST.NAMES%TYPE   := ' UPDATED';
    
    VS_SQL      VARCHAR2(1000);
    
    VN_CUR_ID   NUMBER  := DBMS_SQL.OPEN_CURSOR();
    VN_RETURN   NUMBER;
BEGIN
    VS_SQL := 'UPDATE CH13_PHYSICIST SET NAMES = NAMES || :A WHERE IDS < :B';
    
    DBMS_SQL.PARSE(VN_CUR_ID, VS_SQL, DBMS_SQL.NATIVE);
    
    DBMS_SQL.BIND_VARIABLE(VN_CUR_ID, ':A', VS_NAME);
    DBMS_SQL.BIND_VARIABLE(VN_CUR_ID, ':B', VN_IDS);
    
    VN_RETURN := DBMS_SQL.EXECUTE(VN_CUR_ID);
    
    DBMS_SQL.CLOSE_CURSOR(VN_CUR_ID);
    
    DBMS_OUTPUT.PUT_LINE('UPDATE 결과 건수 : ' || VN_RETURN);
END;
Colored by Color Scripter
cs




4. DELETE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DECLARE
    VN_IDS      CH13_PHYSICIST.IDS%TYPE := 3;
    
    VS_SQL      VARCHAR2(1000);
    
    VN_CUR_ID   NUMBER  := DBMS_SQL.OPEN_CURSOR();
    VN_RETURN   NUMBER;
BEGIN
    VS_SQL := 'DELETE CH13_PHYSICIST WHERE IDS < :B';
    
    DBMS_SQL.PARSE(VN_CUR_ID, VS_SQL, DBMS_SQL.NATIVE);
    
    DBMS_SQL.BIND_VARIABLE(VN_CUR_ID, ':B', VN_IDS);
    
    VN_RETURN := DBMS_SQL.EXECUTE(VN_CUR_ID);
    
    DBMS_SQL.CLOSE_CURSOR(VN_CUR_ID);
    
    DBMS_OUTPUT.PUT_LINE('DELETE 결과건수 : ' || VN_RETURN);
    COMMIT;
END;
Colored by Color Scripter
cs




반응형
저작자표시 비영리 변경금지 (새창열림)

'📃 DATABASE > ORACLE' 카테고리의 다른 글

[PL/SQL] 임시테이블(GTT)  (0) 2018.03.28
[PL/SQL] DBMS_SQL (3) : 응용활용  (0) 2018.03.27
[PL/SQL] DBMS_SQL (1) : 처리순서  (0) 2018.03.26
[PL/SQL] 다중 로우를 처리하는 동적 SQL문  (0) 2018.03.19
[PL/SQL] 동적 SQL  (0) 2018.03.01
    '📃 DATABASE/ORACLE' 카테고리의 다른 글
    • [PL/SQL] 임시테이블(GTT)
    • [PL/SQL] DBMS_SQL (3) : 응용활용
    • [PL/SQL] DBMS_SQL (1) : 처리순서
    • [PL/SQL] 다중 로우를 처리하는 동적 SQL문
    1HOON
    1HOON

    티스토리툴바