JDBC: 자바와 오라클 연결하여, 테이블 생성 및 결과 출력 해보기
혈압이 너무 오른다...
너무 간단하고 어이없었던 오류때문에 2시간을 날렸다. 삽질하면서 배우는 거라지만,
너무너무너무 화가나고 짜증이 난다.
어제 포스팅했던, 자바,오라클 연결 테스트
JDBC : 오라클과 자바 연결 테스트하기 (tistory.com)
어제는 자바에서 몇 가지 열을 입력 받아서 오라클DB에 넣는 걸 했었는데,
오늘은 여기에 좀 업글(?)을 해서 연습해보았다.
연결 후, 자바에서 테이블, 시퀀스 생성 다하고, 데이터 5개 입력받기 (반드시 시퀀스 번호 제대로 뜨게 하기)
1.JDBC 드라이버 로드 (Class의 forgetname() 메소드를 사용)
2. DRIVERMANAGER 클래스의 getConnection( ) 메소드를 사용하여, CONNECTION 객체를 생성하기
3. CONNECTION객체를 통해 PreparedStatement 객체를 생성
(String형 변수에 sql명령문을 저장하고 PreparedStatement 생성자의 매개변수로 사용)
4. PreparedStatement의 executeUpdate() 메소드를 사용해서 쿼리를 실행해준다.
(테이블에 데이터 넣는건 - 변수 하나에 5개 다 넣은 다음에 한번에 실행하려고 했는데 오류난다;)
분명 한번에 넣을 방법 있을텐데 아직 덜 배웠으므로 ㅠㅠ
문제의 그 오류 :
ORA-00911: 문자가 부적합합니다
중간 코드 ... 입력형으로 바꿨다가 다시 고침
insertValA.executeUpdate(); 이 줄에서 계속 오류가 난 것;;
검색 다해도 안 뜨고 , GPT는 틀린 답만 도돌이표로 알려주고 (얘 진짜 가끔 멍청해)
정말 100번은 오라클에서 테이블 지우고 자바에서 수정 후 다시 돌려보고...한 듯 ㅠ
정말 원인은 어이없게도 쿼리 문장 마지막에 ' ; ' 세미콜론이 있어서였음 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
아니 DB프로그램에선 ;를 넣어야 명령어가 끝나니까 당연한 건줄...
더 웃긴건 저거 위에 있던 테이블생성, 시퀀스 생성 쿼리엔 실수로 ;를 안 넣어서 멀쩡히 실행이 되었던 것...
고생해서 얻은 원하는 출력물:
package test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
//오라클에 자바를 연결한 후에, 테이블을 생성해보자,
// 생성하고 입력해보자.
public class Oracle_Test2 {
private static Object createTab;
public static void main(String[] args) {
// 1.드라이버 로드
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("드라이버 로드 성공!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 2 오라클과 연결하기
Connection con = null;
PreparedStatement createTab = null; // 쿼리 1실행하는 객체 stmt
// 이거 하나당 쿼리 하나인듯?
PreparedStatement createSeq = null; // 쿼리 2실행
PreparedStatement insertValA = null; // 쿼리 3 담당
PreparedStatement insertValB = null;
PreparedStatement insertValC = null;
PreparedStatement insertValD = null;
PreparedStatement insertValE = null;
try {
// 오라클과 연결
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String user = "scott";
String pwd = "tiger";
con = DriverManager.getConnection(url, user, pwd); /// 여까지 노프라블럼
// 테이블 생성하는 쿼리
String sql = "CREATE TABLE BOOK_LIST ( BNUM NUMBER(4) PRIMARY KEY," + " SUB VARCHAR2(30) UNIQUE,"
+ " WRITER VARCHAR2(30)," + " REALDATE DATE," + " HOWMUCH NUMBER(4) )";
createTab = con.prepareStatement(sql);// pre stament 객체 생성
createTab.executeUpdate(); // 쿼리1ㅣ 실행
// 시퀀스 생성
String sql2 = "CREATE SEQUENCE B_SEQ MINVALUE 0 MAXVALUE 10 INCREMENT BY 1 START WITH 0";// ;
createSeq = con.prepareStatement(sql2); // stament 객체 생성
createSeq.executeUpdate();
// 쿼리2실행
// 테이블에 정보 집어넣기 // 쿼리 3을 담는 객체 생성
String sqlA = "INSERT INTO BOOK_LIST VALUES (B_SEQ.NEXTVAL, '짜증나', '죽어' ,SYSDATE, 10)";
String sqlB = "INSERT INTO BOOK_LIST VALUES(B_SEQ.NEXTVAL, '파반느','얍스',SYSDATE, 50)";
String sqlC = "INSERT INTO BOOK_LIST VALUES(B_SEQ.NEXTVAL, '상수리 나무','김미희',SYSDATE, 40)";
String sqlD = "INSERT INTO BOOK_LIST VALUES(B_SEQ.NEXTVAL, '그럼 안녕히,','닥치시오',SYSDATE, 15)";
String sqlE = "INSERT INTO BOOK_LIST VALUES(B_SEQ.NEXTVAL, '당신과나','홍매열', TO_DATE('06-05-2023','DD-MM-YYYY'), 5)";
// 쿼리3 하나씩 실행하기
insertValA = con.prepareStatement(sqlA);
insertValA.executeUpdate();
insertValB = con.prepareStatement(sqlB);
insertValB.executeUpdate();
insertValC = con.prepareStatement(sqlC);
insertValC.executeUpdate();
insertValD = con.prepareStatement(sqlD);
insertValD.executeUpdate();
insertValE = con.prepareStatement(sqlE);
insertValE.executeUpdate();
} catch (SQLException e) {
System.out.println("오류1");
e.printStackTrace();
} finally {
try {
//ResultSet이 있을 경우 맨 먼저 종료;
if (createTab != null) {createTab.close();}
if (createSeq != null) {createSeq.close();}
if (insertValA != null) {insertValA.close();}
if (insertValB != null) {insertValB.close();}
if (insertValC != null) {insertValC.close();}
if (insertValD != null) {insertValD.close();}
if (insertValE != null) {insertValE.close();}
if (con != null) {con.close();}
} catch (SQLException e2) {
System.out.println("오류2");
e2.printStackTrace();
}
}
}// main
}