insertScore ์ ํตํด CallableStatement ์ฌ์ฉ ๋ฐฉ๋ฒ ์์๋ณด๊ธฐ
CallableStatement ๊ฐ์ฒด ์์ฑ
CallableStatement cstmt = null;
ํ๋ก์์ ๋ฅผ ํธ์ถํ ์ฟผ๋ฆฌ ์์ฑ
์๋ฐ์์ ํ๋ก์์ ๋ฅผ ํธ์ถํ ๋๋ CALL๋ก ํธ์ถ
{ CALL ์ํ์ค ์ด๋ฆ(์ํ์ค์ ๋ฃ์ ๊ฐ)}
sql = "{ CALL insertScore(?, ?, ?, ?, ?, ?)}";
์ปค๋ฅ์ ๋ฐฉ๋ฒ
cstmt = conn.prepareCall(sql);
------------------------------------------------------------------------------------------------------------
readScore ์ ํตํดCallableStatement ์ฌ์ฉ ๋ฐฉ๋ฒ ์์๋ณด๊ธฐ
์ด๋ ต๋ค..๐ค๐ค๐ค
sql = "{ Call readScore(?, ?) }";
CREATE OR REPLACE PROCEDURE readScore
(
pResult OUT SYS_REFCURSOR,
pHak IN VARCHAR2
)
IS
BEGIN
OPEN pResult FOR
SELECT hak, name, TO_CHAR(birth, 'YYYY-MM-DD') birth, kor, eng, mat,
kor+eng+mat tot, (kor+eng+mat)/3 ave
FROM score
WHERE hak = pHak;
END;
/
readScore์ ํ๋ฒ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋๋ค.
์๋ฐ์์ ํ๋ฒ์ ์ ๋ ฅํ๋ฉด, ์ ๋ ฅํ ํ๋ฒ์ ์ค๋ผํด๋ก ๋๊ธด๋ค.
์ค๋ผํด์ ์ ์ฅ๋ ๋ฐ์ดํฐ ์ค์ ํด๋น ํ๋ฒ์ด ์กด์ฌํ๋ค๋ฉด ํด๋น ํ๋ฒ์ ์ ๋ณด๋ฅผ ์๋ฐ๋ก ์ถ๋ ฅํ๋ค.
cstmt.registerOutParameter(1, OracleTypes.CURSOR);
๊ฒฐ๊ณผ๋ฅผ ๋ด๋ ๋ณ์์ธ result์ ๊ฒฝ์ฐ ์ค๋ผํด์ ์ปค์๋ก ์ค์ ํ์ฌ ์ค๋ผํด์์ ๋ฐ์์จ๋ค.
cstmt.setString(2, hak);
ํ๋ฒ์ ๊ฒฝ์ฐ ์ค๋ผํด๋ก ๋๊ธธ ๋ณ์์ด๋ค. ์ง๊ธ๊น์ง ์ ๋ ฅํ๋ ๋ฐฉ๋ฒ๊ณผ ๋์ผํ๊ฒ ์ฒ๋ฆฌํ๋ฉด ๋๋ค.
cstmt.executeUpdate();
ํ๋ก์์ ์คํ
rs = (ResultSet) cstmt.getObject(1);
SYS_REFCURSOR๋ ResultSet๋ก ๋ฐํ ๋ฐ๋๋ค.
ScoreDAOImpl ํด๋์ค
package db.ch4.score;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLDataException;
import java.sql.SQLException;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import db.util.DBConn;
import oracle.jdbc.OracleTypes;
public class ScoreDAOImpl implements ScoreDAO {
private Connection conn = DBConn.getConnection();
@Override
public int insertScore(ScoreDTO dto) throws SQLException {
int result = 0;
CallableStatement cstmt = null; // ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ค
String sql;
try {
// ํ๋ก์์ ๋ฅผ ํธ์ถํ ์ฟผ๋ฆฌ ์์ฑ - ์๋ฐ์์ ํ๋ก์์ ๋ฅผ ํธ์ถํ ๋๋ CALL๋ก ํธ์ถ
sql = "{ CALL insertScore(?, ?, ?, ?, ?, ?)}";
// CallbleSatement ๊ฐ์ฒด ์์ฑ
cstmt = conn.prepareCall(sql);
cstmt.setString(1, dto.getHak());
cstmt.setString(2, dto.getName());
cstmt.setString(3, dto.getBirth());
cstmt.setInt(4, dto.getKor());
cstmt.setInt(5, dto.getEng());
cstmt.setInt(6, dto.getMat());
// ํ๋ก์์ ์คํ
cstmt.executeUpdate();
// CallableStatement์ executeUpdate() ๋ฉ์๋ ๋ฆฌํด ๊ฐ์ ํ๋ก์์ ์คํ ์ฌ๋ถ์ด์
// DML(INSERT, UPDATE, DELETE) ์คํ ๊ฐฏ์๊ฐ ์๋๋ค.
// SELECT ๋ฌธ์ ์ ์ธํ DML, DDL ์คํ
result = 1;
} catch (SQLIntegrityConstraintViolationException e) {
// ๊ธฐ๋ณธํค ์ ์ฝ ์๋ฐ, NOT NULL ๋ฑ์ ์ ์ฝ ์๋ฐ -- ๋ฌด๊ฒฐ์ฑ ์ ์ฝ ์๋ฐ ์ ๋ฐ์
if (e.getErrorCode() == 1) {
System.out.println("ํ๋ฒ ์ค๋ณต์ผ๋ก ๋ฑ๋ก์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค");
} else if (e.getErrorCode() == 1400) {
System.out.println("ํ์ ์
๋ ฅ ์ฌํญ์ ์
๋ ฅํ์ง ์์์ต๋๋ค ");
} else {
System.out.println(e.toString());
}
throw e;
} catch (SQLDataException e) {
// ๋ ์ง ๋ฑ์ ํ์ ์๋ชป์ผ๋ก ์ธํ ์์ธ ๋ฐ์
if (e.getErrorCode() == 1840 || e.getErrorCode() == 1861) {
System.out.println("๋ ์ง ์
๋ ฅ ํ์ ์ค๋ฅ");
} else {
System.out.println(e.toString());
}
throw e;
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
if (cstmt != null) {
try {
cstmt.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
}
return result;
}
@Override
public int updateScore(ScoreDTO dto) throws SQLException {
int result = 0;
CallableStatement cstmt = null;
String sql;
try {
sql = "{ CALL updateScore(? ,? ,?, ? ,?, ?)}";
cstmt = conn.prepareCall(sql);
cstmt.setString(1, dto.getName());
cstmt.setString(2, dto.getBirth());
cstmt.setInt(3, dto.getKor());
cstmt.setInt(4, dto.getEng());
cstmt.setInt(5, dto.getMat());
cstmt.setString(6, dto.getHak());
cstmt.executeUpdate();
result = 1;
} catch (SQLIntegrityConstraintViolationException e) {
if (e.getErrorCode() == 1400) {
System.out.println("ํ์ ์
๋ ฅ ์ฌํญ์ ์
๋ ฅํ์ง ์์์ต๋๋ค");
} else {
System.out.println();
}
} catch (SQLDataException e) {
if (e.getErrorCode() == 1840 || e.getErrorCode() == 1861) {
System.out.println("๋ ์ง ํ์ ์ค๋ฅ์
๋๋ค๋ค");
} else {
System.out.println(e.toString());
}
throw e;
} catch (SQLException e) {
if (e.getErrorCode() == 20100) {
// 20100 : ํ๋ก์์ ๋ฅผ ๋ง๋ค ๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฐ์์ํค๋ ์์ธ ์ฝ๋
System.out.println("๋ฑ๋ก๋ ์๋ฃ๊ฐ ์๋๋๋ค");
}
e.printStackTrace();
throw e;
} finally {
if (cstmt != null) {
try {
cstmt.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
}
return result;
}
@Override
public int deleteScore(String hak) throws SQLException {
// TODO Auto-generated method stub
int result = 0;
CallableStatement cstmt = null;
String sql;
try {
sql = "CALL deleteScore(?)";
cstmt = conn.prepareCall(sql);
cstmt.setString(1, hak);
// hak ๋ง ์๋ฉด ์ง์ธ ์ ์์ผ๋ฏ๋ก ๊ตณ์ด dto ์ฌ์ฉ ์ ํด๋ ๋จ
// ๋ฐ์ดํฐ ์ฌ๋ฌ ๊ฐ๋ฅผ ์์์ผ ํ๋ค๋ฉด dto ์ฌ์ฉ
cstmt.executeUpdate();
result = 1;
} catch (SQLException e) {
if (e.getErrorCode() == 20100) {
// ํ๋ก์์ ์์ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด 20100์ด๋ผ๋ ์๋ฌ์ฝ๋๋ฅผ ๋์ง
System.out.println("๋ฑ๋ก๋ ์๋ฃ๊ฐ ์๋๋๋ค");
} else {
e.printStackTrace();
}
} finally {
if (cstmt != null) {
try {
cstmt.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
}
return result;
}
@Override
public ScoreDTO readScore(String hak) {
// TODO Auto-generated method stub
ScoreDTO dto = null;
CallableStatement cstmt = null;
ResultSet rs = null;
String sql;
try {
sql = "{ Call readScore(?, ?) }";
// ? ๋ ํ๋ก์์ ํ๋ผ๋ฏธํฐ ๊ฐ์๋งํผ(IN, OUT, INOUT ๋ชจ๋)
cstmt = conn.prepareCall(sql);
cstmt.registerOutParameter(1, OracleTypes.CURSOR);
// OUT ํ๋ผ๋ฏธํฐ๋ ํ์
์ ์ค์ ํ๋ค
// ์ค๋ผํด์ SYS_REFCURSOR์ OracleTypes.CURSOR์ผ๋ก ์ค์
cstmt.setString(2, hak);
cstmt.executeQuery();
rs = (ResultSet) cstmt.getObject(1);
// OUT ํ๋ผ๋ฏธํฐ๋ ํ๋ก์์ ๊ฐ ๋๊ฒจ์ค ๊ฐ์ผ๋ก getter๋ก ๋๊ฒจ ๋ฐ๋๋ค
if (rs.next()) {
dto = new ScoreDTO();
dto.setHak(rs.getString("hak"));
dto.setName(rs.getString("name"));
dto.setBirth(rs.getDate("birth").toString());
// "๋
-์-์ผ ์:๋ถ:์ด"๋ก ์ถ๋ ฅ๋จ
dto.setKor(rs.getInt("kor"));
dto.setEng(rs.getInt("eng"));
dto.setMat(rs.getInt("mat"));
dto.setTot(rs.getInt("tot"));
dto.setAve(rs.getInt("ave"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
if (cstmt != null) {
try {
cstmt.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
}
return dto;
}
@Override
public List<ScoreDTO> listScore() {
List<ScoreDTO> list = new ArrayList<>();
CallableStatement cstmt = null;
ResultSet rs = null;
String sql;
try {
// ์ ์ฒด ๋ฆฌ์คํธ
// SELECT ์ปฌ๋ผ, ์ปฌ๋ผ FROM ํ
์ด๋ธ
sql = "{ CALL listScore(?) }";
// TO_CHAR(birth, 'YYYY-MM-DD')
cstmt = conn.prepareCall(sql);
// ? ๊ฐ ์์ผ๋๊น Setter ์์
cstmt.registerOutParameter(1, OracleTypes.CURSOR);
cstmt.execute();
rs = (ResultSet) cstmt.getObject(1);
// score ํ
์ด๋ธ์ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ์ฝ์ด List ๊ฐ์ฒด์ ์ ์ฅ
while (rs.next()) {
ScoreDTO dto = new ScoreDTO();
dto.setHak(rs.getString("hak"));
dto.setName(rs.getString("name"));
dto.setBirth(rs.getString("birth"));
dto.setKor(rs.getInt("kor"));
dto.setEng(rs.getInt("eng"));
dto.setMat(rs.getInt("mat"));
dto.setTot(rs.getInt("tot"));
dto.setAve(rs.getInt("ave"));
dto.setRank(rs.getInt("rank"));
list.add(dto);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
if (cstmt != null) {
try {
cstmt.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
}
return list;
}
@Override
public List<ScoreDTO> listScore(String name) {
// TODO Auto-generated method stub
List<ScoreDTO> list = new ArrayList<>();
CallableStatement cstmt = null;
String sql;
ResultSet rs = null;
try {
sql = "{Call searchNameScore(?, ?) }";
// WHERE LIKE name '%' || ? || '%'";
cstmt = conn.prepareCall(sql);
cstmt.registerOutParameter(1, OracleTypes.CURSOR);
cstmt.setString(2, name);
cstmt.executeQuery();
rs = (ResultSet) cstmt.getObject(1);
while (rs.next()) {
ScoreDTO dto = new ScoreDTO();
dto.setHak(rs.getString("hak"));
dto.setName(rs.getString("name"));
dto.setBirth(rs.getString("birth"));
dto.setKor(rs.getInt("kor"));
dto.setEng(rs.getInt("eng"));
dto.setMat(rs.getInt("mat"));
dto.setTot(rs.getInt("tot"));
dto.setAve(rs.getInt("ave"));
list.add(dto);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
if (cstmt != null) {
try {
cstmt.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
}
return list;
}
@Override
public Map<String, Integer> averageScore() {
Map<String, Integer> map = new HashMap<>();
CallableStatement cstmt = null;
String sql;
try {
sql = "{CALL averageScore(?,?,?)}";
cstmt = conn.prepareCall(sql);
cstmt.registerOutParameter(1, OracleTypes.INTEGER);
cstmt.registerOutParameter(2, OracleTypes.INTEGER);
cstmt.registerOutParameter(3, OracleTypes.INTEGER);
cstmt.execute();
int kor = cstmt.getInt(1);
int eng = cstmt.getInt(2);
int mat = cstmt.getInt(3);
map.put("kor", kor);
map.put("eng", eng);
map.put("mat", mat);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cstmt != null) {
try {
cstmt.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
}
return map;
}
}
ScoreUI ํด๋์ค
package db.ch4.score;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Map;
import db.util.DBConn;
public class ScoreUI {
private BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
private ScoreDAO dao = new ScoreDAOImpl();
public void menu() {
System.out.println("CallablePreparedStatement ์์ ...");
int ch;
while (true) {
try {
System.out.print("1.๋ฑ๋ก 2.์์ 3.์ญ์ 4.ํ๋ฒ ๊ฒ์ 5.์ด๋ฆ๊ฒ์ 6.๋ฆฌ์คํธ 7.ํ๊ท 8. ์ข
๋ฃ =>");
ch = Integer.parseInt(br.readLine());
if (ch == 8) {
DBConn.close();
return;
}
switch (ch) {
case 1:
insert();
break;
case 2:
update();
break;
case 3:
delete();
break;
case 4:
findByHak();
break;
case 5:
findByName();
break;
case 6:
listAll();
break;
case 7:
average();
break;
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
protected void insert() {
System.out.println("[๋ฐ์ดํฐ ๋ฑ๋ก]");
try {
ScoreDTO dto = new ScoreDTO();
System.out.print("ํ๋ฒ? ");
dto.setHak(br.readLine());
System.out.print("์ด๋ฆ? ");
dto.setName(br.readLine());
System.out.print("์๋
์์ผ? ");
dto.setBirth(br.readLine());
System.out.print("๊ตญ์ด? ");
dto.setKor(Integer.parseInt(br.readLine()));
System.out.print("์์ด? ");
dto.setEng(Integer.parseInt(br.readLine()));
System.out.print("์ํ? ");
dto.setMat(Integer.parseInt(br.readLine()));
dao.insertScore(dto);
System.out.println("๋ฐ์ดํฐ ๋ฑ๋ก ์๋ฃ!");
} catch (NumberFormatException e) {
System.out.println("์ ์๋ ์ซ์๋ง ๊ฐ๋ฅํฉ๋๋ค");
} catch (Exception e) {
System.out.println("๋ฐ์ดํฐ ๋ฑ๋ก์ด ์คํจํ์ต๋๋ค");
}
System.out.println();
}
protected void update() {
System.out.println("๋ฐ์ดํฐ ์์ ");
try {
ScoreDTO dto = new ScoreDTO();
System.out.print("์์ ํ ํ๋ฒ?");
dto.setHak(br.readLine());
System.out.print("์ด๋ฆ");
dto.setName(br.readLine());
System.out.print("์๋
์์ผ?");
dto.setBirth(br.readLine());
System.out.print("๊ตญ์ด?");
dto.setKor(Integer.parseInt(br.readLine()));
System.out.print("์์ด?");
dto.setEng(Integer.parseInt(br.readLine()));
System.out.print("์ํ?");
dto.setMat(Integer.parseInt(br.readLine()));
dao.updateScore(dto);
System.out.println("๋ฐ์ดํฐ๊ฐ ์์ ๋์์ต๋๋ค");
} catch (NumberFormatException e) {
System.out.println("์ ์๋ ์ซ์๋ง ๊ฐ๋ฅํฉ๋๋ค");
} catch (Exception e) {
System.out.println("์๋ฃ ์์ ์คํจ");
}
}
protected void delete() {
System.out.println("๋ฐ์ดํฐ ์ญ์ ");
String hak;
try {
System.out.println("์ญ์ ํ ํ๋ฒ?");
hak = br.readLine();
int result = dao.deleteScore(hak);
System.out.println("๋ฐ์ดํฐ๊ฐ ์ญ์ ๋์์ต๋๋ค");
// ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ์ง ์์์ผ๋ฉด 0 ๋ฆฌํด
// ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ค๋ฉด ์ญ์ ํ ๊ฐ์ ๋ฆฌํด
} catch (Exception e) {
System.out.println("๋ฐ์ดํฐ ์ญ์ ์คํจ");
}
System.out.println();
}
protected void findByHak() {
System.out.println("ํ๋ฒ ๊ฒ์");
String hak;
try {
System.out.println("๊ฒ์ํ ํ๋ฒ?");
hak = br.readLine();
ScoreDTO dto = dao.readScore(hak);
if (dto == null) {
System.out.println("๋ฑ๋ก๋ ์๋ฃ๊ฐ ์์ต๋๋ค");
return;
}
System.out.print(dto.getHak() + "\t");
System.out.print(dto.getName() + "\t");
System.out.print(dto.getBirth() + "\t");
System.out.print(dto.getKor() + "\t");
System.out.print(dto.getEng() + "\t");
System.out.print(dto.getMat() + "\t");
System.out.print(dto.getTot() + "\t");
System.out.println(dto.getAve() + "\t");
} catch (Exception e) {
System.out.println("ํ๋ฒ ๊ฒ์ ์คํจ");
}
System.out.println();
}
protected void findByName() {
System.out.println("์ด๋ฆ ๊ฒ์");
String name;
try {
System.out.println("๊ฒ์ํ ์ด๋ฆ?");
name = br.readLine();
List<ScoreDTO> list = dao.listScore(name);
if (list.size() == 0) {
System.out.println("๋ฑ๋ก๋ ์๋ฃ๊ฐ ์์ต๋๋ค");
return;
}
for (ScoreDTO dto : list) {
System.out.print(dto.getHak() + "\t");
System.out.print(dto.getName() + "\t");
System.out.print(dto.getBirth() + "\t");
System.out.print(dto.getKor() + "\t");
System.out.print(dto.getEng() + "\t");
System.out.print(dto.getMat() + "\t");
System.out.print(dto.getTot() + "\t");
System.out.println(dto.getAve() + "\t");
}
} catch (Exception e) {
System.out.println("์ด๋ฆ ๊ฒ์ ์คํจ");
}
System.out.println();
}
protected void listAll() {
System.out.println("์ ์ฒด ๋ฆฌ์คํธ");
System.out.println("ํ๋ฒ\t์ด๋ฆ\t์๋
์์ผ\t\t๊ตญ์ด\t ์์ด\t ์ํ\t์ด์ \tํ๊ท \t์์ฐจ");
System.out.println("----------------------------------------------------------------------------");
List<ScoreDTO> list = dao.listScore();
for (ScoreDTO dto : list) {
System.out.print(dto.getHak() + "\t");
System.out.print(dto.getName() + "\t");
System.out.print(dto.getBirth() + "\t");
System.out.print(dto.getKor() + "\t");
System.out.print(dto.getEng() + "\t");
System.out.print(dto.getMat() + "\t");
System.out.print(dto.getTot() + "\t");
System.out.print(dto.getAve() + "\t");
System.out.println(dto.getRank());
}
System.out.println();
}
protected void average() {
System.out.println("\n ๊ณผ๋ชฉ๋ณ ํ๊ท ์ ์ ... ");
Map<String, Integer> map = dao.averageScore();
int kor = map.get("kor");
int eng = map.get("eng");
int mat = map.get("mat");
System.out.println("๊ตญ์ด " + kor);
System.out.println("์ํ " + mat);
System.out.println("์์ด" + eng);
}
}
'๐ปProgramming > ๐ฝOracle' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฐ์ ์ค๋ผํด ์ฐ๋์ํค๊ธฐ (0) | 2022.08.19 |
---|---|
๋ฐ์ดํฐ ๋ชจ๋ธ๋ง ๋ฐ ์ค๊ณ (0) | 2022.08.19 |
[PL/SQL] ์ธ๋ฑ์ค (0) | 2022.08.18 |
[PL/SQL] ์์ธ(Exception) ์ฒ๋ฆฌ (0) | 2022.08.18 |
[PL/SQL] ์ปค์(Cursor) (0) | 2022.08.18 |