'3. Implementation/DATABASE'에 해당되는 글 23건
- 2009.06.23 SQL Server 2000 Administration 과정 : Note #1
- 2009.06.23 데이터베이스 생성시 데이터 파일과 로그파일의 물리적 분리
- 2009.05.07 SQL Server Express 에서 원격 연결 허용
- 2008.07.28 JDBC Oracle JDBC 드라이버에 연결
- 2008.07.27 MySQL/JDBC Function과 PROCEDURE 생성 및 호출 1
- 2008.07.27 JDBC 와 MySQL 연동하기
- 2008.07.26 JDBC LOB 데이터 타입 (CLOB & BLOB)
- 2008.07.26 JDBC ResultSetMetaData 인터페이스 실습
- 2008.07.26 JDBC DatabaseMetaData 사용 예제
- 2008.07.26 JDBC CallableStatment 예제
- 2008.07.26 JDBC PreparedStatement를 이용한 데이터 조회 예제
- 2008.07.24 JDBC DataSource 인터페이스
- 2008.07.24 JDBC 트랜잭션 처리
- 2008.07.24 JDBC ResultSet의 인터페이스 실습 1
- 2008.07.24 JDBC Statement 인터페이스
- 2008.07.24 JDBC Connection 생성
- 2008.07.21 JDBC 드라이버의 한글 처리
- 2008.07.21 JDBC 드라이버의 Type에 따른 분류
- 2008.07.18 [ADO 2.8] HelloData Code
- 2008.06.28 Connector/ODBC Reference
SQL Server 2000 Administration 과정 : Note #1
SDS e-Campus SQL Server 2000 Administration 과정에서 중요한 부분만 노트한 것임
파일 속성에 "파일자동증가"가 선택되어져 있는가?
처음 크기가 가득차면 파일증가 속성에서 정의한 대로 데이터 파일이 증가할 것이다. 최대 파일크기를 확인한다. 기본값이 파일 무제한 증가로 되어 있음을 확인하고 파일 증가 제한을 5M로 설정한다.
데이터 파일의 최대 크기를 반드시 정한다. 그렇지 않으면 이 파일은 하드디스크를 모두 차지할 수도 있다.
그리고 충분한 크기만큼 늘어나게 한다. 그래서 데이터 파일이 조각나지 않게 하고 SQL Server 가 이런 일로 관리부하가 걸리지 않게 할 수 있다.
데이터베이스 옵션 설정하기
ANSI_PADDING
이 옵션이 ON으로 설정되면 varchar 열에 삽입된 문자 값의 후행 공백과 varbinary 열에 삽입된 이진 값의 후행 0이 잘리지 않는다.
* 중요 : ANSI_PADDING 을 항상 ON으로 설정하도록 권장. 계산된 열 또는 인덱스 된 뷰에서 인덱스를 만들거나 변경할 때 SET ANSI_PADDING 은 ON 이어야 한다.
데이터 파일 퍼뜨리기
가능한 한 많은 물리적 드라이브에 걸쳐 많은 데이터를 퍼뜨리면 여러 파일을 사용한 병렬 처리로 처리량이 증가한다. 일반적으로 물리적 디스크마다 파일 하나를 만들고 파일을 파일 그룹으로 묶으면 속도 향상을 꾀할 수 있다.
윈도우 인증
windows 보안을 그대로 상속받아 사용가능하기 때문에 더 나은 보아을 구축할 수 있고, 그룹을 하나의 계정처럼 사용 가능
SQL Server 인증
SQL 서버가 자체적으로 인증하는 방식. 비 윈도우 클라이언트나 인터넷 사용자들도 SQL 서버로 부터 직접 인증 받아 접속할 수 있다.
기본 로그인 계정
SQL 서버에는 두 개의 기본 로그인 계정이 있다.
BUILTIN\Administrators 와 sa.
BULTIN\Administrators 는 Windows 2000 관리자로 기본 로그인 계정으로 제공된다. 이 계정에는 SQL 서버와 모든 데이터베이스에 대한 모든 권한이 있다.
시스템관리자(sa)는 SQL Server 와 모든 데이터베이스에 대한 모든 권한이 있는 특별 로그인 계정이다.
이전 버전과의 호환성을 위해 제공되며 일반적으로 이 계정을 사용해서는 안된다. SQL 서버가 혼합 모드 인증을 사용하고 있을 때만 이 계정을 사용할 수 있다.
유저 만들기
특정 데이터베이스에 접속 하려면 유저로써의 등록이 필요하고 SQL 서버 로그인 계정을 특정 데이터베이스의 유저로 만들기 위해서는 각 데이터베이스마다 관리하는 sysusers 테이블에 등록시켜야 한다.
서버 역할
sysadmin : SQL 서버에서 모든 작업을 수행할 수 있다.
serveradmin : 서버 차원의 구성옵션을 설정하고 해당 서버를 종료할 수 있다.
setupadmin : 연결된 서버를 관리하고 프로시저를 시작할 수 있다.
securityadmin : 로그인 및 CREATE DATABASE 사용권한을 관리하고, 오류 로그를 읽고 암호를 변경할 수 있다.
processadmin : SQL 서버에서 실행중인 프로세스를 관리할 수 있다.
dbcreator : 데이터베이스를 만들고, 변경하고, 삭제할 수 있다.
diskadmin : 디스크 파일을 관리할 수 있다.
bulkadmin : BULK INSERT 문을 실행할 수 있다.
데이터베이스 역할
db_owner : 데이터베이스에서 모든 사용 권한을 갖는다.
db_accessadmin : 사용자 ID를 추가하거나 제거할 수 있다.
db_securityadmin : 모든 사용 권한, 개체 소유권, 역할 및 역할 구성원을 관리할 수 있다.
db_ddladmin : ALL DDL은 실행할 수 있지만 GRANT, REVOKE 또는 DENY 문을 실행할 수 없다.
db_backupoperator : DBCC, CHECKPOINT 및 BACKUP 문을 실행할 수 있다.
db_datareader : 데이터베이스의 모든 사용자 테이블에서 모든 데이터를 볼 수 있다.
db_datawriter : 데이터베이스의 모든 사용자 테이블에서 데이터를 수정할 수 있다.
db_denydatareader : 데이터베이스의 모든 사용자 테이블에서 데이터를 볼 수 없다.
db_denydatawriter : 데이터베이스의 모든 사용자 테이블에서 데이터를 수정할 수 없다.
뷰와 프로시저를 이용한 보안
1. 뷰를 이용한 보안
쿼리 분석기
create table 사원 (사번int, 이름varchar(8), 전화번호char(12), 연봉money, 나이int) insert 사원values(1, '김사원', '700-5425', 5000000, 29) go create view 전화번호조회 as select 사번, 이름, 전화번호from 사원 |
권한 관리
grant select on 전화번호조회to 일반사용자 |
2. 프로시저를 이용한 보안
쿼리 분석기
create proc 전화번호변경 ( @사번int, @전화번호char(12) ) as update 사원 set 전화번호=@전화번호 where 사번=@사번 |
권한 부여
grant exec on 전화번호변경to 일반사용자 |
데이터베이스 생성시 데이터 파일과 로그파일의 물리적 분리
로그의 중요성
* 로그가 가득차면 데이터베이스의 변경은 일어나지 않는다.
* 로그관리는 DBA의 당연한 몫이다.
* DBCC SQLPERF(LOGSPACE)는 로그를 모니터링 할 수 있다.
* 데이터베이스는 데이터 파일과 로그 파일로 구성되고 로그 파일의 크기 설정은 데이터베이스 환경에 따라 차이가 있다.
* 일반적으로 OLTP 환경에서는 데이터파일의 20% 정도로 설정하고 OLAP 환경에서는 10% 정도로 설정한다.
SQL Server Express 에서 원격 연결 허용
SQL Server Browser => 미실행중이면 시작모드 변경후 시작함.
SQL Server Browser : UDP, 1434
=> 방화벽을 통해 명명된 파이프에 액세스 할 수 있도록 하려면 방화벽을 통한 파일 및 프린터 공유도 설정해야 함.
원격 컴퓨터의 인터넷 연결 방화벽이 원격 디버깅을 허용화도록 설정되어 있지 않다. 기본 전송을 사용하여 원격으로 관리 코드나 네이티브 코드를 디버깅하려면 DCOM 트래픽을 위해 TCP 포트 135가 열려 있어야 하고 파일 및 프린터 공유가 활성화되어 있어야 하며 예외 목록에 msvsmon.exe 가 추가되어 있어야 한다. 일부 IPSEC 포트를 열어야 할 수 도 있다(?).
* ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.SQL.v2005.ko/udb9/html/0093b43c-c6b5-4574-9b30-3a0e91e1a1f9.htm
* http://msdn.microsoft.com/ko-kr/library/1cd9d8fk.aspx
JDBC Oracle JDBC 드라이버에 연결
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class CreateTable {
public static void main(String args[]) throws Exception {
// JDBC 드라이버를 로드한다.
Class.forName("oracle.jdbc.driver.OracleDriver");
// 데이터베이스에 접속한다. 적절한 JDBC URL 설정한다.
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@70.12.220.140:1521:ORA9", "jsp06", "jsp06");
Statement stmt = conn.createStatement();
if(args.length == 1 && args[0].equals("create")) {
stmt.executeUpdate("CREATE TABLE product" +
"(id char(5), classid char(2), name varchar(50), balance int, price float)");
System.out.println("테이블이 생성되었습니다.");
} else {
stmt.executeUpdate("DROP TABLE product");
System.out.println("테이블이 삭제되었습니다.");
}
stmt.close();
conn.close();
}
}
MySQL/JDBC Function과 PROCEDURE 생성 및 호출
CREATE FUNCTION increment_bonus3
(name VARCHAR(20), id INT) RETURNS DOUBLE
BEGIN
DECLARE bonus DOUBLE;
SELECT emp_bonus INTO bonus FROM emp where emp_id = id and emp_name=name;
SET bonus = bonus * 0.05;
return (bonus);
END; //
delimiter ;
2. Function 호출 JDBC 예제
String query = "{? = call increment_bonus3(?, ?)}";
ctmt = con.prepareCall(query);
ctmt.setString(2, "이자바");
ctmt.setInt(3, 9);
ctmt.registerOutParameter(1,Types.DOUBLE);
ctmt.execute();
double bonus = ctmt.getDouble(1);
System.out.print
("id가 9번이고 name이 이자바인 사람의 bonus는 ");
System.out.println
(bonus + " 로 변경되었습니다 ");
ctmt.close();
}
3. MySQL에서 Procedure 생성
ALTER PROCEDURE increment_bonus
(IN name VARCHAR(20), IN id INT, OUT bonus DOUBLE)
begin
SELECT emp_bonus INTO bonus FROM emp where emp_id = id and emp_name=name;
SET bonus = bonus * 0.05;
end; //
delimiter ;
4. Procdure 호출 JDBC 예제
String query = "{call increment_bonus(?, ?, ?)}";
ctmt = con.prepareCall(query);
ctmt.setString(2, "이자바");
ctmt.setInt(1, 9);
ctmt.registerOutParameter(3,Types.DOUBLE);
ctmt.execute();
double bonus = ctmt.getDouble(3);
System.out.print
("id가 9번이고 name이 이자바인 사람의 bonus는 ");
System.out.println
(bonus + " 로 변경되었습니다 ");
ctmt.close();
}
JDBC 와 MySQL 연동하기
1. MySQL용 JDBC Driver 다운로드 (http://java.sun.com)
2. mysql-connector-java-<ver>-bin.jar 파일을 %JAVA%\jre\lib\ext에다가 복사한다.
(CLASSPATHH에 해당 jar 파일이 있는 경로를 추가해 된다.)
3. 아래 코드로 연결 시도
class TelBook
{
public static void main(String args[])
{
Connection con = null;
try{
Class.forName("com.mysql.jdbc.Driver");
("jdbc:mysql://localhost/test?" + "user=root&password=****");
System.out.println("데이터베이스 연결 성공했습니다.");
con.close();
}catch(ClassNotFoundException e){
System.out.println("JDBC Drvier load fail!!!");
}catch(SQLException e){
System.out.println("Connection fail!!!");
e.printStackTrace();
}
finally{
try{
if(con != null) con.close();
}catch(SQLException e){}
}
};
};
JDBC LOB 데이터 타입 (CLOB & BLOB)
1. LOB 데이터 타입
Large Object 데이터 타입으로 대용량의 데이터를 객체형으로 저장할 수 있는 데이터 타입.
LOB 데이터 타입의 구조는 다음과 같다.
실제 데이터에 대한 위치 정보를 제공하므로, 위치 정보만 파악하고 있다가 필요한 시점에서 데이터를 전송하는 스트리밍이 가능
2. CLOB와 BLOB 데이터 타입
l CLOB 데이터 타입
n Character Large Object
n Char나 VARCHAR 또는 LONG 데이터 타입처럼 문자형 데이터를 저장하는 LOB 데이터
l BLOB 데이터 타입
n Binary Large Object
n BINARY(RAW) 또는 LONGVARBINARY(LONG RAW)데이터 타입처럼 이진형 데이터를 저장하는 LOB 데이터
3. CLOB 데이터를 삽입할 때에는 다음을 주의해야 한다.
Clob 인터페이스에는 Clob 데이터를 직접적으로 저장할 수 있는 방법을 제공하지 않는다.
CLOB 형의 객체를 생성하여 데이터베이스에 추가하는 기능은 근본적으로 제공하지 않는다. 따라서 사용자가 CLOB 객체를 생성할 수 없다. 이 문제는 데이터베이스와 JDBC 드라이버마다 서로 다른 해결책을 제시해야 한다.
4. Oracle DB에서 CLOB 데이터 추가
l empty_clob() 을 이용하여 빈 CLOB 데이터 삽입
l 실제 데이터는 비어있는 CLOB 데이터를 SELECT 문장으로 읽어와서 CLOB 데이터의 위치 정보 확인
l 해당 위치에 실제 데이터를 삽입
참고로 아 때 SELECT 되는 CLOB 데이터는 반드시 하나의 CLOB 데이터만을 조회해야 한다.
5. Java.sql.Clob 인터페이스 실습
l 명령행 매개변수로 입력된 문자열 정보를 oracle 데이터베이스 내의 CLOB 데이터 타입을 가진 컬럼으로 전송하여 삽입하고 다시 oracle 데이터베이스로부터 저장된 CLOB 데이터를 조회하는 예제
l CLOB 데이터 타입을 가진 컬럼이 존재하는 테이블이 필요하다. 따라서 다음과 같이 CLOB 데이터 타입을 가진 컬럼이 존재하는 테이블을 먼저 생성한다.
CREATE TABLE CLOBTEST ( Seq VARCHAR2(100) NOT NULL Clobdata CLOB); |
l 삽입할 데이터는 다음과 같은 형태로 명령행 매개변수로 입력받도록 한다.
seq |
Clobdata |
Clob01 |
첫번째 clob 데이터를 삽입 |
ClobInsert.java
01 import java.sql.*; 02 import java.io.Writer; 03 04 public class ClobInsert{ 05 public static void main(String args[]){ 06 Connection con = null; 07 PreparedStatement ps = null; 08 ResultSet rs = null; 09 String seq = null; 10 String clobData = null; 11 try { 12 if(args[0] != null && args[1] != null){ 13 seq = args[0]; 14 clobData = args[1]; 15 } 16 }catch(Exception e){ 17 System.out.println 18 ("CLOBTEST 테이블에 삽입할 두개의 값을 입력하세요"); 19 return; 20 } 21 try { 22 String query1 = 23 "INSERT INTO CLOBTEST(seq, clobdata) " 24 + " VALUES (?,EMPTY_CLOB()) "; 25 String query2 = 26 " SELECT clobdata " 27 + " FROM CLOBTEST " 28 + " WHERE seq = ? FOR UPDATE "; 29 Class.forName("oracle.jdbc.driver.OracleDriver"); 30 con=DriverManager.getConnection 31 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9", 32 "jdbc00","jdbc00"); 33 con.setAutoCommit(false); 34 ps = con.prepareStatement(query1); 35 ps.setString(1,seq); 36 ps.executeUpdate(); 37 ps = con.prepareStatement(query2); 38 ps.setString(1,seq); 39 rs = ps.executeQuery(); 40 if(rs.next()){ 41 Clob tmpClob = rs.getClob(1); 42 if (tmpClob != null){ 43 oracle.sql.CLOB oraClob = 44 (oracle.sql.CLOB)tmpClob; 45 Writer writer = 46 oraClob.getCharacterOutputStream(); 47 char[] bss = clobData.toCharArray(); 48 writer.write(bss); 49 writer.flush(); 50 writer.close(); 51 } 52 } 53 con.commit(); 54 System.out.println 55 ("입력하신 내용을 clobtest 테이블에 " 56 + "저장하였습니다."); 57 System.out.println 58 ("데이터베이스에 저장한 내용을 조회하는 " 59 + "예제도 만들어보세요."); 60 rs.close(); 61 ps.close(); 62 con.close(); 63 }catch(Exception e){ 64 System.out.println 65 ("Exception이 발생했습니다." 66 + " 자세한 내용은 다음과 같습니다."); 67 System.out.println(e.toString()); 68 }finally { 69 try{ 70 if(rs != null) rs.close(); 71 if(ps != null) ps.close(); 72 if(con != null) con.close(); 73 }catch(Exception e){} 74 } 75 } 76 } |
6. Java.sql.Clob 인터페이스 실습
l ClobInsert.java에 의해 oracle 데이터베이스에 저장된 CLOB 데이터 내용을 조회하는 예제
ClobSelect.java
01 import java.sql.*; 02 03 public class ClobSelect{ 04 public static void main(String args[]){ 05 Connection con = null; 06 PreparedStatement ps = null; 07 ResultSet rs = null; 08 String seq = null; 09 try{ 10 if(args[0] != null ){ 11 seq = args[0]; 12 } 13 }catch(Exception e){ 14 System.out.println 15 ("조회할 clob 데이터의 seq 값을 입력하세요"); 16 return; 17 } 18 try{ 19 String query1 = 20 " SELECT seq, clobdata " 21 + " FROM CLOBTEST " 22 + " WHERE seq = ? "; 23 Class.forName("oracle.jdbc.driver.OracleDriver"); 24 con=DriverManager.getConnection 25 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9" 26 ,"jdbc00","jdbc00"); 27 ps = con.prepareStatement(query1); 28 ps.setString(1,seq); 29 rs = ps.executeQuery(); 30 if(rs.next()){ 31 seq = rs.getString(1); 32 Clob tmpClob = rs.getClob(2); 33 long start = 1; 34 int bufferSize = 1024*40; 35 StringBuffer total = new StringBuffer(); 36 String tstr = ""; 37 for ( ; ; ) { 38 tstr = tmpClob.getSubString(start, bufferSize); 39 if ((tstr != null) && !(tstr.equals(""))){ 40 total.append(tstr); 41 start += bufferSize; 42 } 43 else break; 44 } 45 System.out.println 46 ("seq : "+seq) ; 47 System.out.println 48 ("clobData : "+total.toString()) ; 49 } 50 rs.close(); 51 ps.close(); 52 con.close(); 53 }catch(Exception e){ 54 System.out.println 55 ("Exception이 발생했습니다." 56 + " 자세한 내용은 다음과 같습니다."); 57 System.out.println(e.toString()); 58 }finally{ 59 try{ 60 if(rs != null) rs.close(); 61 if(ps != null) ps.close(); 62 if(con != null) con.close(); 63 }catch(Exception e){} 64 } 65 } 66 } |
7. Java.sql.Blob 인터페이스 실습
l BLOB 데이터 조회
l 다음과 같은 BLOB 데이터 타입을 가진 컬럼이 존재하는 테이블을 먼저 생성
CREATE TABLE BLOBTEST( seq VARCHAR2(100) NOT NULL blobdata BLOB); |
l 삽입할 데이터는 이미지를 저장한 파일의 이름과 이미지 파일의 내용을 삽입
seq |
Clobdata |
Anyboy.gif |
Anyboy.gif파일의 내용을 바이너리(BINARY) 형태로 변경한 byte 배열 |
BlobInsert.java
01 import java.sql.*; 02 import java.io.*; 03 import oracle.jdbc.driver.*; 04 05 public class BlobInsert{ 06 public static void main(String args[]){ 07 Connection con = null; 08 PreparedStatement ps = null; 09 OracleResultSet rs = null; 10 try{ 11 String query1 = 12 " INSERT INTO BLOBTEST " 13 + "(seq, blobdata) " 14 + " VALUES (?,EMPTY_BLOB()) "; 15 String query2 = 16 " SELECT blobdata " 17 + " FROM BLOBTEST " 18 + " WHERE seq = ? FOR UPDATE "; 19 Class.forName("oracle.jdbc.driver.OracleDriver"); 20 con=DriverManager.getConnection 21 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9" 22 ,"jdbc00","jdbc00"); 23 con.setAutoCommit(false); 24 ps = con.prepareStatement(query1); 25 ps.setString(1,"anyboy.gif"); 26 ps.executeUpdate(); 27 ps = con.prepareStatement(query2); 28 ps.setString(1, "anyboy.gif"); 29 rs = (OracleResultSet)ps.executeQuery(); 30 File file = null; 31 if(rs.next()){ 32 oracle.sql.BLOB tmpBlob = 33 ((OracleResultSet)rs).getBLOB (1); 34 try{ 35 file = new File("anyboy.gif"); 36 FileInputStream instream = 37 new FileInputStream(file); 38 OutputStream outstream = 39 tmpBlob.getBinaryOutputStream(); 40 int size = tmpBlob.getBufferSize(); 41 byte[] buffer = new byte[size]; 42 int length = -1; 43 while((length = instream.read(buffer))!= -1){ 44 outstream.write(buffer, 0, length); 45 } 46 instream.close(); 47 outstream.close(); 48 }catch (java.io.FileNotFoundException fe) { 49 System.err.println (file.getName() 50 + " 파일이 존재하지 않습니다."); 51 } 52 } 53 con.commit(); 54 System.out.println 55 ("지정하신 " + file.getName() 56 + " 파일을 blobtest 테이블에 " 57 + " 저장하였습니다."); 58 System.out.println 59 ("데이터베이스에 저장한 내용을 조회하는 " 60 + "예제도 만들어보세요."); 61 rs.close(); 62 ps.close(); 63 con.close(); 64 }catch(Exception e){ 65 System.out.println 66 ("Exception이 발생했습니다." 67 + " 자세한 내용은 다음과 같습니다."); 68 System.out.println(e.toString()); 69 }finally { 70 try{ 71 if(rs != null) rs.close(); 72 if(ps != null) ps.close(); 73 if(con != null) con.close(); 74 }catch(Exception e){} 75 |
8. Java.sql.Blob 인터페이스 실습
BlobSelect.java
01 import java.sql.*; 02 import java.io.*; 03 04 public class BlobSelect{ 05 public static void main(String args[]){ 06 Connection con = null; 07 PreparedStatement ps = null; 08 ResultSet rs = null; 09 String seq = null; 10 try { 11 String query1 = 12 " SELECT blobdata " + 13 " FROM BLOBTEST " + 14 " WHERE seq = ?"; 15 Class.forName("oracle.jdbc.driver.OracleDriver"); 16 con=DriverManager.getConnection 17 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9" 18 ,"jdbc00","jdbc00"); 19 ps = con.prepareStatement(query1); 20 ps.setString(1,"anyboy.gif"); 21 rs = ps.executeQuery(); 22 if(rs.next()){ 23 oracle.jdbc.OracleResultSet oracleRs = 24 (oracle.jdbc.OracleResultSet)rs; 25 Blob b = oracleRs.getBlob(1); 26 InputStream binstr = b.getBinaryStream(); 27 FileOutputStream foStream = 28 new FileOutputStream("anyboy_db.gif"); 29 byte abyte0[] = new byte[4096]; 30 int i; 31 while((i = binstr.read(abyte0)) != -1){ 32 foStream.write(abyte0, 0, i); 33 } 34 binstr.close(); 35 } 36 System.out.println 37 ("blobtest 테이블에 저장된 blob 데이터를 "); 38 System.out.println 39 ("지정하신 anyboy_db.gif 파일에 저장했습니다."); 40 rs.close(); 41 ps.close(); 42 con.close(); 43 }catch(Exception e){ 44 System.out.println 45 ("Exception이 발생했습니다." 46 + " 자세한 내용은 다음과 같습니다."); 47 System.out.println(e.toString()); 48 }finally{ 49 try{ 50 if(rs != null) rs.close(); 51 if(ps != null) ps.close(); 52 if(con != null) con.close(); 53 }catch(Exception e){} 54 } 55 } 56 } |
JDBC ResultSetMetaData 인터페이스 실습
ResultSetMetaData 인터페이스 실습
l 특정 테이블을 명령행 매개변수로 입력받아 조회하면서 입력된 테이블 이름과 테이블에 포함된 컬럼수에 따라서 각 컬럼의 데이터 타입, 컬럼의 최대 길이, 컬럼의 null 여부등을 제공받아서 동적으로 테이블에 따른 컬럼의 정보를 출력하는 예제
ColumnInformation.java
01 import java.sql.*; 02 03 public class ColumnInformation { 04 05 Connection con = null; 06 PreparedStatement ptmt = null; 07 ResultSet rs = null; 08 09 public static void main (String args []) { 10 if(args.length < 1){ 11 System.out.println 12 ("컬럼 정보를 조회할 테이블이름을\n" 13 + " 명령행 매개변수로 입력하세요."); 14 return; 15 } 16 ColumnInformation infor = new ColumnInformation(); 17 infor.connect(); 18 infor.getColumnInformation(args[0]); 19 infor.close(); 20 } 21 22 void connect(){ 23 try{ 24 Class.forName("oracle.jdbc.driver.OracleDriver"); 25 con = DriverManager.getConnection 26 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9", 27 "jdbc00","jdbc00"); 28 System.out.println("데이터베이스 연결되었습니다."); 29 }catch(ClassNotFoundException e){ 30 System.out.println("JDBC Driver load fail!!!"); 31 }catch(SQLException e){ 32 System.out.println("Connection fail!!!"); 33 e.printStackTrace(); 34 } 35 } 36 37 void close(){ 38 try{ 39 con.close(); 40 System.out.println("데이터베이스 연결 해제되었습니다."); 41 }catch(SQLException e){ 42 System.out.println("Connection close fail"); 43 e.printStackTrace(); 44 }finally{ 45 try{ 46 if(rs != null) rs.close(); 47 if(ptmt != null) ptmt.close(); 48 if(con != null) con.close(); 49 }catch(SQLException e){} 50 } 51 } 52 53 void getColumnInformation(String tableName){ 54 try{ 55 String query = 56 "select * from " + tableName ; 57 ptmt = con.prepareStatement (query); 58 rs = ptmt.executeQuery(); 59 ResultSetMetaData meta = rs.getMetaData(); 60 System.out.println 61 (" 테이블의 컬럼 정보 조회 결과는 " 62 + "다음과 같습니다.\n"); 63 int count = meta.getColumnCount(); 64 String s ; 65 for (int i = 1; i <= count; i++) { 66 s = meta.getColumnName(i)+ "\t" 67 + meta.getColumnTypeName(i)+"\t" 68 + meta.getColumnDisplaySize(i)+"\t"; 69 switch(meta.isNullable(i)){ 70 case 0 : 71 s = s + "\t not null" ; 72 break; 73 case 1 : 74 s = s + "\t null " ; 75 break; 76 case 2 : 77 s = s + "\t 알수없음" ; 78 break; 79 } 80 System.out.println(s); 81 s = null; 82 } 83 ptmt.close(); 84 }catch(Exception e){ 85 e.printStackTrace(); 86 } 87 } 88 } |
l 특정 테이블의 컬럼 개수와 컬럼의 데이터 타입 정보를 미리 알아보고 특정 테이블에 포함된 모든 데이터를 조회하는 예제를 작성
l 테이블 이름이 달라지더라도 달라진 테이블에 따라 해당 테이블이 가진 컬럼의 개수와 컬럼의 데이터 타입에 따라 데이터를 읽어오도록 한다.
DynamicTableSelect.java
01 import java.sql.*; 02 03 public class DynamicTableSelect { 04 05 Connection con = null; 06 PreparedStatement ptmt = null; 07 ResultSet rs = null; 08 09 public static void main (String args []) { 10 if(args.length < 1){ 11 System.out.println 12 ("데이터를 조회할 테이블이름을\n" 13 + " 명령행 매개변수로 입력하세요."); 14 return; 15 } 16 DynamicTableSelect dts = new DynamicTableSelect(); 17 dts.connect(); 18 dts.getTable(args[0]); 19 dts.close(); 20 } 21 22 void connect(){ 23 try{ 24 Class.forName("oracle.jdbc.driver.OracleDriver"); 25 con = DriverManager.getConnection 26 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9", 27 "jdbc00","jdbc00"); 28 System.out.println("데이터베이스 연결되었습니다."); 29 }catch(ClassNotFoundException e){ 30 System.out.println("JDBC Driver load fail!!!"); 31 }catch(SQLException e){ 32 System.out.println("Connection fail!!!"); 33 e.printStackTrace(); 34 } 35 } 36 37 void close(){ 38 try{ 39 con.close(); 40 System.out.println("데이터베이스 연결 해제되었습니다."); 41 }catch(SQLException e){ 42 System.out.println("Connection close fail"); 43 e.printStackTrace(); 44 }finally{ 45 try{ 46 if(rs != null) rs.close(); 47 if(ptmt != null) ptmt.close(); 48 if(con != null) con.close(); 49 }catch(SQLException e){} 50 } 51 } 52 53 void getTable(String tableName){ 54 try{ 55 String query = 56 "select * from " + tableName ; 57 ptmt = con.prepareStatement (query); 58 rs = ptmt.executeQuery(); 59 ResultSetMetaData meta = rs.getMetaData(); 60 System.out.println (tableName 61 + " 테이블 조회 결과는 다음과 같습니다.\n"); 62 int count = meta.getColumnCount(); 63 while(rs.next()){ 64 for (int i = 1; i <= count; i++) { 65 switch(meta.getColumnType(i)){ 66 case Types.NUMERIC : 67 System.out.print 68 (rs.getLong(i) + "\t"); 69 break; 70 case Types.CHAR : 71 case Types.VARCHAR : 72 System.out.print 73 (rs.getString(i) + "\t"); 74 break; 75 case Types.DATE : 76 case Types.TIMESTAMP : 77 System.out.print 78 (rs.getDate(i) + "\t"); 79 break; 80 } 81 } 82 System.out.println(); 83 } 84 ptmt.close(); 85 }catch(Exception e){ 86 e.printStackTrace(); 87 } 88 } 89 } |
JDBC DatabaseMetaData 사용 예제
1. DatabaseMetaData 인터페이스 실습
l Batch 작업 지원 여부에 따라 세 개의 데이터 일괄처리하여 삽입하는 예제
l 삽입할 데이터
Id |
Name |
Bonus |
In_date |
Dept_name |
00010 |
이몽룡 |
85000.00 |
1998/7/1 |
영업부 |
00011 |
성춘향 |
75000.00 |
2000/7/1 |
영업부 |
00012 |
변학도 |
70000.00 |
2001/7/1 |
영업부 |
l DatabaseMetaData를 이용하여 JDBC 드라이버가 일괄처리를 지원하는지의 여부를 알아보고 지원한느 경우에 세 개의 데이터를 삽입하는 예제
BatchTest_MetaData.java
01 import java.sql.*; 02 03 public class BatchTest_MetaData{ 04 Connection con = null; 05 DatabaseMetaData dbmd = null; 06 Statement stmt = null; 07 08 public static void main (String args []) { 09 BatchTest_MetaData bt = new BatchTest_MetaData(); 10 bt.connect(); 11 bt.insertBatch(); 12 bt.close(); 13 } 14 15 public void connect(){ 16 try{ 17 Class.forName("oracle.jdbc.driver.OracleDriver"); 18 con = DriverManager.getConnection 19 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9", 20 "jdbc00","jdbc00"); 21 System.out.println("데이터베이스 연결되었습니다."); 22 }catch(ClassNotFoundException e){ 23 System.out.println("JDBC Driver load fail!!!"); 24 }catch(SQLException e){ 25 System.out.println("Connection fail!!!"); 26 e.printStackTrace(); 27 } 28 } 29 30 public void close(){ 31 try{ 32 con.close(); 33 System.out.println("데이터베이스 연결 해제되었습니다."); 34 }catch(SQLException e){ 35 System.out.println("Connection fail!!!"); 36 e.printStackTrace(); 37 }finally{ 38 try{ 39 if(con != null) con.close(); 40 }catch(SQLException e){} 41 } 42 } 43 44 public void insertBatch(){ 45 try{ 46 dbmd = con.getMetaData(); 47 stmt = con.createStatement (); 48 String query1 ="insert into emp values("; 49 query1 += "00010,'이몽룡',85000.00,"; 50 query1 += "TO_DATE('1998/07/01','YYYY/MM/DD'),"; 51 query1 += "'영업부')"; 52 String query2 = "insert into emp values("; 53 query2 += "00011,'성춘향', 75000.00,"; 54 query2 += "TO_DATE('2000/07/01', 'YYYY/MM/DD'),"; 55 query2 += "'영업부')"; 56 String query3 = "insert into emp values("; 57 query3 += "00012,'변학도', 70000.00,"; 58 query3 += "TO_DATE('2001/07/01', 'YYYY/MM/DD'),"; 59 query3 += "'영업부')"; 60 int total = 0; 61 if(dbmd.supportsBatchUpdates()){ 62 stmt.addBatch(query1); 63 stmt.addBatch(query2); 64 stmt.addBatch(query3); 65 int [] rowcount = stmt.executeBatch(); 66 for(int i = 0; i < rowcount.length; i++){ 67 total += rowcount[i]; 68 } System.out.print 69 ("배치작업에 의해 " + total); 70 System.out.println 71 (" 개의 데이터가 삽입되었습니다."); 72 }else { 73 System.out.print 74 ("배치작업이 지원되지 않습니다."); 75 int count = stmt.executeUpdate(query1); 76 total += count; 77 if(count >= 1) { 78 count = stmt.executeUpdate(query2); 79 total += count; 80 if(count >= 1) { 81 count = stmt.executeUpdate(query3); 82 total += count; 83 } 84 } 85 System.out.println 86 (total + " 개의 데이터가 삽입되었습니다."); 87 } 88 stmt.close(); 89 }catch(SQLException e){ 90 e.printStackTrace(); 91 }finally { 92 try{ 93 if(stmt != null) stmt.close(); 94 }catch(SQLException e){} 95 } 96 } 97 } |
2. DatabaseMetaData 인터페이스 실습
l 연결한 데이터베이스의 종류와 버전에 따라서 서로 다른 종류의 JDBC 드라이버를 사용해야 한다.
l 특정 기능을 수행하는 메서드를 올바르게 사용하여, JDBC를 수행하였을 때의 결과가 예상했던 바와 다르다면, 연결한 데이터베이스와 JDBC 드라이버의 종류와 버전이 맞지 않을 가능성도 있을 수 있다.
l 이번 예제에서는 연결한 데이터베이스와 JDBC 드라이버의 종류와 버전이 맞는지를 확인해보는 예제
JDBCVersionTest.java
01 import java.sql.*; 02 03 class JDBCVersionTest{ 04 public static void main (String args []) 05 throws SQLException{ 06 DriverManager.registerDriver 07 (new oracle.jdbc.driver.OracleDriver()); 08 Connection conn = DriverManager.getConnection 09 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9", 10 "jdbc00","jdbc00"); 11 DatabaseMetaData meta = conn.getMetaData (); 12 System.out.println("Database Product Name : " + 13 meta.getDatabaseProductName()); 14 System.out.println 15 ("\nDatabase Product Version : \n" + 16 meta.getDatabaseProductVersion()); 17 System.out.println 18 ("\nJDBC Driver Name : " + 19 meta.getDriverName()); 20 System.out.println 21 ("\nJDBC Driver Version : " + 22 meta.getDriverVersion()); 23 System.out.println 24 ("\nJDBC Driver Major Version : " + 25 meta.getDriverMajorVersion()); 26 System.out.println 27 ("\nJDBC Driver Minor Version : " + 28 meta.getDriverMinorVersion()); 29 } 30 } |
JDBC CallableStatment 예제
1. PL/SQL (Procedural Language/SQL)
2. Calc_Tax_Function.java
(capital in number)
return number
is
tax number;
begin
tax:=capital * 0.05;
return (tax);
end;
\
<Calc_Tax_Function.java
02
03 public class Calc_Tax_Function {
04 Connection con = null;
05 CallableStatement ctmt = null;
06
07 public static void main (String args []) {
08 Calc_Tax_Function ctf = new Calc_Tax_Function();
09 if(args.length < 1){
10 System.out.println
11 ("calc_tax FUNCTION에 전달할 값을 입력하세요.\n"
12 + "예를 들어, 1000의 값에 5% 세금을 계산하려면\n"
13 + "java Calc_Tax_Function 1000 을 입력하세요.");
14 return;
15 }
16 int capital = Integer.parseInt(args[0]);
17
18 try{
19 ctf.connect();
20 ctf.callFunction(capital);
21 ctf.close();
22 }catch(SQLException e){
23 e.printStackTrace();
24 }finally{
25 try{
26 if(ctf.ctmt != null) ctf.ctmt.close();
27 if(ctf.con != null) ctf.con.close();
28 }catch(SQLException e){}
29 }
30 }
31
32 public void connect() throws SQLException {
33 try{
34 Class.forName("oracle.jdbc.driver.OracleDriver");
35 con = DriverManager.getConnection
36 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9",
37 "jdbc00","jdbc00");
38 System.out.println("데이터베이스 연결되었습니다.");
39 }catch(ClassNotFoundException e){
40 System.out.println("JDBC Driver load fail!!!");
41 }
42 }
43
44 public void close() throws SQLException {
45 con.close();
46 System.out.println("\n데이터베이스 연결해제되었습니다.");
47 }
48
49 public void callFunction(int capital) throws SQLException {
50 String query = "{? = call calc_tax(?)}";
51 ctmt = con.prepareCall(query);
52 ctmt.setInt(2, capital);
53 ctmt.registerOutParameter(1,Types.DOUBLE);
54 ctmt.execute();
55 double tax = ctmt.getDouble(1);
56 System.out.println
57 ("calc_tax 호출이 완료되었습니다.");
58 System.out.println
59 ("입력한 원금 " + capital + " 에 대한 세금 " + tax);
60 ctmt.close();
61 }
62 }
3. Calc_Tax_Procedure.java
(capital in number, tax out number)
is
begin
tax:=capital * 0.05;
end;
\
< Calc_Tax_Procedure.java >
02
03 public class Calc_Tax_Procedure {
04 Connection con = null;
05 CallableStatement ctmt = null;
06
07 public static void main (String args []) {
08 Calc_Tax_Procedure ctp = new Calc_Tax_Procedure();
09 if(args.length < 1){
10 System.out.println
11 ("calc_tax_p PROCEDURE에 전달할 값을 입력하세요.\n"
12 + "예를 들어, 1000의 값에 5% 세금을 계산하려면\n"
13 + "java Calc_Tax_Procedure 1000 을 입력하세요.");
14 return;
15 }
16 int capital = Integer.parseInt(args[0]);
17
18 try{
19 ctp.connect();
20 ctp.callProcedure(capital);
21 ctp.close();
22 }catch(SQLException e){
23 e.printStackTrace();
24 }finally{
25 try{
26 if(ctp.ctmt != null) ctp.ctmt.close();
27 if(ctp.con != null) ctp.con.close();
28 }catch(SQLException e){}
29 }
30 }
31
32 public void connect() throws SQLException {
33 try{
34 Class.forName("oracle.jdbc.driver.OracleDriver");
35 con = DriverManager.getConnection
36 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9",
37 "jdbc00","jdbc00");
38 System.out.println("데이터베이스 연결되었습니다.");
39 }catch(ClassNotFoundException e){
40 System.out.println("JDBC Driver load fail!!!");
41 }
42 }
43
44 public void close() throws SQLException {
45 con.close();
46 System.out.println("\n데이터베이스 연결해제되었습니다.");
47 }
48
49 public void callProcedure(int capital) throws SQLException {
50 String query = "{call calc_tax_p(?, ?)}";
51 ctmt = con.prepareCall(query);
52 ctmt.setInt(1, capital);
53 ctmt.registerOutParameter(2,Types.DOUBLE);
54 ctmt.execute();
55 double tax = ctmt.getDouble(2);
56 System.out.println
57 ("calc_tax_p 호출이 완료되었습니다.");
58 System.out.println
59 ("입력한 원금 " + capital + " 에 대한 세금 " + tax);
60 ctmt.close();
61 }
62 }
JDBC PreparedStatement를 이용한 데이터 조회 예제
1. DataInsert_Prepared.java
02
03 public class DataInsert_Prepared{
04 Connection con = null;
05 PreparedStatement ptmt = null;
06
07 public static void main (String args []) {
08 DataInsert_Prepared di = new DataInsert_Prepared();
09 try{
10 di.connect();
11 di.insert();
12 di.close();
13 }catch(SQLException e){
14 e.printStackTrace();
15 }finally{
16 try{
17 if(di.ptmt != null) di.ptmt.close();
18 if(di.con != null) di.con.close();
19 }catch(SQLException e){}
20 }
21 }
22
23 public void connect()throws SQLException {
24 try{
25 Class.forName("oracle.jdbc.driver.OracleDriver");
26 con = DriverManager.getConnection
27 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9",
28 "jdbc00","jdbc00");
29 System.out.println("데이터베이스 연결되었습니다.");
30 }catch(ClassNotFoundException e){
31 System.out.println("JDBC Driver load fail!!!");
32 }
33 }
34
35 public void close()throws SQLException {
36 con.close();
37 System.out.println("데이터베이스 연결해제되었습니다.");
38 }
39
40 public void insert()throws SQLException {
41 String query = "insert into emp values(?,?,?,?,?)";
42 ptmt = con.prepareStatement (query);
43
44 int id = 8;
45 String name = "박삼성";
46 double bonus = 40000.00;
47 Date in_date = new Date(System.currentTimeMillis());
48 String dept = "인사부";
49
50 ptmt.setInt(1,id);
51 ptmt.setString(2,name);
52 ptmt.setDouble(3,bonus);
53 ptmt.setDate(4,in_date);
54 ptmt.setString(5,dept);
55 int rowcount = ptmt.executeUpdate();
56
57 id++;
58 name = "이자바";
59 dept = "총무부";
60
61 ptmt.setInt(1,id);
62 ptmt.setString(2,name);
63 ptmt.setDouble(3,bonus);
64 ptmt.setDate(4,in_date);
65 ptmt.setString(5,dept);
66 rowcount += ptmt.executeUpdate();
67
68 System.out.println
69 ("emp 테이블에" + rowcount +
70 " 개의 데이터가 삽입되었습니다.");
71 ptmt.close();
72 }
73 }
2. DataSelect_Prepared.java
02
03 public class DataSelect_Prepared{
04 Connection con = null;
05 PreparedStatement ptmt = null;
06
07 public static void main (String args []) {
08 DataSelect_Prepared dsp = new DataSelect_Prepared();
09 if(args.length < 2){
10 System.out.println
11 ("emp 테이블에서 조회할 id 값을 입력하세요.\n"
12 + "5번에서 8번까지의 id를 가진 데이터를 조회하려면\n"
13 + "java DataSelect_Prepared 5 8 을 입력하세요.");
14 return;
15 }
16 int start = Integer.parseInt(args[0]);
17 int end = Integer.parseInt(args[1]);
18
19 try{
20 dsp.connect();
21 dsp.select(start, end);
22 dsp.close();
23 }catch(SQLException e){
24 e.printStackTrace();
25 }finally{
26 try{
27 if(dsp.ptmt != null) dsp.ptmt.close();
28 if(dsp.con != null) dsp.con.close();
29 }catch(SQLException e){}
30 }
31 }
32
33 public void connect() throws SQLException {
34 try{
35 Class.forName("oracle.jdbc.driver.OracleDriver");
36 con = DriverManager.getConnection
37 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9",
38 "jdbc00","jdbc00");
39 System.out.println("데이터베이스 연결되었습니다.");
40 }catch(ClassNotFoundException e){
41 System.out.println("JDBC Driver load fail!!!");
42 }
43 }
44
45 public void close() throws SQLException {
46 con.close();
47 System.out.println("\n데이터베이스 연결해제되었습니다.");
48 }
49
50 public void select(int start, int end) throws SQLException {
51 String query =
52 "select * from emp where id >= ? and id <= ?";
53 ptmt = con.prepareStatement (query);
54
55 ptmt.setInt(1, start);
56 ptmt.setInt(2, end);
57
58 ResultSet rs = ptmt.executeQuery();
59 System.out.println("조회 결과는 다음과 같습니다.\n");
60 while(rs.next()){
61 int id = rs.getInt("id");
62 String result = "ID : " + id + "\t";
63 String name = "이름 : " + rs.getString(2) + "\t";
64 result += name;
65 double bonus = rs.getDouble(3);
66 result += "BONUS : " + bonus + "\t";
67 Date inDate = rs.getDate(4);
68 result += "입사일 : " + inDate + "\t";
69 String dept = "부서 : " + rs.getString(5) + "\t";
70 result += dept;
71 System.out.println(result);
72 }
73 ptmt.close();
74 }
75 }
3. ImgTableCreate.java
02
03 public class ImgTableCreate{
04 Connection con = null;
05 Statement stmt = null;
06
07 public static void main (String args []) {
08 ImgTableCreate tc = new ImgTableCreate();
09 tc.connect();
10 tc.createTable();
11 tc.close();
12 }
13
14 public void connect(){
15 try{
16 Class.forName("oracle.jdbc.driver.OracleDriver");
17 con = DriverManager.getConnection
18 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9",
19 "jdbc00","jdbc00");
20 System.out.println("데이터베이스 연결되었습니다.");
21 }catch(ClassNotFoundException e){
22 System.out.println("JDBC Driver load fail!!!");
23 }catch(SQLException e){
24 System.out.println("Connection fail!!!");
25 e.printStackTrace();
26 }
27 }
28
29 public void close(){
30 try{
31 con.close();
32 System.out.println
33 ("데이터베이스 연결 해제되었습니다.");
34 }catch(SQLException e){
35 System.out.println("Connection fail!!!");
36 e.printStackTrace();
37 }finally{
38 try{
39 if(con != null) con.close();
40 }catch(SQLException e){}
41 }
42 }
43
44 public void createTable(){
45 try{
46 stmt = con.createStatement ();
47 String query = "CREATE TABLE img ";
48 query += "(name VARCHAR2(30) , ";
49 query += " contents RAW(2000))" ;
50 int rowcount = stmt.executeUpdate(query);
51 System.out.println
52 ("img 테이블 생성이 완료되었습니다.");
53 stmt.close();
54 }catch(SQLException e){
55 e.printStackTrace();
56 }finally {
57 try{
58 if(stmt != null) stmt.close();
59 }catch(SQLException e){}
60 }
61 }
62 }
4. ImgTableInsert.java
02 import java.io.*;
03
04 public class ImgTableInsert {
05 public static void main (String args []) {
06 Connection conn=null;
07 PreparedStatement pstmt=null;
08 try{
09 Class.forName ("oracle.jdbc.driver.OracleDriver");
10 }catch(ClassNotFoundException e){}
11
12 try{
13 conn = DriverManager.getConnection
14 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9",
15 "jdbc00","jdbc00");
16 pstmt = conn.prepareStatement
17 ("insert into img values (?,?)");
18 File file = new File("anyboy.gif");
19 int size = (int) file.length();
20 FileInputStream fin = new FileInputStream(file);
21 byte [] contents = new byte[size];
22 int total;
23 while((total = fin.read(contents)) != -1){
24 }
25 pstmt.setString(1,file.getName());
26 pstmt.setBytes(2,contents);
27 int row = pstmt.executeUpdate();
28 System.out.println
29 (row + " 개의 데이터가 삽입되었습니다");
30 }catch(Exception e){
31 e.printStackTrace();
32 }finally{
33 if(pstmt != null) pstmt.close();
34 if(conn != null) conn.close();
35 }
36 }
37 }
5. ImgTableSelect.java
02 import java.io.*;
03
04 public class ImgTableSelect {
05 public static void main (String args []) {
06 Connection conn = null;
07 PreparedStatement pstmt = null;
08 FileOutputStream fout = null;
09 byte [] db = null;
10
11
12 try{
13 Class.forName ("oracle.jdbc.driver.OracleDriver");
14 }catch(ClassNotFoundException e){}
15
16 try{
17 conn = DriverManager.getConnection
18 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9",
19 "jdbc00","jdbc00");
20 pstmt = conn.prepareStatement
21 ("select contents from img where name = ?");
22 pstmt.setString(1,"anyboy.gif");
23
24 int leng = (int)(new File("anyboy.gif").length());
25 db = new byte[leng];
26
27 ResultSet rs = pstmt.executeQuery();
28 while(rs.next()){
29 db = rs.getBytes(1);
30 }
31
32 fout = new FileOutputStream("anyboy.gif.db");
33 fout.write(db);
34 System.out.println
35 ("anyboy.gif.db 라는 파일에 저장했습니다\n");
36 }catch(Exception e){
37 e.printStackTrace();
38 }finally{
39 if(pstmt != null) pstmt.close();
40 if(conn != null) conn.close();
41 }
42 }
43 }
JDBC DataSource 인터페이스
1. DriverManager를 통한 Connection 생성의 단점
DriverManager를 통하여 Connection 생성하는 JDBC PROGRAM은 사용하려는 데이터베이스가 변경되거나 그에 따른 JDBC 드라이버가 변경된다면 JDBC PROGRAM의 소스에도 변경되어야 하는 정보가 있음.
JDBC 드라이버 이름과 JDBC URL, 데이터베이스 계정, 데이터베이스 암호등
2. DataSource 인터페이스의 역할
개발자가 어플리케이션 내에서 직접 하드 코딩하지 않으므로 투명한 개발 가능
getConnection 메서드를 이용해 Connection 객체를 생성하는데 이때 접근하는 데이터 소스가 달라도 코드의 수정은 없고, DataSource의 속성값(property)만 변경하여 적용할 수 있음.
DataSource는 JNDI(Java Naming & Directory Interface) 서비스를 제공하는 환경에서 사용 가능
JNDI를 이용한 DataSource를 이용하게 되면 다음과 같은 이점이 있음
*. JDBC PROGRAM 내에서 데이터베이스를 연결할 때에 JDBC 드라이버를 등록할 필요 없음
*. JDBC URL을 몰라도 JDBC 네이밍 서비스와 디렉토리 서비스가 제공하는 기능을 사용할 수 있음
3. DataSource 이용을 위한 Tomcat 엔진의 환경 설정
연결할 데이터베이스의 JDBC 드라이버를 Tomcat 엔진이 설치된 디렉토리의 common\lib 디렉토리에 존재해야 한다. 이 때 JDBC 드라이버 파일은 반드시 확장자 jar 형태로 압축되어 있어야 한다. Tomcat 에서 실행하는 JSP를 통하여 oracle 데이터베이스 9.2.0.1 에 연결하기 위해서는 oracle 데이터베이스 9.2.0.1용의 JDBC 드라
이버를 Tomcat 엔진이 인식하는 classpath로 설정된 디렉토리에 존재해야 한다.
*. http://127.0.0.1:8080/admin 접속한 후 admin 계정으로 로그 인
*. Tomcat Server > Service (Catalina) > Host(loalhost) > Context(/jdbc) > Data Sources 항목 클릭
*. Create New Data Source 클릭
*. 각 Property 입력
Property | Value | 비고 |
..JNDI Name | ..jdbc/myoracle | |
..Data Source URL | ..jdbc:oracle:thin:@DB IP:1521:sid | ..DB IP:접속하는 DB의 IP를 지정 sid : ..접속하는 DB의 sid |
..JDBC Driver ..Class |
..oracle.jdbc.driver.OracleDriver | ..DB에 접속하기 위해 사용할 JDBC ..드라이버명 |
..User Name | ..DB user name | ..DB에 접속하기 위한 User Name |
..Password | ..DB password |
..DB에 접속하기 위한 Password |
..Max. Active ..Connections |
..10 | ..동시에 서비스할 수 있는 최대 활성화 .. 커넥션의 수 |
..Max. Idle ..Connections |
..5 | ..최대 유휴 커넥션의 수 |
..Max. Wait for ..Connection |
..1000 | ..예외가 발생하여 커넥션을 해제할 ..떄까지 최대로 기다리는 시간으로 ..1/1000 초 단위 |
..Validation Query |
..select * from tab | ..반드시 입력해야 하며 Tomcat ..엔진에서 DB에 접속이 가능한지를 ..자체적으로 확인하기 위한 Query |
*. Save > Commit Save
*. %Tomcat%\conf\Catalina\localhost\jdbc.xml 파일 열기
*. jdbc.xml 파일에서 <Context> 태그 부분을 찾아서 <ResourceParams> 태그 중 name 속성의 값이 "jdbc/myoracle"인 부분 아래에 보면 이미 작성한 DataSource Properties 가 <parameter> </parameter> 태그 내에 정의 되어 있을 것이다.
*. <ResourceParams>와 </ResourceParams> 태그 사이에 다음 내용을 추가
<name>removeAbandoned</name>
<value>true</value>
</parameter>
<parameter>
<name>removeAbandonedTimeout</name>
<name>10</value>
</parameter>
<name>logAbandoned</name>
<value>true</balue>
</parameter>
* 추가되는 내용의 의미
Revmoe Abandoned : 사용할 수 있는 커넥션이 부족해진다면 DBCP(Database Connection Pool)는 버려진 커넥션을 찾아 복구하고 재생. 디폴트는 false
removeAbandonedTimeout : 커넥션이 버려졌다고 간주되기 전에 사용되지 않은 시간(초)를 설정하기 위해 사용. 버러젼 커넥션을 제거하는데 기본적으로 정해진 타임아웃 시가은 300초
logAbandoned : 만일 커넥션 자원을 낭비한 코드 위치의 로그를 남길 수 있음. 기본은 false
* Tomcat 엔진 Restart
4. Tomcat 엔진에서 올바르게 JDBC 드라이버를 인식하는지 테스트 하기 위한 예제 (JSP)
import = "java.sql.*" %>
<%
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManger.getconnection(
"jdbc:oracle:thin:@127.0.0.1:1521:ora9",
"jdbc00", "jdbc00");
stmt = con.createStatement();
String query = "select tname from tab";
rs = stmt.executeQuery(query);
out.println("<h1>소유한 테이블은 다음과 같습니다.</h1>");
out.println("<hr><br>");
while(rs.next()){
String result = rs.getString(1);
out.println(result + "<br>");
}
rs.close();
stmt.close();
con.close();
} catch(ClassNotFoundException e){
System.out.println("JDBC 드라이버 로드 실패!");
out.println("서버 장애가 발생하였습니다.");
} catch(CSQLException e){
System.out.println("DB using fail!");
e.printStackTrace();
out.println("서버 장애가 발생하였습니다.");
} finally {
try{
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
}
catch(SQLException e) { }
}
%>
5. DataSource를 이용하여 oracle 데이터베이스 계정 내의 테이블 이름 조회하는 예제
01 <%@ page contentType="text/html; charset=euc-kr" %>
02 <%@ page import =
03 "javax.naming.*,javax.sql.*,java.sql.*" %>
04 <html>
05 <head>
06 <title>
07 DataSource Test
08 </title>
09 </head>
10 <body>
11 <h3>
12 DataSource 를 이용하여 오라클 데이터베이스의
13 <br>
14 테이블 이름을 조회하는 test 화면 입니다.
15 </h3>
16 <BR>
17 <hr>
18 <%
19 try{
20 Context initContext = new InitialContext();
21 if(initContext == null )
22 throw new Exception("Boom - No Context");
23 Context envContext =
24 (Context)initContext.lookup("java:/comp/env");
25 DataSource ds =
26 (DataSource)envContext.lookup("jdbc/myoracle");
27 Connection conn = ds.getConnection();
28 out.println
29 ("DataSource 를 통하여 데이터베이스에 "
30 + "연결하였습니다.<BR>");
31 String queryStr="SELECT * FROM tab";
32 PreparedStatement pstmt =
33 conn.prepareStatement(queryStr);
34 ResultSet rs = pstmt.executeQuery();
35 out.println
36 ("<h5>테이블 조회 결과입니다<BR><BR></h5>");
37 while(rs.next()){
38 System.out.println("rs.next()");
39 out.println(rs.getString(1)+"<BR>");
40 }
41 rs.close();
42 pstmt.close();
43 conn.close();
44 }catch(Exception e) {
45 out.println("<BR>" + e.getMessage());
46 e.printStackTrace();
47 } finally {
try{
if(rs != null) rs.close();
if(ps != null) ps.close();
if(con != null) con.close();
}catch(Exception e){}
}
48 %>
49 </body>
50 </html>
6. login.html
* 웹브라우저에서 사용자가 로그인 정보를 입력할 수 있는 화면
* html의 <form> 태그를 사용하여 id, password 두 가지의 로그인 정볼르 입력받을 수 있도록 구성하여 입력받은 정보를 login.jsp 로 전달
* %Tomcat%\Webapps\jdbc 디렉토리에 저장
01 <html>
02 <head>
03 <title>
04 회원 로그인
05 </title>
06 </head>
07
08 <body>
09 <h1> 회원 리스트를 조회하려면
10 로그인 정보를 입력하세요. </h1>
11 <br>
12 <hr>
13 <br>
14 <h3>
15 <form action="/jdbc/login.jsp" method=post>
16 ID
17 <input type=text name=id size=10>
18 <br>
19 암호 <input type=password name=password size=10>
20 <br>
21 <!-- 이름 <input type=text name=name siez=20>
22 <br>-->
23 <input type=submit value=로그인>
24 <input type=reset value=입력취소>
25 </form>
26 </h3>
27 <br>
28 <hr>
29 </body>
30 </html>
6. login.jsp
* login.html 에서 입력받은 사용자 로그인 정보를 전달받아서 이 정보들을 MemberDAO 객체로 전송
* %Tomcat%\webapps\jdbc 디렉토리에 저장
01 <%@ page contentType="text/html;charset=euc-kr" %>
02 <%@ page import="vo.*,java.util.Vector" %>
03 <jsp:useBean id="member" class="dao.MemberDAO" />
04 <%
05 ListVO memberList = null;
06 String result = "";
07 boolean isEmptyFlag = false;
08
09 String id = request.getParameter("id");
10 String password = request.getParameter("password");
11
12 switch(member.login(id, password)){
13 case 1:
14 result =
15 "입력하신 비밀 번호가 틀립니다.<br>"
16 + "확인하고 다시 입력하세요<br>";
17 isEmptyFlag = true;
18 break;
19 case 2:
20 result =
21 "회원이 아니시군요.<br>"
22 + "입력하신 id 를 다시 확인하시거나 <br>"
23 + "회원이 아니라면 회원가입을 먼저 하세요.<br>";
24 isEmptyFlag = true;
25 break;
26 default:
27 memberList = member.listMember();
28 if(memberList.getTotal()==0 ||
29 memberList.getList().size()==0){
30 isEmptyFlag=true;
31 }
32 }
33 %>
34
35 <html>
36 <head>
37 <title>
38 회원 리스트 보기
39 </title>
40 </head>
41
42 <body>
43 <% if(isEmptyFlag){
44 %>
45 <h1>
46 <%=result%>
47 </h1>
48 <br><br>
49 <% } else {
50 %>
51 <h1> 회원 리스트는 다음과 같습니다.<br></h1>
52 <table border = 3>
53 <tr>
54 <th align=center><h3>회원 ID</h3></th>
55 <th align=center><h3>회원 이름</h3></th>
56 </tr>
57 <%
58 //List 를 포함하기 위한 Vector
59 Vector tempList=memberList.getList();
60 for(int i = 0; i < tempList.size();i++){
61 DetailVO tempVO=(DetailVO)tempList.elementAt(i);
62 %>
63 <tr>
64 <td align=center><h4><%=tempVO.getId()%></h4></td>
65 <td align=center><h4><%=tempVO.getName()%></h4></td>
66 </tr>
67 <%
68 }
69 }
70 %>
71 </table>
72 </body>
73 </html>
7. DetailVO.java
01 package vo;
02
03 public class DetailVO {
04 /**
05 * 회원 id
06 */
07 private String id;
08
09 /**
10 * 회원 암호
11 */
12 private String password;
13
14 /**
15 * 회원 이름
16 */
17 private String name;
18
19 /**
20 * 기본 Constructor
21 */
22 public DetailVO(){}
23
24 /**
25 * Constructor
26 * @param id 조회한 회원 id
27 * @param password 조회한 회원 password
28 * @param name 조회한 회원 이름
29 */
30 public DetailVO(String id, String password, String name){
31 this.id = id;
32 this.password = password;
33 this.name = name;
34 }
35
36 /**
37 * 회원 id Getter Method
38 * @return String 조회한 회원 id
39 */
40 public String getId(){
41 return id;
42 }
43
44 /**
45 * 회원 id Setter Method
46 * @param String 입력한 회원 id
47 */
48 public void setId(String id){
49 this.id = id;
50 }
51
52 /**
53 * 회원 id Getter Method
54 * @return String 조회한 회원 password
55 */
56 public String getPassword(){
57 return password;
58 }
59
60 /**
61 * 회원 id Setter Method
62 * @param String 조회한 회원 password
63 */
64 public void setPassword(String password){
65 this.password = password;
66 }
67
68 /**
69 * 회원 name Getter Method
70 * @return String 조회한 회원 이름
71 */
72 public String getName(){
73 return name;
74 }
75
76 /**
77 * 회원 name Setter Method
78 * @param String 조회한 회원 이름
79 */
80 public void setName(String name){
81 this.name = name;
82 }
83 }
7. ListVO.java
01 package vo;
02
03 import java.util.Vector;
04
05 public class ListVO {
06 /**
07 * 조회된 회원 리스트
08 */
09 private Vector list;
10
11 /**
12 * 총 회원 수
13 */
14 private long total;
15
16 /**
17 * 기본 Constructor
18 */
19 public ListVO(){}
20
21 /**
22 * 조회된 회원 리스트 Getter Method
23 * @return Vector 조회된 회원 리스트
24 */
25 public Vector getList(){
26 return list;
27 }
28
29 /**
30 * 조회된 회원 리스트 Setter Method
31 * @param Vector 조회된 회원 리스트
32 */
33 public void setList(Vector list){
34 this.list = list;
35 }
36
37 /**
38 * 총 회원수 Getter Method
39 * @return long 총 회원수
40 */
41 public long getTotal(){
42 return total;
43 }
44
45 /**
46 * 총 회원수 Setter Method
47 * @param long 총 회원수
48 */
49 public void setTotal(long total){
50 this.total = total;
51 }
52 }
8. MemberDAO.java
01 package dao;
02
03 import java.util.Vector;
04 import java.sql.*;
05 import javax.naming.*;
06 import javax.sql.*;
07 import vo.*;
08
09 public class MemberDAO {
10
11 /**
12 * 총 게시물 갯수를 얻는 Query
13 */
14 private static String stGET_TOTAL_NUM =
15 "SELECT COUNT(*) FROM MEMBER";
16
17 /**
18 * 게시물 리스트를 얻는 Query
19 */
20 private static String stLIST_MEMBER =
21 "SELECT * FROM MEMBER";
22
23 /**
24 * 비밀번호 확인 Query
25 */
26 private static String stCHECK_LOGIN =
27 "SELECT PASSWORD FROM MEMBER WHERE ID = ?";
28
29 /**
30 * DataSource 객체 변수 선언
31 */
32 DataSource ds = null;
33
34 /**
35 * 기본 Constructor
36 */
37 public MemberDAO()throws Exception {
38 Context initContext = new InitialContext();
39 Context envContext =
40 (Context)initContext.lookup("java:/comp/env");
41 ds =(DataSource)envContext.lookup("jdbc/myoracle");
42 }
43
44 public ListVO listMember() throws Exception {
45 ListVO retVO = new ListVO();
46 Statement stmt = null;
47 PreparedStatement pstmt = null;
48 ResultSet rs = null;
49 try {
50 Connection conn = ds.getConnection();
51 stmt = conn.createStatement();
52
53 rs = stmt.executeQuery(stGET_TOTAL_NUM);
54 long total = 0;
55 if(rs.next()){
56 total = rs.getLong(1);
57 retVO.setTotal(total);
58 }
59
60 pstmt = conn.prepareStatement(stLIST_MEMBER);
61 rs = pstmt.executeQuery();
62 Vector list = new Vector();
63 while(rs.next()){
64 DetailVO tempVO = new DetailVO
65 (rs.getString("id"),
66 rs.getString("password"),
67 rs.getString("name"));
68 list.addElement(tempVO);
69 }
70 retVO.setList(list);
71 rs.close();
72 stmt.close();
73 pstmt.close();
74 conn.close();
75 }catch (Exception e){
76 e.printStackTrace();
77 throw e;
78 }
79 return retVO;
80 }
81
82 public int login(String id, String inputPass)
83 throws Exception {
84 PreparedStatement pstmt = null;
85 ResultSet rs = null;
86 int result = 0;
87 try {
88 Connection conn = ds.getConnection();
89 pstmt = conn.prepareStatement(stCHECK_LOGIN);
90 pstmt.setString(1,id);
91
92 rs = pstmt.executeQuery();
93 if(rs.next()){
94 String dbPass = rs.getString(1);
95 if(dbPass.equals(inputPass)){
96 result = 0;
97 }else {
98 result = 1;
99 }
100 }else {
101 result = 2;
102 }
103 rs.close();
104 pstmt.close();
105 conn.close();
106 }catch (Exception e){
107 e.printStackTrace();
108 throw e;
109 }
110 return result;
111 }
112 }
JDBC 트랜잭션 처리
AutoCommitTest.java
01 import java.sql.*; 02 03 public class AutoCommitTest { 05 public static void main(String args[]){ 06 Connection con = null; 07 PreparedStatement ps = null; 08 int sequence = 0; 09 String subject = null; 10 String contents = null; 11 12 try { 13 if(args[0] != null 14 && args[1] != null 15 && args[2] != null){ 16 sequence = Integer.parseInt(args[0]); 17 subject = args[1]; 18 contents = args[2]; 19 } 20 }catch(Exception e){ 21 System.out.println 22 ("데이터베이스 내의 테이블에 존재하는 " 23 + "세개의 컬럼에 삽입할 데이터를 입력하세요."); 24 return; 25 } 26 27 try{ 28 String query1 = 29 " INSERT INTO TRANSACTION1 " + 30 " (sequence, subject, contents) "+ 31 " VALUES (?,?,?) "; 32 String query2 = 33 " INSERT INTO TRANSACTION2 " + 34 " (sequence, objects, contents) "+ 35 " VALUES (?,?,?) "; 36 37 Class.forName 38 ("oracle.jdbc.driver.OracleDriver"); 39 con=DriverManager.getConnection 40 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9" 41 ,"jDBC00","jDBC00"); 42 if(con.getAutoCommit()){ 43 System.out.println 44 ("현재의 Connection 은 " 45 + "자동 COMMIT 모드입니다."); 46 }else { 47 System.out.println 48 ("현재의 Connection 은 " 49 + "수동 COMMIT 모드입니다." 50 + "SQL 문장을 전송한 후에 " 51 + "commit() 이나 rollback() " 52 + "메서드를 수행하세요."); 53 } 54 55 ps = con.prepareStatement(query1); 56 ps.setInt(1,sequence); 57 ps.setString(2,subject); 58 ps.setString(3,contents); 59 ps.executeUpdate(); 60 ps = con.prepareStatement(query2); 61 ps.setInt(1,sequence); 62 ps.setString(2,subject); 63 ps.setString(3,contents); 64 ps.executeUpdate(); 65 System.out.println 66 ("두개의 테이블에 데이터 삽입이" 67 + "완료되었습니다." 68 + "SQL*PLUS 툴을 이용하여" 69 + "삽입된 결과를 확인해보세요."); 70 71 ps.close(); 72 con.close(); 73 }catch(Exception e){ 74 System.out.println 75 ("Exception이 발생했습니다." 76 + " 자세한 내용은 다음과 같습니다."); 77 System.out.println(e.toString()); 78 }finally { 79 try{ 80 if(ps != null) ps.close(); 81 if(con != null) con.close(); 82 }catch(Exception e){} 83 } 84 } 85 } |
위 예제에서는 하나의 테이블에 데이터가 삽입되지 못하더라도 이전에 수행한 테이블의 삽입 문장은 정상적으로 수행되어 결과적으로 하나의 테이블에만 데이터가 삽입되는 결과를 초래함.
왜냐하면 두개의 INSERT 문장이 실행되자 마자 서로 다른 트랜잭션으로 자동 COMMIT 되었기 때문
다음 예제는 두 개의 INSERT 문을 하나의 트랜잭션으로 처리
ExplicitCommitTest.java
01 import java.sql.*; 02 03 public class ExplicitCommitTest { 04 05 public static void main(String args[]){ 06 Connection con = null; 07 PreparedStatement ps = null; 08 int sequence = 0; 09 String subject = null; 10 String contents = null; 11 12 try { 13 if(args[0] != null 14 && args[1] != null 15 && args[2] != null){ 16 sequence = Integer.parseInt(args[0]); 17 subject = args[1]; 18 contents = args[2]; 19 } 20 }catch(Exception e){ 21 System.out.println 22 ("데이터베이스 내의 테이블에 존재하는 " 23 + "세개의 컬럼에 삽입할 데이터를 입력하세요."); 24 return; 25 } 26 27 try{ 28 String query1 = 29 " INSERT INTO TRANSACTION1 " + 30 " (sequence, subject, contents) "+ 31 " VALUES (?,?,?) "; 32 String query2 = 33 " INSERT INTO TRANSACTION2 " + 34 " (sequence, objects, contents) "+ 35 " VALUES (?,?,?) "; 36 37 Class.forName 38 ("oracle.jdbc.driver.OracleDriver"); 39 con=DriverManager.getConnection 40 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9" 41 ,"jDBC00","jDBC00"); 42 43 con.setAutoCommit(false); 44 if(con.getAutoCommit()){ 45 System.out.println 46 ("현재의 Connection 은 " 47 + "자동 COMMIT 모드입니다."); 48 }else { 49 System.out.println 50 ("현재의 Connection 은 " 51 + "수동 COMMIT 모드입니다." 52 + "SQL 문장을 전송한 후에 " 53 + "commit() 이나 rollback() " 54 + "메서드를 수행하세요."); 55 } 56 57 ps = con.prepareStatement(query1); 58 ps.setInt(1,sequence); 59 ps.setString(2,subject); 60 ps.setString(3,contents); 61 ps.executeUpdate(); 62 ps = con.prepareStatement(query2); 63 ps.setInt(1,sequence); 64 ps.setString(2,subject); 65 ps.setString(3,contents); 66 ps.executeUpdate(); 67 68 con.commit(); 69 System.out.println 70 ("두개의 테이블에 데이터 삽입이" 71 + "완료되었습니다." 72 + "SQL*PLUS 툴을 이용하여" 73 + "삽입된 결과를 확인해보세요."); 74 75 ps.close(); 76 con.close(); 77 }catch(Exception e){ 78 try{ 79 con.rollback(); 80 }catch(SQLException se){} 81 System.out.println 82 ("Exception이 발생했습니다.\n" 83 + "실행된 두개의 INSERT 문장은 " 84 + "ROLLBACK 처리되었습니다.\n" 85 + " 자세한 내용은 다음과 같습니다."); 86 System.out.println(e.toString()); 87 88 }finally { 89 try{ 90 if(ps != null) ps.close(); 91 if(con != null) con.close(); 92 }catch(Exception e){} 93 } 94 } 95 } |
JDBC ResultSet의 인터페이스 실습
DataSelect.java
01 import java.sql.*; 02 03 public class DataSelect{ 04 Connection con = null; 05 Statement stmt = null; 06 07 public static void main (String args []) { 08 DataSelect ds = new DataSelect(); 09 ds.connect(); 10 ds.select(); 11 ds.close(); 12 } 13 14 public void connect(){ 15 try{ 16 Class.forName("oracle.jdbc.driver.OracleDriver"); 17 con = DriverManager.getConnection 18 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9", 19 "jdbc00","jdbc00"); 20 System.out.println("데이터베이스 연결되었습니다."); 21 }catch(ClassNotFoundException e){ 22 System.out.println("JDBC Driver load fail!!!"); 23 }catch(SQLException e){ 24 System.out.println("Connection fail!!!"); 25 e.printStackTrace(); 26 } 27 } 28 29 public void close(){ 30 try{ 31 con.close(); 32 System.out.println("데이터베이스 연결 해제되었습니다."); 33 }catch(SQLException e){ 34 System.out.println("Connection fail!!!"); 35 e.printStackTrace(); 36 }finally{ 37 try{ 38 if(con != null) con.close(); 39 }catch(SQLException e){} 40 } 41 } 42 43 public void select(){ 44 try{ 45 stmt = con.createStatement (); 46 String query = "select * from emp"; 47 ResultSet rs = stmt.executeQuery(query); 48 while(rs.next()){ 49 int id = rs.getInt("id"); 50 String result = "ID : " + id + "\t"; 51 String name = "이름 : " + rs.getString(2) + "\t"; 52 result += name; 53 double bonus = rs.getDouble(3); 54 result += "BONUS : " + bonus + "\t"; 55 Date inDate = rs.getDate(4); 56 result += "입사일 : " + inDate + "\t"; 57 String dept = "부서 : " + rs.getString(5) + "\t"; 58 result += dept; 59 System.out.println(result); 60 } 61 System.out.println("emp 테이블의 데이터가 조회되었습니다."); 62 stmt.close(); 63 }catch(SQLException e){ 64 e.printStackTrace(); 65 }finally { 66 try{ 67 if(stmt != null) stmt.close(); 68 }catch(SQLException e){} 69 } 70 } 71 } |
JDBC Statement 인터페이스
1. SQL 전송 메서드
executeUpdate() |
데이터베이스에 변경을 가하는 SQL문장을 실행할 때 이용 |
|
SELECT 문을 제외한 DML과 DDL문의 전송이 가능하고, 전송 후에는 int 타입으로 변경된 레코드의 수가 리턴되는데, 이 때, DDL문의 경우에는 0이 리턴 |
executeQuery() |
SELECT 문장처럼 데이터를 조회한 결과를 얻으려 할 때 이용 |
|
ResultSet 반환 |
Execute() |
SQL문의 종류에 상관없이 모든 종류의 SQL문을 실행 |
|
True 반환 시, ResultSet이 리턴된다는 의미이므로 getResultSet() 메소더를 이용하여 ResultSet을 리턴받음 False 반환 시, 변경된 행의 개수가 리턴된다는 의미이므로 getUpdateCount() 메서드를 이용하여 변경된 행의 개수를 리턴받음 |
executeBatch() |
JDBC 2.0 버전부터 추가 addBatch() 메서드를 이용하여 배치로 처리할 SQL 문장을 묶고, 일괄적으로 데이터베이스로 전송하여 처리하는 메소드임 executeUpdate()를 여러 번 실행하는 것과 유사 |
|
int 배열을 리턴 – 배열 내에는 배치처리에 의해 실행된 각각의 SQL 문에 의해 변경된 레코드 수를 저장함 ex) 배치처리할 SQL문이 4개였다면 리턴되는 int 배열의 길이도 4 |
2. Java와 SQL 타입 비교
SQL Type |
Java Type |
CHAR |
String |
VARCHAR |
String |
LONGVARCHAR |
java.io.InputStream |
NUMERIC |
java.sql.Numeric |
DECIMAL |
java.sql.Numeric |
BIT |
Boolean |
TINYINT |
byte |
SMALLINT |
short |
INTEGER |
int |
BIGINT |
long |
REAL |
float |
FLOAT |
float |
DOUBLE |
double |
BINARY |
byte[] |
LONGBINARY |
java.sql.InputStream |
DATE |
java.sql.Date |
TIME |
java.sql.Time |
TIMESTAMP |
java.sql.Timestamp |
BLOB |
java.sql.Blob |
CLOB |
java.sql.Clob |
3. Statement 이용 예제
아래 테이블 생성
id |
NUMBER(5) |
name |
VARCHAR2(25) |
bonus |
NUMBER(7,2) |
In_date |
DATE |
Dept_name |
VARCHAR2(25) |
01 import java.sql.*; 02 03 public class TableCreate{ 04 Connection con = null; 05 Statement stmt = null; 06 07 public static void main (String args []) { 08 TableCreate tc = new TableCreate(); 09 tc.connect(); 10 tc.createTable(); 11 tc.close(); 12 } 13 14 public void connect(){ 15 try{ 16 Class.forName("oracle.jdbc.driver.OracleDriver"); 17 con = DriverManager.getConnection 18 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9", 19 "jdbc00","jdbc00"); 20 System.out.println("데이터베이스 연결되었습니다."); 21 }catch(ClassNotFoundException e){ 22 System.out.println("JDBC Drvier load fail!!!"); 23 }catch(SQLException e){ 24 System.out.println("Connection fail!!!"); 25 e.printStackTrace(); 26 } 27 } 28 29 public void close(){ 30 try{ 31 con.close(); 32 System.out.println("데이터베이스 연결 해제되었습니다."); 33 }catch(SQLException e){ 34 System.out.println("Connection fail!!!"); 35 e.printStackTrace(); 36 }finally{ 37 try{ 38 if(con != null) con.close(); 39 }catch(SQLException e){} 40 } 41 } 42 43 public void createTable(){ 44 try{ 45 stmt = con.createStatement (); 46 String query = "CREATE TABLE emp "; 47 query += "(id NUMBER(5) , "; 48 query += "name VARCHAR2(25) , "; 49 query += "bonus NUMBER(7,2) , "; 50 query += "in_date DATE, "; 51 query += "dept_name VARCHAR2(25))" ; 52 int rowcount = stmt.executeUpdate(query); 53 System.out.println("테이블 생성이 완료되었습니다."); 54 stmt.close(); 55 }catch(SQLException e){ 56 e.printStackTrace(); 57 }finally { 58 try{ 59 if(stmt != null) stmt.close(); 60 }catch(SQLException e){} 61 } 62 } 63 } |
4. emp 테이블에 데이터를 삽입하는 예제
01 import java.sql.*; 02 03 public class DataInsert{ 04 Connection con = null; 05 Statement stmt = null; 06 07 public static void main (String args []) { 08 DataInsert di = new DataInsert(); 09 di.connect(); 10 di.insert(); 11 di.close(); 12 } 13 14 public void connect(){ 15 try{ 16 Class.forName("oracle.jdbc.driver.OracleDriver"); 17 con = DriverManager.getConnection 18 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9", 19 "jdbc00","jdbc00"); 20 System.out.println("데이터베이스 연결되었습니다."); 21 }catch(ClassNotFoundException e){ 22 System.out.println("JDBC Driver load fail!!!"); 23 }catch(SQLException e){ 24 System.out.println("Connection fail!!!"); 25 e.printStackTrace(); 26 } 27 } 28 29 public void close(){ 30 try{ 31 con.close(); 32 System.out.println("데이터베이스 연결 해제되었습니다."); 33 }catch(SQLException e){ 34 System.out.println("Connection fail!!!"); 35 e.printStackTrace(); 36 }finally{ 37 try{ 38 if(con != null) con.close(); 39 }catch(SQLException e){} 40 } 41 } 42 43 public void insert(){ 44 try{ 45 stmt = con.createStatement (); 46 String query = "insert into emp values("; 47 query += "00001,' 48 query += "TO_DATE(' 49 int rowcount = stmt.executeUpdate(query); 50 query = "insert into emp values("; 51 query += "00002,'심청이',75000.00,"; 52 query += "TO_DATE(' 53 rowcount += stmt.executeUpdate(query); 54 query = "insert into emp values("; 55 query += "00003,'대장금',80000.00,"; 56 query += "TO_DATE(' 57 rowcount += stmt.executeUpdate(query); 58 System.out.println 59 ("emp 테이블에" + rowcount + " 개의 데이터가 삽입되었습니다."); 60 stmt.close(); 61 }catch(SQLException e){ 62 e.printStackTrace(); 63 }finally { 64 try{ 65 if(stmt != null) stmt.close(); 66 }catch(SQLException e){} 67 } 68 } 69 } |
5. emp 테이블의 모든 데이터를 조회
01 import java.sql.*; 02 03 public class DataSelect{ 04 Connection con = null; 05 Statement stmt = null; 06 07 public static void main (String args []) { 08 DataSelect ds = new DataSelect(); 09 ds.connect(); 10 ds.select(); 11 ds.close(); 12 } 13 14 public void connect(){ 15 try{ 16 Class.forName("oracle.jdbc.driver.OracleDriver"); 17 con = DriverManager.getConnection 18 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9", 19 "jdbc00","jdbc00"); 20 System.out.println("데이터베이스 연결되었습니다."); 21 }catch(ClassNotFoundException e){ 22 System.out.println("JDBC Driver load fail!!!"); 23 }catch(SQLException e){ 24 System.out.println("Connection fail!!!"); 25 e.printStackTrace(); 26 } 27 } 28 29 public void close(){ 30 try{ 31 con.close(); 32 System.out.println("데이터베이스 연결 해제되었습니다."); 33 }catch(SQLException e){ 34 System.out.println("Connection fail!!!"); 35 e.printStackTrace(); 36 }finally{ 37 try{ 38 if(con != null) con.close(); 39 }catch(SQLException e){} 40 } 41 } 42 43 public void select(){ 44 try{ 45 stmt = con.createStatement (); 46 String query = "select * from emp"; 47 ResultSet rs = stmt.executeQuery(query); 48 System.out.println("emp 테이블의 데이터가 조회되었습니다."); 49 stmt.close(); 50 }catch(SQLException e){ 51 e.printStackTrace(); 52 }finally { 53 try{ 54 if(stmt != null) stmt.close(); 55 }catch(SQLException e){} 56 } 57 } 58 } |
6. 실습
l emp 테이블에서 이름이 ‘
l 따라서, name이 ‘
l 이어서, ‘대장금’이라는 사람이 회사를 퇴사하였다고 가정하고, name이 ‘대장금’인 데이터를 emp 테이블에서 삭제하는 예를 구현
01 import java.sql.*; 02 03 public class DataUpdateDelete{ 04 Connection con = null; 05 Statement stmt = null; 06 07 public static void main (String args []) { 08 DataUpdateDelete dud = new DataUpdateDelete(); 09 dud.connect(); 10 dud.updateDelete(); 11 dud.close(); 12 } 13 14 public void connect(){ 15 try{ 16 Class.forName("oracle.jdbc.driver.OracleDriver"); 17 con = DriverManager.getConnection 18 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9", 19 "jdbc00","jdbc00"); 20 System.out.println("데이터베이스 연결되었습니다."); 21 }catch(ClassNotFoundException e){ 22 System.out.println("JDBC Driver load fail!!!"); 23 }catch(SQLException e){ 24 System.out.println("Connection fail!!!"); 25 e.printStackTrace(); 26 } 27 } 28 29 public void close(){ 30 try{ 31 con.close(); 32 System.out.println("데이터베이스 연결 해제되었습니다."); 33 }catch(SQLException e){ 34 System.out.println("Connection fail!!!"); 35 e.printStackTrace(); 36 }finally{ 37 try{ 38 if(con != null) con.close(); 39 }catch(SQLException e){} 40 } 41 } 42 43 public void updateDelete(){ 44 try{ 45 stmt = con.createStatement (); 46 String query = "update emp set dept_name = '정보부' "; 47 query += "where name = ' 48 int rowcount = stmt.executeUpdate(query); 49 System.out.println 50 ("emp 테이블에서 " + rowcount 51 + " 건의 데이터가 수정되었습니다."); 52 query = "delete emp where name = '대장금'"; 53 rowcount = stmt.executeUpdate(query); 54 System.out.println 55 ("emp 테이블에서 " + rowcount 56 + " 건의 데이터가 삭제되었습니다."); 57 stmt.close(); 58 }catch(SQLException e){ 59 e.printStackTrace(); 60 }finally { 61 try{ 62 if(stmt != null) stmt.close(); 63 }catch(SQLException e){} 64 } 65 } 66 } |
7. 예제
01 import java.sql.*; 02 03 public class ExecuteTest{ 04 Connection con = null; 05 Statement stmt = null; 06 07 public static void main (String args []) { 08 if(args.length < 1) 09 System.out.print 10 ("사용법 : java ExecuteTest "); 11 System.out.println 12 (" 실행할SQL문종류(insert or select)"); 13 ExecuteTest et = new ExecuteTest(); 14 et.connect(); 15 et.test(args[0]); 16 et.close(); 17 } 18 19 public void connect(){ 20 try{ 21 Class.forName("oracle.jdbc.driver.OracleDriver"); 22 con = DriverManager.getConnection 23 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9", 24 "jdbc00","jdbc00"); 25 System.out.println("데이터베이스 연결되었습니다."); 26 }catch(ClassNotFoundException e){ 27 System.out.println("JDBC Driver load fail!!!"); 28 }catch(SQLException e){ 29 System.out.println("Connection fail!!!"); 30 e.printStackTrace(); 31 } 32 } 33 34 public void close(){ 35 try{ 36 con.close(); 37 System.out.println("데이터베이스 연결 해제되었습니다."); 38 }catch(SQLException e){ 39 System.out.println("Connection fail!!!"); 40 e.printStackTrace(); 41 }finally{ 42 try{ 43 if(con != null) con.close(); 44 }catch(SQLException e){} 45 } 46 } 47 48 public void test(String sql){ 49 try{ 50 String query = null; 51 int rowcount = 0; 52 ResultSet rs = null; 53 stmt = con.createStatement (); 54 if(sql.equals("insert") || sql.equals("INSERT")){ 55 query = "insert into emp values("; 56 query += "00004,' 57 query += "TO_DATE(' 58 }else if(sql.equals("select") || sql.equals("SELECT")){ 59 query = "select * from emp"; 60 } 61 boolean flag = stmt.execute(query); 62 if(flag) { 63 rs = stmt.getResultSet(); 64 System.out.println 65 ("emp 테이블의 모든 데이터를 조회하였습니다."); 66 rs.close(); 67 } 68 else { 69 rowcount = stmt.getUpdateCount(); 70 System.out.print 71 ("emp 테이블에" + rowcount ); 72 System.out.println 73 (" 개의 데이터가 삽입되었습니다."); 74 } 75 stmt.close(); 76 }catch(SQLException e){ 77 e.printStackTrace(); 78 }finally { 79 try{ 80 if(stmt != null) stmt.close(); 81 }catch(SQLException e){} 82 } 83 } 84 } |
8. 예제
01 import java.sql.*; 02 03 public class BatchTest{ 04 Connection con = null; 05 Statement stmt = null; 06 07 public static void main (String args []) { 08 BatchTest bt = new BatchTest(); 09 bt.connect(); 10 bt.insertBatch(); 11 bt.close(); 12 } 13 14 public void connect(){ 15 try{ 16 Class.forName("oracle.jdbc.driver.OracleDriver"); 17 con = DriverManager.getConnection 18 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9", 19 "jdbc00","jdbc00"); 20 System.out.println("데이터베이스 연결되었습니다."); 21 }catch(ClassNotFoundException e){ 22 System.out.println("JDBC Driver load fail!!!"); 23 }catch(SQLException e){ 24 System.out.println("Connection fail!!!"); 25 e.printStackTrace(); 26 } 27 } 28 29 public void close(){ 30 try{ 31 con.close(); 32 System.out.println("데이터베이스 연결 해제되었습니다."); 33 }catch(SQLException e){ 34 System.out.println("Connection fail!!!"); 35 e.printStackTrace(); 36 }finally{ 37 try{ 38 if(con != null) con.close(); 39 }catch(SQLException e){} 40 } 41 } 42 43 public void insertBatch(){ 44 try{ 45 stmt = con.createStatement (); 46 String query ="insert into emp values("; 47 query += "00005,' 48 query += "TO_DATE(' 49 stmt.addBatch(query); 50 query = "insert into emp values("; 51 query += "00006,' 52 query += "TO_DATE(' 53 stmt.addBatch(query); 54 query = "insert into emp values("; 55 query += "00005,' 56 query += "TO_DATE(' 57 stmt.addBatch(query); 58 int [] rowcount = stmt.executeBatch(); 59 for(int i = 0; i < rowcount.length; i++){ 60 System.out.print 61 ("배치작업에 의해 " + rowcount[i] ); 62 System.out.println 63 (" 개의 데이터가 삽입되었습니다."); 64 } 65 stmt.close(); 66 }catch(SQLException e){ 67 e.printStackTrace(); 68 }finally { 69 try{ 70 if(stmt != null) stmt.close(); 71 }catch(SQLException e){} 72 } 73 } 74 } |
JDBC Connection 생성
Driver Name |
Example |
JDBC-ODBC Bridge JDK 기본드라이버 |
Class.forName(“sun.jdbc.odbc.jdbcOdbc Driver”); |
Oracle |
Class.forName(“oracle.jdbc.driver.Oracle Driver”); |
mSQL |
Class.forName(“imaginary.sql.iMsql Driver”); |
MySQL |
Class.forName(“org.git.mm.mysql. Driver”); |
SyBase |
Class.forName(“com.sybase.jdbc2.jdbc.Syb Driver”); |
Informix |
Class.forName(“com.informix.jdbc.Ifx Driver”); |
2. 해당 데이터 베이스 접속
try {
// URL, ID, Password
Connection con = DriverManager.getConnection("jdbc:orcle:thin:@70.12.220.33:1521:ora9", "scott", "tiger");
} catch(SQLException e){
System.out.println("Connection fail!!!");
}
3. JDBC UL 기술 정보
드라이버 Name |
URL |
JDBC-ODBC Bridge |
Jdbc:odbc:[;=] |
Oracle |
OCI URL Type |
Jdbc:oracle:oci:<userid>/<password>@<dbname> Jdbc:oracle:oci:<userid>/<password>@<tns-name-value-pair> | |
Thin URLType | |
Jdbc.oracle:thin:<userid>/<password>@<host>:<port>:<dbname> Jdbc:orcle:thin:<userid>/<password>@<tns-name-value-pair> | |
mSQL |
Jdbc:msql://<hostname>:<port>/<dbname> |
MySQL |
Jdbc:mysql://<hostname>:<port>/<dbname> |
SyBase |
Jdbc:Sybase:Tds:<ip>:<port> |
Informix |
Jdbc:Informix-sqli://<ip>:<port>/<dbname>:INFORMIXSERVER |
Postgres |
Jdbc:postgresql://<ip>:<port>/<dbname> |
4. Connection 인터페이스의 메소드들
# SQL문을 생성하여 전송하거나 PL/SQL 블록을 활용하기 위한 메소드
: createStatement(), prepareStatement(), prepareCall(),
# 기본 연결 정보를 바탕으로 transaction 처리에 관한 메소드
: getAutoCommit(), setAutoCommit(), commit(), rollback()
-> 기본 설정은 setAutoCommit(true) 상태이므로 auto-commit 상태임
# 기본적인 Error나 Warning을 처리하기 위한 메소드
: claerWarnings(), getWarnings()
# Connection 객체 사용 후 닫기를 위한 메소드
: close(), isClosed()
-> 연결을 해제하면서 연결에 사용된 모든 변수나 메모리 자원을 반납하는 과정으로 이 메서드 호출 이전에
JDBC Program에서 사용했던 ResultSet객체나 Statement 객체의 close() 메서드를 먼저 호출하여
객체를 가비지 콜렉션한 다음 Connection 객체의 close() 메서드를 호출하여야 함.
5. 예제
Oracle 9i 데이터베이스에 연결
01 import java.sql.*; 02 03 class ConnectionTest{ 04 public static void main(String args[]){ 05 Connection con = null; 06 try{ 07 Class.forName("oracle.jdbc.driver.OracleDriver"); 08 con = DriverManager.getConnection 09 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9", 10 "jdbc00","jdbc00"); 11 System.out.println("데이터베이스 연결 성공했습니다."); 12 con.close(); 13 }catch(ClassNotFoundException e){ 14 System.out.println("JDBC Drvier load fail!!!"); 15 }catch(SQLException e){ 16 System.out.println("Connection fail!!!"); 17 e.printStackTrace(); 18 } 19 finally{ 20 try{ 21 if(con != null) con.close(); 22 }catch(SQLException e){} 23 } 24 } 25 } |
6. Log4J를 이용한 출력 결과
import java.sql.*; import org.apache.log4j.*; class ConnectionTest_Log{ /* Logger 클래스의 인스턴스를 생성합니다. SimpleLog.class의 객체가 이미 생성되어 있다면 생성되어 있는 객체가 반환된다. 객체가 생성되어 있지 않다면 새로운 객체를 생성한다. */ static Logger logger = Logger.getLogger(ConnectionTest_Log.class); public static void main(String args[]) { /* 화면 콘솔로 로그 출력을 하기 위한 간단한 설정입니다. %p : 로그 이벤트 레벨을 출력하는 패턴을 설정합니다. [%l%] : 로그 이벤트가 발생한 자바 소스 파일 이름, 로그 이벤트가 발생한 소스 라인, 메서드 이름을 출력하는 패턴을 설정. -%m%n : 로그 이벤트 출력 메서드에서 지정한 문자열을 출력하는 패턴을 설정합니다. */ String pattern = "%p [%l] - %m%n"; PatternLayout layout = new PatternLayout(pattern); ConsoleAppender console = new ConsoleAppender(layout); BasicConfigurator.configure(console); Connection con = null; try { Class.forName("oracle.jdbc.driver.OracleDriver"); con = DriverManager.getConnection( "jdbc:oracle:thin:@127.0.0.1:1521:ora9", "jdbc00", "jdbc00"); /* 로그 이벤트 레벨 중 INFO 로그 레벨로 지정된 문자열 내용을 출력합니다. */ logger.info("데이터베이스 연결 성공했습니다."); con.close(); } catch(ClassNotFoundException e){ /* 로그 이벤트 레벨 중 ERROR 로그 레벨로 지정된 문자열 내용을 출력합니다. */ logger.error("JDBC Driver load fail!!!"); }catch(SQLException e) { /* 로그 이벤트 레벨 중 ERROR 로그 레벨로 지정된 문자열 내용을 출력합니다. */ logger.error("Connection fail!!!"); } finally{ try{ if(con != null) con.close(); } ctch(SQLException e) { } } } } |
오타가 있을수 있음.
JDBC 드라이버의 한글 처리
자바 프로그램이 사용하는 인코딩은 유니코드 2.0 이고 데이터베이스는 그 종류에 따라 KSC5601, UTF8, 8859-1 등의 인코딩을 사용. 따라서, JDBC 드라이버는 데이터베이스 전송시 자바 프로그램과 해당 데이터베이스 간의 인코딩을 변환해야 할 필요가 있음.
Oracle 드라이버의 문사셋 환경
데이터베이스 문자셋이 "US77ASCII"나 "WE8ISO8859P1" 일 때와 "KO16KSC5601"일 때 다음과 같이 달라 질 수 있음.
1. 데이터베이스 문자셋이 "US7ASCII"나 WE8ISO8859P1"이라면 JDBC 드라이버가 데이터를 무조건 "UTF16"로 변환시킨 후 이것을 클라이언트측의 JDBC PROGRAM에 전달
2. 데이터베이스의 문자셋이 "KO16KSC5602"이라면, 먼저 데이터를 "UTF8"으로 변환한 후 "UTF16"로 다시 변환해서 데이터를 JDBC 프로그램에 넘겨줌. 이렇게 하기 위해서는 클라이언트의 NLS_LANG 환경변수가 "US7ASCII"나 "WE8ISO8859P1"이 아닌 값으로 설정이 되어야 한다. 그래서, orcal oci 드라이버는 클라이언트의 NLS_LANG을 "KO16KSC5601"이나 "UTF8"로 설정하면 JDBC 드라이버가 데이터를 "UTF8"로 변환한 후에 다시 "UTF16"으로 변환해서 JDBC 프로그램에 데이터를 전달한다.
* Oracle thin 드라이버의 경우에는 클라이언트의 환경과 상관없이 데이터베이스의 문자셋이 "KO16KSC5601"로만 설정되어 있으면 한글을 이용하는 데 큰 문제가 없음. 이럴 경우 JDBC PROGRAM에서 데이터베이스로 한글 데이터 전송시에는 해당 한글을 UTF8로 인코딩하면서 크기가 많이 증가하고 이러한 문자를 받은 Oracle 데이터베이스는 상당히 큰 크기의 문자를 전달받게 된다.
ex) varchar2(10)의 길이로 만들어진 컬럼에 JDBC 프로그램을 통하여 '가나다라마'라는 데이터를 만들어서 JDBC 드라이버를 거쳐서 데이터베이스로 전달하는 경우, 데이터베이스의 varchar2(10)의 길이로 만들어진 컬럼에는 '가나다라마'라는 데이터 크기가 너무 커서 삽입할 수 없다는 오류를 볼 수 있다.
이런 경우 다음과 같이 문자셋을 변환해 넣어주면 정상으로 동장
String name = "가나다라마";
String name_KS = new String(name.getBytes("8859_1"), "KSC5601");
이렇게 문자셋을 설정하여 변경하면 "UTF8"로 변환되는 과정을 막으므로 해당 쿼리가 에러 없이 정상으로 실행된다. 하지만 한글이 1300자 내외를 넘을 경우에는 CLOB이라는 데이터 Type을 사용할 수 있음.
JDBC 드라이버의 Type에 따른 분류
드라이버 Type |
순수 Java 구현 |
NETWORK PROTOCOL |
TYPE 1 JDBC-ODBC bridge driver |
No (ODBC 드라이버 필요) |
Direct |
TYPE 2 Native-API partly Java driver |
No (C, C++ 라이브러리 포함) |
Direct |
TYPE 3 JDBC-NET Protocol All Java Driver |
Yes(애플릿 사용 가능) |
Connector 요구 (데이터베이스와 미들웨어 서버간) |
TYPE 4 Native-protocol pure java driver |
Yes(애플릿 사용 가능) |
direct |
- Keyword
JDBC-ODBC Bridge Driver; Native_API/Partly java driver; Net-protocol/all-java driver; Native-protocol/all-java driver
[ADO 2.8] HelloData Code
'BeginHelloData Option Explicit Dim m_oRecordset As ADODB.Recordset Dim m_sConnStr As String Dim m_flgPriceUpdated As Boolean Private Sub cmdGetData_Click() GetData If Not m_oRecordset Is Nothing Then If m_oRecordset.State = adStateOpen Then ' Set the proper states for the buttons. cmdGetData.Enabled = False cmdExamineData.Enabled = True End If End If End Sub Private Sub cmdExamineData_Click() ExamineData End Sub Private Sub cmdEditData_Click() EditData End Sub Private Sub cmdUpdateData_Click() UpdateData ' Set the proper states for the buttons. cmdUpdateData.Enabled = False End Sub Private Sub GetData() On Error GoTo GetDataError Dim sSQL As String Dim oConnection1 As ADODB.Connection m_sConnStr = "Provider='SQLOLEDB';Data Source='MySqlServer';" & _ "Initial Catalog='Northwind';Integrated Security='SSPI';" ' Create and Open the Connection object. Set oConnection1 = New ADODB.Connection oConnection1.CursorLocation = adUseClient oConnection1.Open m_sConnStr sSQL = "SELECT ProductID, ProductName, CategoryID, UnitPrice " & _ "FROM Products" ' Create and Open the Recordset object. Set m_oRecordset = New ADODB.Recordset m_oRecordset.Open sSQL, oConnection1, adOpenStatic, _ adLockBatchOptimistic, adCmdText m_oRecordset.MarshalOptions = adMarshalModifiedOnly ' Disconnect the Recordset. Set m_oRecordset.ActiveConnection = Nothing oConnection1.Close Set oConnection1 = Nothing ' Bind Recordset to the DataGrid for display. Set grdDisplay1.DataSource = m_oRecordset Exit Sub GetDataError: If Err <> 0 Then If oConnection1 Is Nothing Then HandleErrs "GetData", m_oRecordset.ActiveConnection Else HandleErrs "GetData", oConnection1 End If End If If Not oConnection1 Is Nothing Then If oConnection1.State = adStateOpen Then oConnection1.Close Set oConnection1 = Nothing End If End Sub Private Sub ExamineData() On Err GoTo ExamineDataErr Dim iNumRecords As Integer Dim vBookmark As Variant iNumRecords = m_oRecordset.RecordCount DisplayMsg "There are " & CStr(iNumRecords) & _ " records in the current Recordset." ' Loop through the Recordset and print the ' value of the AbsolutePosition property. DisplayMsg "****** Start AbsolutePosition Loop ******" Do While Not m_oRecordset.EOF ' Store the bookmark for the 3rd record, ' for demo purposes. If m_oRecordset.AbsolutePosition = 3 Then _ vBookmark = m_oRecordset.Bookmark DisplayMsg m_oRecordset.AbsolutePosition m_oRecordset.MoveNext Loop DisplayMsg "****** End AbsolutePosition Loop ******" & vbCrLf ' Use our bookmark to move back to 3rd record. m_oRecordset.Bookmark = vBookmark MsgBox vbCr & "Moved back to position " & _ m_oRecordset.AbsolutePosition & " using bookmark.", , _ "Hello Data" ' Display meta-data about each field. See WalkFields() sub. Call WalkFields ' Apply a filter on the type field. MsgBox "Filtering on type field. (CategoryID=2)", _ vbOKOnly, "Hello Data" m_oRecordset.Filter = "CategoryID=2" ' Set the proper states for the buttons. cmdExamineData.Enabled = False cmdEditData.Enabled = True Exit Sub ExamineDataErr: HandleErrs "ExamineData", m_oRecordset.ActiveConnection End Sub Private Sub EditData() On Error GoTo EditDataErr 'Recordset still filtered on CategoryID=2. 'Increase price by 10% for filtered records. MsgBox "Increasing unit price by 10%" & vbCr & _ "for all records with CategoryID = 2.", , "Hello Data" m_oRecordset.MoveFirst Dim cVal As Currency Do While Not m_oRecordset.EOF cVal = m_oRecordset.Fields("UnitPrice").Value m_oRecordset.Fields("UnitPrice").Value = (cVal * 1.1) m_oRecordset.MoveNext Loop ' Set the proper states for the buttons. cmdEditData.Enabled = False cmdUpdateData.Enabled = True Exit Sub EditDataErr: HandleErrs "EditData", m_oRecordset.ActiveConnection End Sub Private Sub UpdateData() On Error GoTo UpdateDataErr Dim oConnection2 As New ADODB.Connection MsgBox "Removing Filter (adFilterNone).", , "Hello Data" m_oRecordset.Filter = adFilterNone Set grdDisplay1.DataSource = Nothing Set grdDisplay1.DataSource = m_oRecordset MsgBox "Applying Filter (adFilterPendingRecords).", , "Hello Data" m_oRecordset.Filter = adFilterPendingRecords Set grdDisplay1.DataSource = Nothing Set grdDisplay1.DataSource = m_oRecordset DisplayMsg "*** PRE-UpdateBatch values for 'UnitPrice' field. ***" ' Display Value, UnderlyingValue, and OriginalValue for ' type field in first record. If m_oRecordset.Supports(adMovePrevious) Then m_oRecordset.MoveFirst DisplayMsg "OriginalValue = " & _ m_oRecordset.Fields("UnitPrice").OriginalValue DisplayMsg "Value = " & _ m_oRecordset.Fields("UnitPrice").Value End If oConnection2.ConnectionString = m_sConnStr oConnection2.Open Set m_oRecordset.ActiveConnection = oConnection2 m_oRecordset.UpdateBatch m_flgPriceUpdated = True DisplayMsg "*** POST-UpdateBatch values for 'UnitPrice' field ***" If m_oRecordset.Supports(adMovePrevious) Then m_oRecordset.MoveFirst DisplayMsg "OriginalValue = " & _ m_oRecordset.Fields("UnitPrice").OriginalValue DisplayMsg "Value = " & _ m_oRecordset.Fields("UnitPrice").Value End If MsgBox "See value comparisons in txtDisplay.", , _ "Hello Data" 'Clean up oConnection2.Close Set oConnection2 = Nothing Exit Sub UpdateDataErr: If Err <> 0 Then HandleErrs "UpdateData", oConnection2 End If If Not oConnection2 Is Nothing Then If oConnection2.State = adStateOpen Then oConnection2.Close Set oConnection2 = Nothing End If End Sub Private Sub WalkFields() On Error GoTo WalkFieldsErr Dim iFldCnt As Integer Dim oFields As ADODB.Fields Dim oField As ADODB.Field Dim sMsg As String Set oFields = m_oRecordset.Fields DisplayMsg "****** BEGIN FIELDS WALK ******" For iFldCnt = 0 To (oFields.Count - 1) Set oField = oFields(iFldCnt) sMsg = "" sMsg = sMsg & oField.Name sMsg = sMsg & vbTab & "Type: " & GetTypeAsString(oField.Type) sMsg = sMsg & vbTab & "Defined Size: " & oField.DefinedSize sMsg = sMsg & vbTab & "Actual Size: " & oField.ActualSize grdDisplay1.SelStartCol = iFldCnt grdDisplay1.SelEndCol = iFldCnt DisplayMsg sMsg MsgBox sMsg, , "Hello Data" Next iFldCnt DisplayMsg "****** END FIELDS WALK ******" & vbCrLf 'Clean up Set oField = Nothing Set oFields = Nothing Exit Sub WalkFieldsErr: Set oField = Nothing Set oFields = Nothing If Err <> 0 Then MsgBox Err.Source & "-->" & Err.Description, , "Error" End If End Sub Private Function GetTypeAsString(dtType As ADODB.DataTypeEnum) As String ' To save space, we are only checking for data types ' that we know are present. Select Case dtType Case adChar GetTypeAsString = "adChar" Case adVarChar GetTypeAsString = "adVarChar" Case adVarWChar GetTypeAsString = "adVarWChar" Case adCurrency GetTypeAsString = "adCurrency" Case adInteger GetTypeAsString = "adInteger" End Select End Function Private Sub HandleErrs(sSource As String, ByRef m_oConnection As ADODB.Connection) DisplayMsg "ADO (OLE) ERROR IN " & sSource DisplayMsg vbTab & "Error: " & Err.Number DisplayMsg vbTab & "Description: " & Err.Description DisplayMsg vbTab & "Source: " & Err.Source If Not m_oConnection Is Nothing Then If m_oConnection.Errors.Count <> 0 Then DisplayMsg "PROVIDER ERROR" Dim oError1 As ADODB.Error For Each oError1 In m_oConnection.Errors DisplayMsg vbTab & "Error: " & oError1.Number DisplayMsg vbTab & "Description: " & oError1.Description DisplayMsg vbTab & "Source: " & oError1.Source DisplayMsg vbTab & "Native Error:" & oError1.NativeError DisplayMsg vbTab & "SQL State: " & oError1.SQLState Next oError1 m_oConnection.Errors.Clear Set oError1 = Nothing End If End If MsgBox "Error(s) occurred. See txtDisplay1 for specific information.", , _ "Hello Data" Err.Clear End Sub Private Sub DisplayMsg(sText As String) txtDisplay1.Text = (txtDisplay1.Text & vbCrLf & sText) End Sub Private Sub Form_Resize() grdDisplay1.Move 100, 700, Me.ScaleWidth - 200, (Me.ScaleHeight - 800) / 2 txtDisplay1.Move 100, grdDisplay1.Top + grdDisplay1.Height + 100, _ Me.ScaleWidth - 200, (Me.ScaleHeight - 1000) / 2 End Sub Private Sub Form_Load() cmdGetData.Enabled = True cmdExamineData.Enabled = False cmdEditData.Enabled = False cmdUpdateData.Enabled = False grdDisplay1.AllowAddNew = False grdDisplay1.AllowDelete = False grdDisplay1.AllowUpdate = False m_flgPriceUpdated = False End Sub Private Sub Form_Unload(Cancel As Integer) On Error GoTo ErrHandler: Dim oConnection3 As New ADODB.Connection Dim sSQL As String Dim lAffected As Long ' Undo the changes we've made to the database on the server. If m_flgPriceUpdated Then sSQL = "UPDATE Products SET UnitPrice=(UnitPrice/1.1) " & _ "WHERE CategoryID=2" oConnection3.Open m_sConnStr oConnection3.Execute sSQL, lAffected, adCmdText MsgBox "Restored prices for " & CStr(lAffected) & _ " records affected.", , "Hello Data" End If 'Clean up oConnection3.Close Set oConnection3 = Nothing m_oRecordset.Close Set m_oRecordset = Nothing Exit Sub ErrHandler: If Not oConnection3 Is Nothing Then If oConnection3.State = adStateOpen Then oConnection3.Close Set oConnection3 = Nothing End If If Not m_oRecordset Is Nothing Then If m_oRecordset.State = adStateOpen Then m_oRecordset.Close Set m_oRecordset = Nothing End If End Sub 'EndHelloData
출처 : http://msdn.microsoft.com/en-us/library/ms810711.aspx
Connector/ODBC Reference
23.1.6. Connector/ODBC Reference
This section provides reference material for the Connector/ODBC API, showing supported functions and methods, supported MySQL column types and the corresponding native type in Connector/ODBC, and the error codes returned by Connector/ODBC when a fault occurs.
23.1.6.1. Connector/ODBC API Reference
This section summarizes ODBC routines, categorized by functionality.
For the complete ODBC API reference, please refer to the ODBC Programer's Reference at http://msdn.microsoft.com/library/en-us/odbc/htm/odbcabout_this_manual.asp.
An application can call SQLGetInfo
function to obtain conformance information about Connector/ODBC. To obtain information about support for a specific function in the driver, an application can call SQLGetFunctions
.
Note
For backward compatibility, the Connector/ODBC 3.51 driver supports all deprecated functions.
The following tables list Connector/ODBC API calls grouped by task:
Connecting to a data source:
Function name | C/ODBC 3.51 | Standard | Purpose |
SQLAllocHandle |
Yes | ISO 92 | Obtains an environment, connection, statement, or descriptor handle. |
SQLConnect |
Yes | ISO 92 | Connects to a specific driver by data source name, user ID, and password. |
SQLDriverConnect |
Yes | ODBC | Connects to a specific driver by connection string or requests that the Driver Manager and driver display connection dialog boxes for the user. |
SQLAllocEnv |
Yes | Deprecated | Obtains an environment handle allocated from driver. |
SQLAllocConnect |
Yes | Deprecated | Obtains a connection handle |
Obtaining information about a driver and data source:
Function name | C/ODBC 3.51 | Standard | Purpose |
SQLDataSources |
No | ISO 92 | Returns the list of available data sources, handled by the Driver Manager |
SQLDrivers |
No | ODBC | Returns the list of installed drivers and their attributes, handles by Driver Manager |
SQLGetInfo |
Yes | ISO 92 | Returns information about a specific driver and data source. |
SQLGetFunctions |
Yes | ISO 92 | Returns supported driver functions. |
SQLGetTypeInfo |
Yes | ISO 92 | Returns information about supported data types. |
Setting and retrieving driver attributes:
Function name | C/ODBC 3.51 | Standard | Purpose |
SQLSetConnectAttr |
Yes | ISO 92 | Sets a connection attribute. |
SQLGetConnectAttr |
Yes | ISO 92 | Returns the value of a connection attribute. |
SQLSetConnectOption |
Yes | Deprecated | Sets a connection option |
SQLGetConnectOption |
Yes | Deprecated | Returns the value of a connection option |
SQLSetEnvAttr |
Yes | ISO 92 | Sets an environment attribute. |
SQLGetEnvAttr |
Yes | ISO 92 | Returns the value of an environment attribute. |
SQLSetStmtAttr |
Yes | ISO 92 | Sets a statement attribute. |
SQLGetStmtAttr |
Yes | ISO 92 | Returns the value of a statement attribute. |
SQLSetStmtOption |
Yes | Deprecated | Sets a statement option |
SQLGetStmtOption |
Yes | Deprecated | Returns the value of a statement option |
Preparing SQL requests:
Function name | C/ODBC 3.51 | Standard | Purpose |
SQLAllocStmt |
Yes | Deprecated | Allocates a statement handle |
SQLPrepare |
Yes | ISO 92 | Prepares an SQL statement for later execution. |
SQLBindParameter |
Yes | ODBC | Assigns storage for a parameter in an SQL statement. |
SQLGetCursorName |
Yes | ISO 92 | Returns the cursor name associated with a statement handle. |
SQLSetCursorName |
Yes | ISO 92 | Specifies a cursor name. |
SQLSetScrollOptions |
Yes | ODBC | Sets options that control cursor behavior. |
Submitting requests:
Function name | C/ODBC 3.51 | Standard | Purpose |
SQLExecute |
Yes | ISO 92 | Executes a prepared statement. |
SQLExecDirect |
Yes | ISO 92 | Executes a statement |
SQLNativeSql |
Yes | ODBC | Returns the text of an SQL statement as translated by the driver. |
SQLDescribeParam |
Yes | ODBC | Returns the description for a specific parameter in a statement. |
SQLNumParams |
Yes | ISO 92 | Returns the number of parameters in a statement. |
SQLParamData |
Yes | ISO 92 | Used in conjunction with SQLPutData to supply parameter data at execution time. (Useful for long data values.) |
SQLPutData |
Yes | ISO 92 | Sends part or all of a data value for a parameter. (Useful for long data values.) |
Retrieving results and information about results:
Function name | C/ODBC 3.51 | Standard | Purpose |
SQLRowCount |
Yes | ISO 92 | Returns the number of rows affected by an insert, update, or delete request. |
SQLNumResultCols |
Yes | ISO 92 | Returns the number of columns in the result set. |
SQLDescribeCol |
Yes | ISO 92 | Describes a column in the result set. |
SQLColAttribute |
Yes | ISO 92 | Describes attributes of a column in the result set. |
SQLColAttributes |
Yes | Deprecated | Describes attributes of a column in the result set. |
SQLFetch |
Yes | ISO 92 | Returns multiple result rows. |
SQLFetchScroll |
Yes | ISO 92 | Returns scrollable result rows. |
SQLExtendedFetch |
Yes | Deprecated | Returns scrollable result rows. |
SQLSetPos |
Yes | ODBC | Positions a cursor within a fetched block of data and allows an application to refresh data in the rowset or to update or delete data in the result set. |
SQLBulkOperations |
Yes | ODBC | Performs bulk insertions and bulk bookmark operations, including update, delete, and fetch by bookmark. |
Retrieving error or diagnostic information:
Function name | C/ODBC 3.51 | Standard | Purpose |
SQLError |
Yes | Deprecated | Returns additional error or status information |
SQLGetDiagField |
Yes | ISO 92 | Returns additional diagnostic information (a single field of the diagnostic data structure). |
SQLGetDiagRec |
Yes | ISO 92 | Returns additional diagnostic information (multiple fields of the diagnostic data structure). |
Obtaining information about the data source's system tables (catalog functions) item:
Function name | C/ODBC 3.51 | Standard | Purpose |
SQLColumnPrivileges |
Yes | ODBC | Returns a list of columns and associated privileges for one or more tables. |
SQLColumns |
Yes | X/Open | Returns the list of column names in specified tables. |
SQLForeignKeys |
Yes | ODBC | Returns a list of column names that make up foreign keys, if they exist for a specified table. |
SQLPrimaryKeys |
Yes | ODBC | Returns the list of column names that make up the primary key for a table. |
SQLSpecialColumns |
Yes | X/Open | Returns information about the optimal set of columns that uniquely identifies a row in a specified table, or the columns that are automatically updated when any value in the row is updated by a transaction. |
SQLStatistics |
Yes | ISO 92 | Returns statistics about a single table and the list of indexes associated with the table. |
SQLTablePrivileges |
Yes | ODBC | Returns a list of tables and the privileges associated with each table. |
SQLTables |
Yes | X/Open | Returns the list of table names stored in a specific data source. |
Performing transactions:
Function name | C/ODBC 3.51 | Standard | Purpose |
SQLTransact |
Yes | Deprecated | Commits or rolls back a transaction |
SQLEndTran |
Yes | ISO 92 | Commits or rolls back a transaction. |
Terminating a statement:
Function name | C/ODBC 3.51 | Standard | Purpose |
SQLFreeStmt |
Yes | ISO 92 | Ends statement processing, discards pending results, and, optionally, frees all resources associated with the statement handle. |
SQLCloseCursor |
Yes | ISO 92 | Closes a cursor that has been opened on a statement handle. |
SQLCancel |
Yes | ISO 92 | Cancels an SQL statement. |
Terminating a connection:
Function name | C/ODBC 3.51 | Standard | Purpose |
SQLDisconnect |
Yes | ISO 92 | Closes the connection. |
SQLFreeHandle |
Yes | ISO 92 | Releases an environment, connection, statement, or descriptor handle. |
SQLFreeConnect |
Yes | Deprecated | Releases connection handle |
SQLFreeEnv |
Yes | Deprecated | Releases an environment handle |
23.1.6.2. Connector/ODBC Data Types
The following table illustrates how driver maps the server data types to default SQL and C data types:
Native Value | SQL Type | C Type |
bigint unsigned |
SQL_BIGINT |
SQL_C_UBIGINT |
bigint |
SQL_BIGINT |
SQL_C_SBIGINT |
bit |
SQL_BIT |
SQL_C_BIT |
bit |
SQL_CHAR |
SQL_C_CHAR |
blob |
SQL_LONGVARBINARY |
SQL_C_BINARY |
bool |
SQL_CHAR |
SQL_C_CHAR |
char |
SQL_CHAR |
SQL_C_CHAR |
date |
SQL_DATE |
SQL_C_DATE |
datetime |
SQL_TIMESTAMP |
SQL_C_TIMESTAMP |
decimal |
SQL_DECIMAL |
SQL_C_CHAR |
double precision |
SQL_DOUBLE |
SQL_C_DOUBLE |
double |
SQL_FLOAT |
SQL_C_DOUBLE |
enum |
SQL_VARCHAR |
SQL_C_CHAR |
float |
SQL_REAL |
SQL_C_FLOAT |
int unsigned |
SQL_INTEGER |
SQL_C_ULONG |
int |
SQL_INTEGER |
SQL_C_SLONG |
integer unsigned |
SQL_INTEGER |
SQL_C_ULONG |
integer |
SQL_INTEGER |
SQL_C_SLONG |
long varbinary |
SQL_LONGVARBINARY |
SQL_C_BINARY |
long varchar |
SQL_LONGVARCHAR |
SQL_C_CHAR |
longblob |
SQL_LONGVARBINARY |
SQL_C_BINARY |
longtext |
SQL_LONGVARCHAR |
SQL_C_CHAR |
mediumblob |
SQL_LONGVARBINARY |
SQL_C_BINARY |
mediumint unsigned |
SQL_INTEGER |
SQL_C_ULONG |
mediumint |
SQL_INTEGER |
SQL_C_SLONG |
mediumtext |
SQL_LONGVARCHAR |
SQL_C_CHAR |
numeric |
SQL_NUMERIC |
SQL_C_CHAR |
real |
SQL_FLOAT |
SQL_C_DOUBLE |
set |
SQL_VARCHAR |
SQL_C_CHAR |
smallint unsigned |
SQL_SMALLINT |
SQL_C_USHORT |
smallint |
SQL_SMALLINT |
SQL_C_SSHORT |
text |
SQL_LONGVARCHAR |
SQL_C_CHAR |
time |
SQL_TIME |
SQL_C_TIME |
timestamp |
SQL_TIMESTAMP |
SQL_C_TIMESTAMP |
tinyblob |
SQL_LONGVARBINARY |
SQL_C_BINARY |
tinyint unsigned |
SQL_TINYINT |
SQL_C_UTINYINT |
tinyint |
SQL_TINYINT |
SQL_C_STINYINT |
tinytext |
SQL_LONGVARCHAR |
SQL_C_CHAR |
varchar |
SQL_VARCHAR |
SQL_C_CHAR |
year |
SQL_SMALLINT |
SQL_C_SHORT |
23.1.6.3. Connector/ODBC Error Codes
The following tables lists the error codes returned by the driver apart from the server errors.
Native Code | SQLSTATE 2 | SQLSTATE 3 | Error Message |
500 | 01000 | 01000 | General warning |
501 | 01004 | 01004 | String data, right truncated |
502 | 01S02 | 01S02 | Option value changed |
503 | 01S03 | 01S03 | No rows updated/deleted |
504 | 01S04 | 01S04 | More than one row updated/deleted |
505 | 01S06 | 01S06 | Attempt to fetch before the result set returned the first row set |
506 | 07001 | 07002 | SQLBindParameter not used for all parameters |
507 | 07005 | 07005 | Prepared statement not a cursor-specification |
508 | 07009 | 07009 | Invalid descriptor index |
509 | 08002 | 08002 | Connection name in use |
510 | 08003 | 08003 | Connection does not exist |
511 | 24000 | 24000 | Invalid cursor state |
512 | 25000 | 25000 | Invalid transaction state |
513 | 25S01 | 25S01 | Transaction state unknown |
514 | 34000 | 34000 | Invalid cursor name |
515 | S1000 | HY000 | General driver defined error |
516 | S1001 | HY001 | Memory allocation error |
517 | S1002 | HY002 | Invalid column number |
518 | S1003 | HY003 | Invalid application buffer type |
519 | S1004 | HY004 | Invalid SQL data type |
520 | S1009 | HY009 | Invalid use of null pointer |
521 | S1010 | HY010 | Function sequence error |
522 | S1011 | HY011 | Attribute can not be set now |
523 | S1012 | HY012 | Invalid transaction operation code |
524 | S1013 | HY013 | Memory management error |
525 | S1015 | HY015 | No cursor name available |
526 | S1024 | HY024 | Invalid attribute value |
527 | S1090 | HY090 | Invalid string or buffer length |
528 | S1091 | HY091 | Invalid descriptor field identifier |
529 | S1092 | HY092 | Invalid attribute/option identifier |
530 | S1093 | HY093 | Invalid parameter number |
531 | S1095 | HY095 | Function type out of range |
532 | S1106 | HY106 | Fetch type out of range |
533 | S1117 | HY117 | Row value out of range |
534 | S1109 | HY109 | Invalid cursor position |
535 | S1C00 | HYC00 | Optional feature not implemented |
0 | 21S01 | 21S01 | Column count does not match value count |
0 | 23000 | 23000 | Integrity constraint violation |
0 | 42000 | 42000 | Syntax error or access violation |
0 | 42S02 | 42S02 | Base table or view not found |
0 | 42S12 | 42S12 | Index not found |
0 | 42S21 | 42S21 | Column already exists |
0 | 42S22 | 42S22 | Column not found |
0 | 08S01 | 08S01 | Communication link failure |