'java'에 해당되는 글 1건

  1. 2009.04.07 prepareStatement를 이용하여 정규식에서 이용하는 ?(물음표) 보내기

prepareStatement를 이용하여 정규식에서 이용하는 ?(물음표) 보내기

|

TEST 1A 란 문자열의 뒤 1A를 추출하고 싶을 때에 단 숫자가 두 자리 까지라고 한다면
"[0-9]?[0-9A-Ca-c]"정규식을 이용하여 추출하여야 합니다.

InitialContext ctx = new InitialContext();
DataSource ds = (javax.sql.DataSource)ctx.lookup("testDB");
Connection con = ds.getConnection();
PreparedStatement ps = con.prepareStatement(
    "Select REGEXP_SUBSTR('TEST 1A', '[0-9]?[0-9A-Ca-c]') FROM DUAL");
ps.executeQuery();

하지만 이렇게 한다면 ?에 들어갈 Parameter가 없다는 에러가 나게 됩니다.
prepareStatement의 경우 ?를 Parameter를 받도록 이용하기 때문에 ?를 그냥 보낼 수 없습니다.
이런 경우엔 Parameter로 다시 "?"를 보내면 해결할 수 있습니다.

InitialContext ctx = new InitialContext();
DataSource ds = (javax.sql.DataSource)ctx.lookup("testDB");
Connection con = ds.getConnection();
PreparedStatement ps = con.prepareStatement(
    "Select REGEXP_SUBSTR('TEST 1A', '[0-9]?[0-9A-Ca-c]') FROM DUAL");
ps.setString(1, "?");
ps.executeQuery();


단 유의할 사항 하나가 있다면 "?"를 Parameter넘기게 되면 ?를 대체하여 '?'가 들어가게 됩니다.
그렇게 되면 다음과 같이 이상한 쿼리가 만들어 지게 됩니다.
Select REGEXP_SUBSTR('TEST 1A', '[0-9]'?'[0-9A-Ca-c]') FROM DUAL
그렇게 때문에 다음과 같이 쿼리상에서 ? 를 그냥 넣지 않고
'||?||'로 넣어서 ?가 '?'로 변했을 때를 대비하여 넣어야 합니다.

InitialContext ctx = new InitialContext();
DataSource ds = (javax.sql.DataSource)ctx.lookup("testDB");
Connection con = ds.getConnection();
PreparedStatement ps = con.prepareStatement(
    "Select REGEXP_SUBSTR('TEST 1A', '[0-9]'||?||'[0-9A-Ca-c]') FROM DUAL");
ps.setString(1, "?");
ps.executeQuery();


이렇게 하면 이런 쿼리를 보내게 됩니다.
Select REGEXP_SUBSTR('TEST 1A', '[0-9]'||'?'||'[0-9A-Ca-c]') FROM DUAL

And
prev | 1 | next