SQLJ

SQLJ

SQLJJava와 SQL을 결합하기 위한 작업 제목입니다.이는 1997년경 IBM, Oracle, Compaq, Informix, Sybase, CloudscapeSun Microsystems의 엔지니어들이 공동으로 시작한 작업입니다.

그것은 세 부분으로 구성되어 있다: 0, 1, 그리고 2.Part 0에서는 Java 프로그램에 SQL 문을 삽입하는 방법에 대해 설명합니다.SQLJ part 0은 SQL:1999 표준, 일명 SQL Object Language Bindings(SQL/OLB)[1] 파트 10의 기초입니다.SQLJ 파트1과 2는 SQL 문의 Java 클래스(루틴 및 유형)를 사용할 수 있는 역순으로 설명합니다.파트 1과 파트 2는 Java 프로그래밍 언어(SQL/JRT)를 사용하는 SQL 표준 파트 13의 기초가 됩니다.

"SQLJ"는 일반적으로 JDBC와 같은 Java에 SQL을 내장하는 다른 수단과 대조되는 SQL J 파트 0을 지칭하는 데 사용됩니다.

ANSI 및 ISO 표준

  • SQLJ 파트 0: ANSI X3.135.10-1998, "데이터베이스 언어 SQL-파트 10: 객체 언어 바인딩(SQL/OLB)"
  • SQLJ Part 1: ANSI NCITS 331.1-1999, "SQLJ Part 1: Java 프로그래밍 언어를 사용한 SQL 루틴"
  • SQLJ 제2부: ANSI NCITS 331.2-2000, "SQLJ 제2부: Java 프로그래밍 언어를 사용한SQL 유형"

파트 0은 JDBC 2.0 호환성을 위해 갱신되어 2000년에 ISO에 의해 비준되었습니다.마지막 두 부분은 ISO에 제출될 때 결합되었습니다.파트 2는 ANSI 버전이 규격에 맞지 않고 사용자 매뉴얼 스타일에 가깝기 때문에 ISO 제출을 위해 실질적으로 다시 작성되었습니다.그 결합 버전은 [1]2002년에 비준되었다.

  • ISO/IEC 9075-10:2000, 정보기술 - 데이터베이스 언어 -SQL: 파트 10: 오브젝트 언어 바인딩(SQL/OLB)
  • ISO/IEC 9075-13:2002, 정보기술 - 데이터베이스 언어 -SQL: Part 13: Java Programming Language(SQL/JRT)를 사용한SQL 루틴과 유형

SQLJ 파트 0

SQLJ part 0 사양은 주로 Oracle에서 비롯되었으며, Oracle은 최초의 레퍼런스 [1]구현을 제공하기도 했습니다.

다음 SQLJ는 SQLJ 파트 0과 동의어입니다.

JDBC는 API를 제공하는 반면 SQLJ는 언어 확장자로 구성됩니다.따라서 SQLJ를 포함하는 프로그램을 컴파일하기 전에 프리프로세서(SQLJ 변환기)를 통해 실행해야 합니다.

이점

JDBC에 비해 SQLJ의 장점은 다음과 같습니다.

  • SQLJ 명령어는 동등한 JDBC 프로그램보다 짧은 경향이 있습니다.
  • SQL 구문은 컴파일 시 확인할 수 있습니다.반환된 쿼리 결과도 엄격하게 확인할 수 있습니다.
  • 쿼리 계획이 프로그램 컴파일 시간에 생성되어 데이터베이스에 저장되고 런타임에 재사용되기 때문에 프리프로세서가 동적 SQL보다 성능이 뛰어난 정적 SQL을 생성할 수 있습니다.정적 SQL을 사용하면 액세스 계획의 안정성을 보장할 수 있습니다.IBM DB2는 SQLJ 프로그램에서 정적 SQL 사용을 지원합니다.

단점들

  • SQLJ에는 전처리 단계가 필요합니다.
  • 많은 IDE는 SQLJ를 지원하지 않습니다.
  • SQLJ는 휴지 상태 의 일반적인 지속성 프레임워크 대부분에 대한 지원이 없습니다.
  • Oracle 18c(12.2)는 데이터베이스에서 SQLJ를 지원하지 않습니다.

다음 예제에서는 SQLJ 구문을 JDBC 사용법과 비교합니다.

다중 행 쿼리
JDBC SQLJ
준비 스테이트먼트 스탑 = 접속하다.준비문(    "성씨 선택"  + " , FIRST NME"  + " , 급여"  + DSN8710에서.EMP"  + 급여는 어느 정도입니까?); 스탑.set Big Decimal(1, ); 스탑.set Big Decimal(2, 맥스.); ResultSet rs = stmt.executeQuery(); 하는 동안에 (rs.다음 분.()) {    = rs.getString(1);   이름 = rs.getString(2);   급여 = rs.getBigDecimal(3);   //인쇄 연속... } rs.가까운.(); stmt.가까운.(); 
#sql 사적인 정적 반복기 직원Iterator(스트링, 스트링, BigDecimal); ... 직원Iterator 도관; #sql [ctx] 반복하다 = {   선택한다.         , 첫 번째        , 급여     부터 DSN8710.EMP    어디에 급여 사이에 : 그리고. :맥스. }; 하다 {   #sql {     가지고 오다 :반복하다      안으로 :, :이름, :급여   };   // 인쇄 배를 젓다... } 하는 동안에 (!반복하다.엔드페치()); 반복하다.가까운.(); 
단일 행 쿼리
JDBC SQLJ
준비 스테이트먼트 스탑 = 접속하다.준비문(     "SELECT MAX(샐러리), AVG(샐러리)"   + DSN8710에서.EMP"); rs = 스탑.executeQuery(); 한다면 (!rs.다음 분.()) {   // 오류: 행을 찾을 수 없습니다. } max Salary = rs.getBigDecimal(1); 평균적인 = rs.getBigDecimal(2); 한다면 (rs.다음 분.()) {   // 오류: 여러 행을 찾았습니다. } rs.가까운.(); 스탑.가까운.(); 
#sql [ctx] {   선택한다. 맥스.(급여), AVG(급여)     안으로 :max Salary, :평균적인     부터 DSN8710.EMP }; 
삽입
JDBC SQLJ
스탑 = 접속하다.준비문(    DSN8710에 삽입합니다.EMP " +    (EMPNO, FIRSTNME, MIDINIT, 성, 고용, 급여)  + "값(?, ?, ?, ?, ?, 현재 날짜, ?)"); 스탑.setString(1, empno); 스탑.setString(2, 이름); 스탑.setString(3, 미드니치); 스탑.setString(4, ); 스탑.set Big Decimal(5, 급여); 스탑.execute Update(업데이트 실행)(); 스탑.가까운.(); 
#sql [ctx] {   삽입 안으로 DSN8710.EMP     (EMPNO,  첫 번째,   미디넷,  ,  고용되었다,     급여)   가치     (:empno, :이름, :미드니치, :, 현재의 날짜., :급여) }; 

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b c Jim Melton (2003). Advanced SQL: 1999. Morgan Kaufmann. pp. 352-364. ISBN 978-1-55860-677-7.

추가 정보

외부 링크