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

논리적 코딩

📃 DATABASE/ORACLE

[PL/SQL] DBMS_SQL (1) : 처리순서

2018. 3. 26. 15:03

DBMS_SQL (1)

동적 SQL을 사용하는 또 다른 방법이다. NDS에 비해 많은 기능을 구현할 수 있지만, 사용법이 좀 복잡하다.


처리 순서

DBMS_SQL 패키지는 내부적으로 묵시적 커서를 이용해서 SQL문을 처리하는데, 총 8단계 과정도 커서를 처리하는 작업이라고 보면 된다.


1. 커서 열기 : OPEN_CURSOR

1
DBMS_SQL.OPEN_CURSOR (security_level IN INTEGER) RETURN INTEGER;
cs

- security_level : 보안옵션. 생략이 가능하며 0, 1, 2가 올 수 있고 디폴트는 0

- 반환값 : 커서 ID값


2. 파싱

문자열 형태의 동적 sql문장을 파싱하는 과정.

PARSE 프로시저를 호출해 SQL문장을 이전 단계에서 열었던 커서ID 값과 연결하고 구문 검사를 수행한다.   

1
2
3
4
5
6
7
8
9
DBMS_SQL.PARSE
(
    C                           IN INTEGER,
    STATEMENT                   IN VARCHAR2,
    LANGUAGE_FLAG               IN INTEGER,
    EDITION                     IN VARCHAR2 DEFAULT NULL,
    APPLY_CROSSEDITION_TRIGGER  IN VARCHAR2 DEFUALT NULL,
    FIRE_APPLY_TRIGGER          IN BOOLEAN DEFAULT TRUE
);
Colored by Color Scripter
cs

- C : 파싱할 문장에 대한 커서ID로 OPEN_CURSOR 함수 반환값을 받는다

- STATEMENT : 동적 SQL문

- LANGUAGE_FLAG : DBMS_SQL 패키지에서 설정한 상수인 NATIVE(실제값1). 무조건 DBMS_SQL.NATIVE를 명시한다.


3. 바인드 변수 연결

바인드 변수가 없다면 이 단계는 건너 뛴다.

BIND_VARIABLE 프로시저와 BIND_ARRAY 프로시저를 호출하는 방법이 있는데 전자를 주로 사용한다.

1
2
3
4
5
6
DBMS_SQL.BIND_VARIABLE
(
    C       IN INTEGER,
    NAME    IN VARCHAR2,
    VALUE   IN <DATATYPE>
);
cs

- C : 파싱할 문장에 대한 커서 ID로 OPEN_CURSOR 함수 반환값이 온다.

- NAME : 바인드 변수명

- VALUE : 바인드 변수의 실제 값


BIND_VARIABLE 프로시저는 EXECUTE IMMEDIATE 문에서 USING 다음에 기술하는 바인드 변수 역할을 하며, SQL문장에 기술한 바인드 변수 개수만큼 호출해야한다.        

1
2
3
4
5
6
7
8
DBMS_SQL.BIND_ARRAY
(
    C               IN INTEGER,
    NAME            IN VARCHAR2,
    <TABLE_VARIABLE>IN <DATATYPE>
    [INDEX1 IN INTEGER
     ,INDEX2 IN INTEGER]
);
cs

- C : 파싱할 문장에 대한 커서 ID로 OPEN_CURSOR 함수 반환값이 온다.

- NAME : 바인드 변수명

- TABLE_VARIABLE : DBMS_SQL 패키지 내에 선언된 컬렉션 타입인 연관 배열 변수를 명시한다.

- INDEX1 : 컬렉션 타입인 TABLE_VARIABLE에 대한 최소 인덱스값

- INDEX2 : 컬렉션 타입인 TABLE_VARIABLE에 대한 최대 인덱스값


4. 결과 선택 컬럼 정의

받아올 SELECT의 컬럼 값에 해당하는 컬럼을 미리 정의해야하며, DEFINE_COLUMN 프로시저를 이용한다.

4-1. 컬럼 타입이 문자형이 아닐때      

1
2
3
4
5
6
DBMS_SQL.DEFINE_COLUMN
(
    C           IN INTEGER,
    POSITION    IN INTEGER,
    COLUMN      IN <DATATYPE>
);
cs

4-2. 컬럼 타입이 문자형일때

1
2
3
4
5
6
7
DBMS_SQL.DEFINE_COLUMN
(
    C           IN INTEGER,
    POSITION    IN INTEGER,
    COLUMN      IN VARCHAR2 CHARACTER SET ANY_CS,
    COLUMN_SIZE IN INTEGER
);
Colored by Color Scripter
cs

- C : 파싱할 문장에 대한 커서 ID

- POSITION : SELECT 리스트의 컬럼 위치를 나타내는데 SELECT 키워드를 기준으로 왼쪽부터 1에서 시작.

- COLUMN : 컬럼 값을 받을 변수를 명시한다.

- COLUMN_SIZE : 문자형 컬럼이면 해당 컬럼의 문자열 길이를 명시한다.


5. 쿼리 실행      

1
2
3
4
5
DBMS_SQL.EXECUTE
(
    C   IN INTEGER
)
RETURN INTEGER;
cs

- C : 파싱할 문장에 대한 커서 ID

- 반환값 : SQL문을 실행한 결과 로우 수를 반환. SELECT 의 결과가 5행이라면 5 반환


6. 결과 패치       

1
2
3
4
5
DBMS_SQL.FETCH_ROWS
(
    C   IN INTEGER
)
RETURN INTEGER;
cs

- C : 파싱할 문장에 대한 커서 ID

- 반환값 : 전체 결과 로우 수가 아닌, 실제로 패치된 로우 수


7. 패치된 결과 값 받아오기

반드시 DEFINE_COLUMN을 호출했던 순서대롤 COLUMN_VALUE를 호출해야한다.     

1
2
3
4
5
6
7
8
DBMS_SQL.COLUMN_VALUE
(
    C           IN INTEGER,
    POSITION    IN INTEGER,
    VALUE       OUT <DATATYPE>
    [, COLUMN_ERROR OUT NUMBER]
    [, ACTUAL_LENGTH OUT NUMBER]
);
cs

- C : 파싱할 문장에 대한 커서 ID

- POSITION : SELECT 리스트의 컬럼 위치를 나타내는데 SELECT 키워드를 기준으로 왼쪽부터 1에서 시작.

- VALUE : 컬럼 값을 받을 변수를 명시한다.


8. 커서 닫기        

1
2
3
4
DBMS_SQL.CLOSE_CURSOR
(
    C   IN OUT INTEGER
);
cs

- C : 파싱할 문장에 대한 커서 ID



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

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

[PL/SQL] DBMS_SQL (3) : 응용활용  (0) 2018.03.27
[PL/SQL] DBMS_SQL (2) : 기본활용  (0) 2018.03.26
[PL/SQL] 다중 로우를 처리하는 동적 SQL문  (0) 2018.03.19
[PL/SQL] 동적 SQL  (0) 2018.03.01
[PL/SQL] 기타 패키지 특징  (0) 2018.02.22
    '📃 DATABASE/ORACLE' 카테고리의 다른 글
    • [PL/SQL] DBMS_SQL (3) : 응용활용
    • [PL/SQL] DBMS_SQL (2) : 기본활용
    • [PL/SQL] 다중 로우를 처리하는 동적 SQL문
    • [PL/SQL] 동적 SQL
    1HOON
    1HOON

    티스토리툴바