메뉴 건너뛰기

bysql.net

9._Static_vs._Dynamic_SQL

2012.05.07 21:52

남송휘 조회 수:5418


(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 을 구분하는 것은 잘못된 용어임




  • 오라클 고도화 원리와 해법 1 (bysql.net 2012년 1차 스터디)
  • 작성자:  남송휘
  • 최초작성일: 2012년 5월 26 일
  • 본문서는 bysql.net 스터디 결과입니다 .본 문서를 인용하실때는 출처를 밝혀주세요. http://www.bysql.net
  • 문서의 잘못된 점이나 질문사항은 본 문서에 댓글로 남겨주세요. ^^