// declare host variables int id = 2; String first_name = null; String last_name = null; java.sql.Date dob = null; String phone = null; // perform SELECT to get the customer details for // the customer #2 from the customers table #sql { SELECT first_name, last_name, dob, phone INTO :first_name, :last_name, :dob, :phone FROM customers WHERE id = :id };위 예제에서는 다섯 개의 호스트 변수가 선언되었다. 여기서 선언된 다섯 개의 호스트 변수는 id, first_name, last_name, dob, phone이다. id는 int로 선언되어 id컬럼에 사용된 데이터베이스 NUMBER 타입과 대응되며, first_name, last_name, phone은 자바 String 타입으로 선언되었다. 자바 String 타입은 first_name, last_name, phone 컬럼에 사용된 VARCHAR2 타입에 대응된다. dob 변수는 java.sql.Date 타입으로 선언되었으며 java.sql.Date는 데이터베이스 DATE 타입과 대응된다.
SELECT first_name, last_name, dob, phone INTO :first_name, :last_name, :dob, :phoneINTO 절의 호스트 표현의 기본 설정은 OUT이며, 이것은 네 개의 호스트 변수의 값을 SQL문장에서 결정한다는 것을 의미한다.
WHERE id = :idWHERE 절에 사용된 호스트 변수의 기본설정은 IN이며, 이것은 id변수의 값을 SQL문이 참조할 것이라는 말이다.
Java Programming with Oracle SQLJ | ||
#sql { SELECT first_name, last_name, dob, phone INTO :OUT first_name, :OUT last_name, :OUT dob, :OUT phone FROM customers WHERE id = :IN id };first_name, last_name, dob, phone 호스트 변수 앞에 쓰인 OUT은 SELECT INTO문장이 변수 값을 저장할 것을 의미한다. 그리고 id 호스트 변수 앞에 쓰인 IN은 SELECT INTO문장이 id변수에 저장된 값을 읽어 사용할 것이라는 것을 나타낸다.
int number_of_products; #sql { SELECT COUNT(*) INTO :number_of_products FROM products };호스트 변수와 표현은 UPDATE, DELETE, INSERT SQL문에서도 사용할 수 있다. 앞으로는 이러한 SQL문에 대해 차근차근 살펴볼 것이다.
int new_quantity = 10; int cust_id = 2; int prod_id = 3; #sql { UPDATE purchases SET quantity = :new_quantity WHERE purchased_by = :cust_id AND product_id = :prod_id };위 예제에서는 purchases 테이블에서 product_id가 2인 행들의 quantity 컬럼의 값들을 업데이트한 것이다.
int cust_id = 2; #sql { DELETE FROM customers WHERE id = :cust_id };이 예제는 customers 테이블에서 id 컬럼 값이 2인 행들을 삭제하였다.
int id = 13; int type_id = 1; String name = "Life Story"; String description = "The Life and Times of Jason Price"; double price = 19.95; #sql { INSERT INTO products (id, type_id, name, description, price) VALUES (:id, :type_id, :name, :description, :price) };SELECT문은 INSERT문과 결합되어 사용되기도 한다. SELECT문이 조회한 행들은 INSERT문이 테이블에 저장할 수 있다. SQLJ 프로그램에서 INSERT문과 SELECT문이 함께 사용될 경우, 호스트 표현은 SELECT문의 컬럼 항목이나 WHERE절에 사용될 수 있다.
int id = 14; double new_price = 10.95; int prod_id = 4; #sql { INSERT INTO products SELECT :id, type_id, name, description, :new_price FROM products WHERE id = :prod_id };데이터베이스 널(NULL)값 처리
java.lang.Boolean java.lang.Byte java.lang.Short java.lang.Integer java.lang.Long java.lang.Float java.lang.Double래퍼 클래스는 논리 타입 뿐만 아니라 다양한 숫자 타입의 데이터베이스 널 값을 표현하는데 사용된다. 다음 예제는 java.lang.Double 래퍼 클래스를 사용하여 호스트 변수를 선언하고 있다.
java.lang.Double price_var;일단 래퍼 클래스 타입의 변수를 선언하면, 자바 기본 변수와 동일하게 사용할 수 있다. 다음 예제는 UPDATE문을 사용하여 products 테이블에서 id가 1인 행의 price 컬럼에 널을 저장하고, 다시 SELECT문을 사용하여 저장된 price 컬럼의 값을 조회하여 price_var에 저장하는 것을 보여준다.
// set the price to null #sql { UPDATE products SET price = NULL WHERE id = 1 }; // retrieve the null price into price_var #sql { SELECT price INTO :price_var FROM products WHERE id = 1 };자바 기본 변수인 double에 데이터베이스 널 값을 조회하여 저장하려고 하면, SQLJ문장이 실행될 때 SQL Exception이 발생할 것이다. SQL Exception이 발생하는 이유는 double 타입의 변수가 데이터베이스 널 값을 표현할 수 없기 때문이다.
double price_var2 = 0.0; if (price_var != null) { price_var2 = price_var.doubleValue(); }다른 래퍼 클래스도 유사한 메소드를 제공한다. Java.lang.Float는 floatValue() 메소드를, java.lang.Byte는 byteValue() 메소드를 제공한다.
try { ... } catch (SQLException e) { ... }try 절에는 java.sql.SQLException이 발생할 수 있는 SQLJ문장이 포함되어 있을 것이며, catch 절에는 java.sql.SQLException이 발생했을 때 수행되어야 하는 문장이 포함되어 있을 것이다. 아래 예제는 try절 안에서 DELETE문이 예외를 발생시킬 경우 단순히 이 메시지를 보여주는 catch절이다.
try { #sql { DELETE FROM customers }; } catch (SQLException exception) { System.out.println("SQLException " + exception); }더욱 세부적으로 데이터베이스의 널 값을 처리하는데 사용할 수 있는 java.sql.SQLException의 하위 클래스가 있다.
java.sql.SQLNullException이 예외는 자바 기본 변수(primitive)에 데이터베이스 널 값을 저장하려고 할 때 발생한다. java.sql.SQLException의 하위 클래스를 사용하고자 한다면 SQLException 핸들러 이전에 하위 클래스의 핸들러를 지정해야 한다. 만약 SQLException 핸들러가 먼저 지정되어 있으면, SQLException 핸들러가 SQLNullException를 처리하게 될 것이다. 이것은 SQLException 클래스가 상위클래스이고, 하위 클래스는 상위 클래스의 객체로 인식되어 있기 때문이다.
try { ... } catch (SQLNullException null_exception) { System.out.println("SQLNullException " + null_exception); } catch (SQLException exception) { System.out.println("SQLException " + exception); }하위클래스를 앞에 둠으로써 적용되어야 할 핸들러를 정확하게 찾을 수 있다. 처리할 수 있는 핸들러가 없는 경우에만 SQLException 핸들러가 담당하게 될 것이다.
이전 글 : 에필로그 - J2SE의 미래, 자바의 앞날
다음 글 : 삼바를 이용하여 윈도우측 프린터 사용하기
최신 콘텐츠