* 질문 등록 시 다음의 내용을 꼭 기입하여 주세요.
Linux 64bit 등 | |
10.1 | |
10.1.0.0003 |
|
java |
* CUBRID 응용 오류, SQL 오류 또는 SQL 튜닝 관련된 문의는 반드시 다음의 내용을 추가해 주세요. 비밀글이나 비밀 댓글도 가능합니다.
* 저희가 상황을 이해하고, 재현이 가능해야 알 수 있는 문제들이 많습니다. 가능한 정보/정황들을 부탁합니다.
에러 내용 및 재현 방법 | 재현 가능한 Source와 SQL |
관련 테이블(인덱스, 키정보 포함) 정보 | CUBRID 홈 디렉토리 아래 log 디렉토리 압축 |
-------------- 아래에 질문 사항을 기입해 주세요. ------------------------------------------------------------------------
프로시져를 작성하였는데 궁금한 점 2가지 문의 드립니다.
=============== 테이블 스키마 ======================
CREATE TABLE [ta_seq] (
[bplc_cd] CHARACTER VARYING (11) NOT NULL COMMENT '사업소코드',
[biz_cd] CHARACTER VARYING (2) NOT NULL COMMENT '업무코드',
[seq] INTEGER COMMENT '순번',
CONSTRAINT [ta_seq_pk] PRIMARY KEY([biz_cd], [bplc_cd]),
CONSTRAINT [ta_seq_idx] UNIQUE KEY([biz_cd], [bplc_cd])
)
COLLATE euckr_bin
COMMENT = '순번';
===================== 프로시저 코드(JAVA) ========================
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Sproc {
public static void getIndex(String pBplCd, String pBizCd, Integer vnCount) throws Exception
{
Connection conn = null;
PreparedStatement pstmt = null;
vnCount = 0;
String sql = "";
try {
try {
Class.forName("cubrid.jdbc.driver.CUBRIDDriver");
} catch (ClassNotFoundException e) {
System.out.println("Driver Class Not Found");
}
conn = DriverManager.getConnection("jdbc:default:connection:");
vnCount = getIndexNumber(conn, pBplCd, pBizCd);
System.out.println("프로시저 리턴 결과 vnCount : " + vnCount);
if(vnCount == null)
{
throw new Exception("getIndexNumber value is null");
}
if(vnCount == 0)
{
System.out.println("==================== 조건 1 ========================");
sql = "INSERT INTO TA_SEQ(BPLC_CD, BIZ_CD, SEQ)VALUES(?, ?, ?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, pBplCd);
pstmt.setString(2, pBizCd);
pstmt.setInt(3, 1);
pstmt.executeUpdate();
}
else
{
System.out.println("==================== 조건 2 ========================");
sql = "UPDATE TA_SEQ SET SEQ = ? WHERE BPLC_CD = ? AND BIZ_CD = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, pBplCd);
pstmt.setString(2, pBizCd);
pstmt.setInt(3, vnCount + 1);
pstmt.executeUpdate();
}
vnCount += 1;
System.out.println("==================== 최종결과 vnCount : ========================" + vnCount);
pstmt.close();
conn.commit();
conn.close();
}catch(SQLException e) {
System.err.println(e.getMessage());
vnCount = null;
}finally {
if(pstmt != null)try {pstmt.close();}catch(SQLException ex) {}
if(conn != null)try {conn.close();}catch(SQLException ex) {}
}
}
public static Integer getIndexNumber(Connection conn, String pBplCd, String pBizCd)
{
System.out.println("============================== 호출 시작 ============================");
System.out.println("pBplCd : " + pBplCd);
System.out.println("pBizCd : " + pBizCd);
System.out.println("============================== 호출 종료 ============================");
PreparedStatement pstmt = null;
ResultSet rs = null;
Integer vnCount = 0;
String sql = "SELECT IFNULL(SEQ, 0) FROM TA_SEQ WHERE BPLC_CD = ? AND BIZ_CD = ?";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, pBplCd);
pstmt.setString(2, pBizCd);
rs = pstmt.executeQuery();
while(rs.next())
{
vnCount = rs.getInt("SEQ");
}
rs.close();
pstmt.close();
}catch(SQLException e) {
System.err.println(e.getMessage());
vnCount = null;
}finally {
if(rs != null)try {rs.close();}catch(SQLException ex) {}
if(pstmt != null)try {pstmt.close();}catch(SQLException ex) {}
}
return vnCount;
}
}
================================ 프로시저 등록 ================================
Sproc.java loadjava 를 이용하여 등록한 상태
CREATE PROCEDURE getIndex(p_bplc_cd IN varchar, p_biz_cd IN VARCHAR, p_seq OUT INTEGER)
AS LANGUAGE JAVA NAME 'Sproc.getIndex(java.lang.String, java.lang.String, java.lang.Integer)';
============================= 호출 자바 샘플 ======================================
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
public class Test {
public static void main(String[] args) throws Exception{
String url = "jdbc:cubrid:192.168.195.100:33000:kioskdb:::?charSet=EUC-KR";
String userid = "kioskcub";
String password = "kioskcubpwd";
Class.forName("cubrid.jdbc.driver.CUBRIDDriver");
Connection conn = DriverManager.getConnection(url, userid, password);
CallableStatement ctmt;
ctmt = conn.prepareCall(" call getIndex(?, ?, ?)" ) ;
ctmt.setString(1, "MASTER");
ctmt.setString(2, "99");
ctmt.registerOutParameter(3, java.sql.Types.INTEGER);
ctmt.execute() ;
int cnt = ctmt.getInt(3);
System.out.println(cnt);
}
}
========================================== 실행결과 ============================
============================== 호출 시작 ============================
pBplCd : MASTER
pBizCd : 99
============================== 호출 종료 ============================
프로시저 리턴 결과 vnCount : 0
==================== 조건 1 ========================
==================== 최종결과 vnCount : ========================1
제가 기대했던 결과는 TA_SEQ 테이블에 데이터가 없기 때문에 INSERT 가 되고 int cnt = ctmt.getInt(3); 가 1이 리턴되는걸 예상했는데 테이블에는 데이터가
들어가지도 않고 int cnt = ctmt.getInt(3); 값은 계속 0 이 됩니다.
어디가 잘못되었는지 몰라서 문의 드립니다.