Oracle/Oh Oracle

SP 내 SQL TEXT ( 대문자, 주석 무시, 힌트 보존 )

darkturtle26 2018. 11. 13. 17:07


테스트 목적 :
SP(Stored Procedure) 내 
1. SQL TEXT 가 대문자로 인식 확인
2. SP 내 주석 무시됨 확인
3. SP 내 주석 대신 HINT /*+ */ 확인


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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
 
<<1. SP 내 SQL TEXT 가 대문자로 인식 확인>>
-- 테스트 DB 에서 Shared Pool 비울것
ALTER SYSTEM FLUSH SHARED_POOL  
 
-- 테스트 환경 구성
CREATE TABLE SAMPLE_TEST ( A1 NUMBER, A2 VARCHAR2(100)) ;
INSERT INTO SAMPLE_TEST VALUES ( 1'A' );
COMMIT ;
 
-- 평션 생성 , 일부러 쿼리를 소문장로 생성
CREATE OR REPLACE FUNCTION TEST_FUNC
RETURN NUMBER
IS
V_NUM NUMBER ;
BEGIN
select count(*) AS T1_TEST into v_num from sample_test ;
RETURN V_NUM;
END ;
 
-- 평션 수행
select TEST_FUNC from dual ;
 
-- 평셩 수행 이력 확인
SELECT /*+ NO_MERGE */ SQL_ID, SQL_TEXT
          FROM V$SQLAREA
         WHERE ( INSTR(SQL_TEXT,'SAMPLE_TEST',1,1>= 1
                 AND INSTR(SQL_TEXT,'V$SQLAREA',1,1= 0
               )
           AND SQL_TEXT NOT LIKE 'EXPLAIN PLAN%'
           AND SQL_TEXT NOT LIKE 'SELECT SQL^_TEXT%' ESCAPE '^'
           AND SQL_TEXT NOT LIKE 'SELECT PLAN_TABLE%'
         ORDER BY SQL_TEXT DESC ;
 
<< 결과 >> 쿼리 문장이 대문자로 기재되어 있음  >>>  1. SQL TEXT 가 대문자로 인식 확인
4km37z1hf7qsd    SELECT COUNT(*) AS T1_TEST FROM SAMPLE_TEST
 
 
<<2. SP 내 주석 무시됨 확인>>
-- 테스트 DB 에서 Shared Pool 비울것
ALTER SYSTEM FLUSH SHARED_POOL  
 
-- 평션 수정, -- TEST002 << 주석을 넣음
CREATE OR REPLACE FUNCTION TEST_FUNC
RETURN NUMBER
IS
V_NUM NUMBER ;
BEGIN
select count(*-- TEST002
AS T2_TEST into v_num from sample_test ;
RETURN V_NUM;
END ;
 
-- 평션 수행
select TEST_FUNC from dual ;
 
-- 평셩 수행 이력 확인
SELECT /*+ NO_MERGE */ SQL_ID, SQL_TEXT
          FROM V$SQLAREA
         WHERE ( INSTR(SQL_TEXT,'SAMPLE_TEST',1,1>= 1
                 AND INSTR(SQL_TEXT,'V$SQLAREA',1,1= 0
               )
           AND SQL_TEXT NOT LIKE 'EXPLAIN PLAN%'
           AND SQL_TEXT NOT LIKE 'SELECT SQL^_TEXT%' ESCAPE '^'
           AND SQL_TEXT NOT LIKE 'SELECT PLAN_TABLE%'
         ORDER BY SQL_TEXT DESC ;
 
<< 결과 >> 주석은 포함되지 않았음  >>> SP 내 주석 무시됨 확인
dv8499am3rvuu    SELECT COUNT(*) AS T2_TEST FROM SAMPLE_TEST
 
 
<<3. SP 내 주석 대신 HINT /*+ */ 확인>>
-- 테스트 DB 에서 Shared Pool 비울것
ALTER SYSTEM FLUSH SHARED_POOL  
 
-- 평션 수정, /*+ TEST003 */ 힌트를 넣음
CREATE OR REPLACE FUNCTION TEST_FUNC
RETURN NUMBER
IS
V_NUM NUMBER ;
BEGIN
select /*+ TEST003 */ count(*)
AS T3_TEST into v_num from sample_test ;
RETURN V_NUM;
END ;
 
 
-- 평션 수행
select TEST_FUNC from dual ;
 
-- 평셩 수행 이력 확인
SELECT /*+ NO_MERGE */ SQL_ID, SQL_TEXT
          FROM V$SQLAREA
         WHERE ( INSTR(SQL_TEXT,'SAMPLE_TEST',1,1>= 1
                 AND INSTR(SQL_TEXT,'V$SQLAREA',1,1= 0
               )
           AND SQL_TEXT NOT LIKE 'EXPLAIN PLAN%'
           AND SQL_TEXT NOT LIKE 'SELECT SQL^_TEXT%' ESCAPE '^'
           AND SQL_TEXT NOT LIKE 'SELECT PLAN_TABLE%'
         ORDER BY SQL_TEXT DESC ;
 
<< 결과 >> 힌트 포함 확인   >>> 3. SP 내 주석 대신 HINT /*+ */ 확인
4y1wgbykbzjwj    SELECT /*+ TEST003 */ COUNT(*) AS T3_TEST FROM SAMPLE_TEST
cs