'3. Implementation/DATABASE'에 해당되는 글 23건

  1. 2009.06.23 SQL Server 2000 Administration 과정 : Note #1
  2. 2009.06.23 데이터베이스 생성시 데이터 파일과 로그파일의 물리적 분리
  3. 2009.05.07 SQL Server Express 에서 원격 연결 허용
  4. 2008.07.28 JDBC Oracle JDBC 드라이버에 연결
  5. 2008.07.27 MySQL/JDBC Function과 PROCEDURE 생성 및 호출 1
  6. 2008.07.27 JDBC 와 MySQL 연동하기
  7. 2008.07.26 JDBC LOB 데이터 타입 (CLOB & BLOB)
  8. 2008.07.26 JDBC ResultSetMetaData 인터페이스 실습
  9. 2008.07.26 JDBC DatabaseMetaData 사용 예제
  10. 2008.07.26 JDBC CallableStatment 예제
  11. 2008.07.26 JDBC PreparedStatement를 이용한 데이터 조회 예제
  12. 2008.07.24 JDBC DataSource 인터페이스
  13. 2008.07.24 JDBC 트랜잭션 처리
  14. 2008.07.24 JDBC ResultSet의 인터페이스 실습 1
  15. 2008.07.24 JDBC Statement 인터페이스
  16. 2008.07.24 JDBC Connection 생성
  17. 2008.07.21 JDBC 드라이버의 한글 처리
  18. 2008.07.21 JDBC 드라이버의 Type에 따른 분류
  19. 2008.07.18 [ADO 2.8] HelloData Code
  20. 2008.06.28 Connector/ODBC Reference
2009. 6. 23. 23:21

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 일반사용자







2009. 6. 23. 23:16

데이터베이스 생성시 데이터 파일과 로그파일의 물리적 분리

데이터 베이스를 만들 때 데이터파일과 로그파일을 물리적으로 같은 디스크에 둔다면 디스크가 깨지면 둘 다 깨지는 결과가 됩니다. 반드시 물리적으로 다른 디스크에 저장해야 한다.

로그의 중요성

* 로그가 가득차면 데이터베이스의 변경은 일어나지 않는다.
* 로그관리는 DBA의 당연한 몫이다.
* DBCC SQLPERF(LOGSPACE)는 로그를 모니터링 할 수 있다.
* 데이터베이스는 데이터 파일과 로그 파일로 구성되고 로그 파일의 크기 설정은 데이터베이스 환경에 따라 차이가 있다.
* 일반적으로 OLTP 환경에서는 데이터파일의 20% 정도로 설정하고 OLAP 환경에서는 10% 정도로 설정한다.
2009. 5. 7. 01:24

SQL Server Express 에서 원격 연결 허용

#. SQL Server Configuration Manager 에서
SQL Server 2005 네트워크 구성 > SQLEXPRESS에 대한 프로토콜
TCP/IP 를 '사용'으로 변경하고,
SQL Server 2005 서비스 >
SQL Server (SQLEXPRESS) => 다시 시작
SQL Server Browser => 미실행중이면 시작모드 변경후 시작함.
#. 방화벽 설정
SQL Server <instance name> : TCP 1433
SQL Server Browser : UDP, 1434
=> 방화벽을 통해 명명된 파이프에 액세스 할 수 있도록 하려면 방화벽을 통한 파일 및 프린터 공유도 설정해야 함.

#. 오류 : 원격 컴퓨터의 방화벽
Error: Firewall on Remote Machine

원격 컴퓨터의 인터넷 연결 방화벽이 원격 디버깅을 허용화도록 설정되어 있지 않다. 기본 전송을 사용하여 원격으로 관리 코드나 네이티브 코드를 디버깅하려면 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
2008. 7. 28. 13:42

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();

       }

}

2008. 7. 27. 15:56

MySQL/JDBC Function과 PROCEDURE 생성 및 호출

1. MySQL에서 Function 생성

delimiter //
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 예제

public void callFunction() throws SQLException {
  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 생성

delimiter //
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 예제

public void callProcedure() throws SQLException {
   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();
 }
2008. 7. 27. 10:43

JDBC 와 MySQL 연동하기

1. MySQL용 JDBC Driver 다운로드 (http://java.sun.com)

2. mysql-connector-java-<ver>-bin.jar 파일을 %JAVA%\jre\lib\ext에다가 복사한다.
   (CLASSPATHH에 해당 jar 파일이 있는 경로를 추가해 된다.)

3. 아래 코드로 연결 시도

import java.sql.*;
 
class TelBook
{
 public static void main(String args[])
 {
  Connection con = null;
  try{
   Class.forName("com.mysql.jdbc.Driver");
   con = DriverManager.getConnection
   ("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){}
   }
  };
};
2008. 7. 26. 20:26

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        }

 

 

 

2008. 7. 26. 17:32

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        }

 

 

2008. 7. 26. 17:20

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        }

 

 

2008. 7. 26. 16:29

JDBC CallableStatment 예제

1. PL/SQL (Procedural Language/SQL)

oracle에서 지원하는 프로그래밍 언어의 특성을 수용한 SQL의 확장이며, PL/SQL Block 내에서 SQL의 DML문과 SELECT문, 그리고 절차형 언어(IF, LOOP) 등을 사용하여 절차적 프로그래밍을 가능하게 하는 강력한 트랜잭션 언어이다.


2. Calc_Tax_Function.java

create or replace function calc_tax
(capital in number)
return number
is
 tax number;
begin
 tax:=capital * 0.05;
return (tax);
end;
\


<Calc_Tax_Function.java

01  import java.sql.*;
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

create or replace procedure calc_tax_p
(capital in number, tax out number)
is
  begin
    tax:=capital * 0.05;
end;
\



< Calc_Tax_Procedure.java >

01  import java.sql.*;
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  }  

 


 

2008. 7. 26. 16:10

JDBC PreparedStatement를 이용한 데이터 조회 예제

1. DataInsert_Prepared.java

01  import java.sql.*;
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

01  import java.sql.*;
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

01  import java.sql.*;
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

01  import java.sql.*;
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


01  import java.sql.*;
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  } 





 

2008. 7. 24. 22:14

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> 태그 사이에 다음 내용을 추가

<parameter>
  <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)

<%@ page contentType="text/html;charset=euc-kr"
 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 데이터베이스 계정 내의 테이블 이름 조회하는 예제

oracledatasource.jsp

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 디렉토리에 저장

login.html

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&nbsp;&nbsp;&nbsp;
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 디렉토리에 저장

login.jsp

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

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

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

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  } 


2008. 7. 24. 21:59

JDBC 트랜잭션 처리

AutoCommitTest.java

 

01       import java.sql.*;

02      

03       public class AutoCommitTest {

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                            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       }

 



 

2008. 7. 24. 21:43

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       }

 

 

2008. 7. 24. 21:29

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,'길동',50000.00,";

48                                      query += "TO_DATE('2001/01/01', 'YYYY/MM/DD'),'인사부')";

49                                      int rowcount = stmt.executeUpdate(query);

50                                                 query = "insert into emp values(";

51                                      query += "00002,'심청이',75000.00,";

52                                      query += "TO_DATE('2000/01/01', 'YYYY/MM/DD'),'총무부')";

53                                      rowcount += stmt.executeUpdate(query);

54                                      query = "insert into emp values(";

55                                      query += "00003,'대장금',80000.00,";

56                                      query += "TO_DATE('1998/01/01', 'YYYY/MM/DD'),'기획부')";

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홍길동인 데이터의 dept_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,'강감찬', 90000.00,";

57                                      query += "TO_DATE('1997/01/01','YYYY/MM/DD'),'기획부')";

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,'김유신',75000.00,";

48                                     query += "TO_DATE('2000/07/01','YYYY/MM/DD'),'인사부')";

49                                     stmt.addBatch(query);

50                                     query = "insert into emp values(";

51                                     query += "00006,'권율', 80000.00,";

52                                     query += "TO_DATE('1998/07/01', 'YYYY/MM/DD'),'기획부')";

53                                     stmt.addBatch(query);

54                                     query = "insert into emp values(";

55                                     query += "00005,'계백', 75000.00,";

56                                     query += "TO_DATE('2001/07/01', 'YYYY/MM/DD'),'총무부')";

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         }

 

2008. 7. 24. 20:29

JDBC Connection 생성

1. 몇가지 데이터베이스에 접속하기 위한 드라이버 로딩 방법

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) { }

                     }

           }

}



오타가 있을수 있음.
2008. 7. 21. 21:28

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을 사용할 수 있음.
2008. 7. 21. 21:09

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

2008. 7. 18. 15:02

[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

2008. 6. 28. 14:38

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


출처 : MySQL 5.0 Reference Manaual