SQLJ를 사용하면 Java™ 프로그램에 SQL 문을 임베드할 수 있습니다. SQLJ는 IBM® Corporation, Microsoft® Corporation, Sun Microsystems, 및 Oracle을 포함한 데이터베이스 및 응용프로그램 서버 제공자 컨소시엄에 의해 개발된 ANSI 표준입니다.
SQLJ 변환기는 SQLJ 소스 파일을 표준 Java 소스 파일로 변환하고 여기에 SQLJ 소스의 정적 SQL에 대한 정보를 캡슐화한 SQLJ 직렬화 프로파일을 덧붙입니다. 변환기는 임베디드 SQL 문을 SQLJ 런타임 라이브러리의 호출로 바꾸어 SQLJ 절을 표준 Java 명령문으로 변환합니다. SQLJ 사용자 정의 스크립트는 SQLJ 프로파일을 데이터베이스에 바인드하고 하나 이상의 데이터베이스 패키지를 생성합니다. Java 파일은 데이터베이스에서 (패키지와 함께) 컴파일되고 실행됩니다. SQLJ 런타임 환경은 순수 Java로 구현되는 SQLJ 런타임 라이브러리로 구성됩니다. SQLJ 런타임 라이브러리는 대상 데이터베이스(예: DB2 Universal Database™)의 JDBC 드라이버를 호출합니다.
Workbench에서 SQLJ를 사용하여 SQLJ를 지원하는 데이터베이스(예: DB2 Universal Database 또는 Oracle)를 실행할 응용프로그램을 작성할 수 있습니다. 내장된 사용자 정의 기능은 DB2 Universal Database™에 대해서만 작업합니다.
Workbench는 다음 SQLJ 기능을 포함합니다.
SQLJ 및 JDBC는 Java 응용프로그램에 관계형 데이터베이스 액세스 기능을 제공하지만 데이터베이스 간에 몇 가지 차이점이 있습니다.
일반적으로 동적 SQL은 SQL 문을 미리 작성할 필요가 없기 때문에 정적 SQL보다 더 유동적입니다. 데이터베이스는 런타임 전에 SQL 문을 실행하는 데 필요한 작업을 대부분 완료하므로 정적 SQL이 보다 더 효율적입니다.
예를 들어 런타임까지 열 갯수 및 유형을 알지 못한 경우, 동적 SQL은 테이블을 조회하고 갱신하는 기능을 제공합니다. JDBC의 동적 SQL을 사용하는 Java 프로그램은 런타임 시 SQL 문을 작성할 수 있습니다.
동적 SQL을 사용한 데이터베이스 액세스 및 권한 부여는 런타임 시 판별됩니다. 응용프로그램 사용자는 필수 데이터베이스 특권을 모두 가지고 있어야 하고, 데이터베이스는 필수 데이터에 액세스하는 최적의 방법을 런타임 시 판별해야 합니다. 한편, 정적 SQL을 사용한 액세스 및 권한 부여는 사용자 정의 및 바인드 시간에 판별됩니다. 바인드 프로세스를 수행하는 사용자의 특권은 응용프로그램이 수행할 수 있는 작업을 판별합니다. 데이터베이스는 사용자 정의 및 바인드 시간 중에 데이터에 액세스하기 위한 최적의 방법을 판별하여 런타임 기능을 개선합니다.
많은 응용프로그램은 데이터베이스 메타데이터(예: 테이블 및 열 이름)가 런타임 시 변경되지 않기 때문에 SQL 문을 동적으로 작성할 필요가 없습니다. 해당 응용프로그램은 동적 SQL보다 더 적합한 성능을 제공하는 정적 SQL을 사용할 수 있습니다.
정적 SQL 사용을 통한 성능 개선 외에도 SQLJ는 다음과 같은 점에서 JDBC보다 유리합니다.
JDBC의 한 가지 장점은 SQLJ가 수행할 수 없는 동적 SQL 문 실행 작업을 수행할 수 있다는 것입니다. 그러나 응용프로그램이 동적 SQL을 사용해야 할 경우, 프로그램의 SQLJ 절에 특정 JDBC 코드를 포함시킬 수 있습니다.
SQLJ 절은 Java 코드에 임베드됩니다. 각 절 앞에 #sql 기호가 붙습니다. 다음 SQLJ 절은 WHERE 절에 Java 변수가 있는 SELECT 문의 예제입니다.
#sql [ctx] cursor1 = {SELECT EMP_ACT.EMPNO FROM EMP_ACT WHERE EMP_ACT.PROJNO = :strProjNo};
DB2® SQLJ 지원은 SQLJ ANSI 표준을 기반으로 합니다. SQLJ 프로그램에 표시될 수 있는 SQL 구성 유형은 다음과 같습니다.