9._Static_vs._Dynamic_SQL
2012.05.07 12:52
(1) Static Sql
- String 형 변수에 담지 않고 코드 사이에 직접 기술한 SQL문
- Embedded SQL
pro*c 구문으로 static sql 작성예
int main()
{
printf (“사번을 입력하십시오:”);
scanf(“%d”,&empno);
EXEC SQL WHENEVER NOT FOUND GOTO notfound;
EXEC SQL SELECT ENAME INTO :ename
FROM EMP
WHERE EMPNO= :empno;
printf (“사원명 : %s.\n”, ename);
notfound:
printf(“%d는 존재하지 않는 사번입니다. \n”, empno);
}
- PreCompile 언어
- pro*c, sqlj
- 소스 작성 -> PreCompiler 가 PreCompile -> 순수 c/c++코드
-> c/c++ compiler 컴퍼일 -> 실행파일 -> 실행 - Static SQL 은 런타임 시 절대 변하지 않음
- 구문분석, 유효 오브젝트 여부, 오브젝트 액세스 권한 등 체크가 가능
test.pc
EXEC SQL INCLUDE SQLCA.H;
int main()
{
EXEC SQL
UPDATE EMPs SET SAL = SAL * 1.1
WHERE EMPNO = 7900;
return 0;
}
- $proc test.pc sqlcheck=syntax -> Success
- $proc test.pc sqlcheck=full userid=scott/tiger ->Error
- sqlcheck=semantics 와 동일한 의미
- 구문 분석뿐 아니라 오브젝트가 유요한지, 액세스 권한 채크까지
- scott 에 EMPS 테이블이 없음
(2) Dynamic SQL
- String 형 변수에 담아서 기술하는 SQL문
- 조건에 따라 SQL문을 동적으로 바꿀수 있고, 런타임시 사용자로 부터 SQL 일부 또는 전체를 실행가능
- PreCompile시 Syntax, Semantics 체크 불가능
- Proc*C 에서 스칼라 스브쿼리,분석함수, ANSI 조인문등을 사용할때 PreCompile 과정에서 에러
- Semantic 채크는 DB접속을 통해 이루어지지만 Syntax 체크는 내장된 SQL파서를 이용
- PreCompiler가 인식못함
- Dynamic SQL을 사용
Pro*C Dynamic SQL 작성 사례
int main()
{
char select_stmt[50] =”SELECT ENAME FROM EMP WHERE EMPNO=:empno”;
// scanf (“%c”, &select_stmt); → SQL 문을 동적으로 입력 받을 수 있음
EXEC SQL PREPARE sql_stmt FROM :select_stmt;
EXEC SQL Declare emp_cursor CURSOR FOR sql_stmt;
EXEC SQL OPEN emp_cursor USING :empno;
EXEC SQL FETCH emp_cursor INTO :ename;
EXEC SQL CLOSE emp_cursor;
printf(“사원명 : %s.\n”, ename);
}
Proc*C 에서 제공하는 Dynamic Method 4가지
- Mothod 1
- 입력 Host 변수 없는 Non-Query
- ‘DELETE FROM EMP WHERE DEPTNO = 20’
- ‘GRANT SELECT ON EMP TO scott’
- Mothod 2
- 입력 Host 변수 개수가 고정적인 Non=Query
- ‘INSERT INTO EMP (ENAME, JOB) VALUES (:ename, :job)’
- ‘DELETE FROM EMP WHERE EMPNO = :empno’
- Mothod 3
- select-list 컬럼 개수와 입력 Host 변수 개수가 고정적인 Query
- ‘SELECT DEPTNO,MAX(SAL) FROM EMP GROUP BY DEPTNO’
- ‘SELECT DNAME,LOC FROM DEPT WHERE DEPTNO=20’
- ‘SELECT ENAME, EMPNO FROM EMP WHERE DEPTNO=:deptno’
- Mothod 4
- select-list 컬럼 개수와 입력 Host 변수 개수가 가변적인 Query
- ‘INSERT INTO EMP (<unknown>) VALUES (<unknown>)’
- ‘SELECT <unknown> FROM EMP WHERE DEPTNO=:deptno’
(3) 일반적인 프로그램 언어에서 SQL 작성법
- JAVA, DELPHI, VISUAL BASIC 등의 작성시에는 Static SQL 을 작성할 수 있는 방법이 없음
- Toad, Orange, SQL*Plus 와 같은 Ad-hoc 쿼리 툴에서 작성하는 SQL도 모두 Dynamic SQL
- Static (=Embedded) SQL 지원 개바툴
- PowerBuilder, PL/SQL, Pro*C,SQLJ
(4) 문제의 본질은 바인드 변수 사용 여부
- Static SQL 이던 Dynamic SQL이던 오라클 입장에서는 SQL 문 그 자체만 인식
- 애플리케이션 커서 캐싱 기능을 사용하지 않으면 Dynamic, Static 구분은 전혀 무관
- 라이브러리 캐시 효율을 논할때 바인드 변수 사용 여부에 초점
- 바인드 변수 사용 여부로 Static 와 Dynamic 을 구분하는 것은 잘못된 용어임
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
» | 9._Static_vs._Dynamic_SQL | 남송휘 | 2012.05.07 | 5588 |
45 |
2._User_Call_vs._Recursive_Call
![]() | 정찬호 | 2012.05.07 | 4596 |
44 |
1._Call_통계
![]() | 정찬호 | 2012.05.07 | 4488 |
43 |
5장._데이터베이스_Call_최소화_원리
![]() | 운영자 | 2012.05.07 | 5117 |
42 | 11._Static_SQL_구현을_위한_기법들 | dasini | 2012.05.06 | 3948 |
41 |
4._커서_공유
![]() | 남송휘 | 2012.04.26 | 16512 |
40 | 6._바인드_변수의_부작용과_해법 | 시와처 | 2012.04.22 | 4812 |
39 | 5._바인드_변수의_중요성 | 시와처 | 2012.04.22 | 4505 |
38 | 8._애플리케이션_커서_캐싱 | 박영창 | 2012.04.21 | 5438 |
37 | 7._세션_커서_캐싱 | 박영창 | 2012.04.21 | 8121 |
36 |
10._V$SQL
![]() | 정찬호 | 2012.04.09 | 6805 |
35 |
9._ASH(Active_Session_History)
![]() | 정찬호 | 2012.04.09 | 6288 |
34 | 4장._라이브러리_캐시_최적화_원리 | dasini | 2012.04.08 | 2938 |
33 |
12._데이터베이스_성능_고도화_정석_해법
![]() | 남송휘 | 2012.04.08 | 4744 |
32 | 11._End-To-End_성능관리 | 남송휘 | 2012.04.08 | 3240 |
31 | 3._라이브러리_캐시_구조 | dasini | 2012.04.05 | 5383 |
30 | 2._SQL_처리과정 | dasini | 2012.04.05 | 21945 |
29 | 1._SQL과_옵티마이저 | dasini | 2012.04.05 | 3824 |
28 | 5._V$SYSSTAT | AskZZang | 2012.04.03 | 4772 |
27 | 4._DBMS_XPLAN_패키지 | AskZZang | 2012.04.03 | 5773 |