티스토리 뷰

DBIO는 각 DBMS 벤더의 Embedded SQL에서 지원하는 모든 SQL을 지원한다.
오라클 DB를 사용중이라면 Pro*C precompiler 가 지원하는 모든 SQL 구문을 지원한다.

Dynamic SQL dbio 는 컴파일이 되는데 다른 dbio 타입으로 컴파일시 에러나는 경우를 알기 위해서는
두가지 SQL 형식의 차이점을 알아야 한다.

SQL 형식은 Embedded SQL과 Dynamic SQL으로 나뉜다.
  • Embdedded SQL - SQL 쿼리가 실행되는 시점에 지정된 변수 값을 제외하고는 SQL 구문의 변화가 없는 형식 (PERSIST, VIEW, EXEC)
  • Dynamic SQL - SQL 쿼리가 실행되는 시점에 쿼리 문장이 달라지는 SQL 형식 (DYNAMIC)


같은 SQL 구문이더라도 PERSIST, VIEW, EXEC 로 dbio 생성시 컴파일 오류가 나고 Dynamic으로 생성시 컴파일 되는 현상은 다음과 같은 차이점으로 인해 발생한다.

  1. Join, Sub-query, Analytic Function
  • Pro*C Embedded SQL 에서는 LEFT OUTER JOIN을 지원하지 않고 (+)를 이용한 Oracle SQL 문법으로 작성해야 한다.
  • Pro*C Embedded SQL 에서는 sclara sub-query를 지원하지 않는다(2017년 이후 최신 패치가 적용된 프로프레임의 경우 옵션을 통해 View 쿼리에서도 사용가능)
  • Pro*C Embedded SQL 에서는 merge와 같은 analytic function(분석함수)을 지원하지 않으므로 사용할 수 없다.
  • 위 사항들은 Dynmaic SQL 사용시 문제되지 않는다.


추가적인 DBIO의 제약사항은 다음과 같다.

  1. DDL, DCL
  • 어플리케이션에서 시스템의 안정성에 문제를 일으킬 수 있는 Create, Alter, Drop 등과 같은 DDL,
       Grant, Revoke 등의 DCL 명령은 지원하지 않는다. 
      Pro*C 가 모든 DML을 다 지원하는것은 아니기 때문에 일부 지원되지 않는 DML도 존재한다.

  1. Dynamic SQL 제약사항
  • DWIO를 지원하지 않기 때문에 DWIO 대상 테이블인 경우 select 혹은 fetch만 사용해야한다.
  • Input 및 Output 변수의 개수는 반드시 고정되어야 한다.
  • %s로 지정한 Dynamic 변수, 즉 run-time시에 결정되는 부분에는 host variable을 넣지 않는다.
  • Table 명이 가변적인 query 문은 call graph에 반영이 불가능하며, driving table을 설정할 수 없으므로 작성을 금지한다.
  • Dynamic Sql 문장에는 반드시 INSERT, UPDATE, SELECT, DELETE 문장으로 시작해야 한다.



또한 DBIO type 간 성능상의 차이도 있는데


Embedded SQL은 한번 사용되면 오라클 db 캐시에 저장되기 때문에 두번째 실행부터 Dynamic SQL에 비해 성능이 좋아진다. Dynamic SQL은 쿼리 실행 시점에 쿼리 문장이 달라지기 때문에 캐시에 저장할 수가 없다.


Embedded SQL 타입의 DBIO 중에서는 PERSIST 타입 dbio가 가장 성능이 좋다.






추가적으로,

오렌지나 토드같은 쿼리 분석기에서 SQL쿼리를 돌려보거나 프로프레임 스튜디오에서 dbio pre test 했을때는 이상없는 SQL 구문이 컴파일 시점에 에러가 나는 경우가 있는데

쿼리 분석기와 프로프레임 스튜디오는 JDBC 기반으로 SQL을 실행하기때문에 에러가 발생하지 않지만

dbio가 컴파일 될때는 Pro*C precompiler 로 컴파일 되기 때문에 Pro*C에서 지원하지 않는 문법의 SQL일 경우 컴파일 에러가 발생한다.

이경우 컴파일을 해보기전까지는 SQL 에러를 미리 알수가 없다.


댓글