¼Ò¼³°°ÀºJSP2ºÎ  8Àå JDBC¿Í JSP  10 CallableStatement  

 

8.10 È®ÀåµÈ JDBC – CallableStatement

 

CallableStatement´Â SQLÀÇ ½ºÅä¾îµåÇÁ·Î½ÃÀú(Stored Procedure)¸¦ ½ÇÇà½Ã۱â À§ÇØ »ç¿ëµÇ´Â ÀÎÅÍÆäÀ̽ºÀÔ´Ï´Ù. ±×·³ ½ºÅä¾îµåÇÁ·Î½ÃÀú¶õ ¹«¾ùÀϱî¿ä? °£´ÜÈ÷ ¾Ë¾Æº¸¸é, Äõ¸®¹®À» ÇϳªÀÇ ÆÄÀÏ ÇüÅ·Π¸¸µé°Å³ª µ¥ÀÌÅͺ£À̽º¿¡ ÀúÀåÇØ ³õ°í ÇÔ¼öó·³ È£ÃâÇØ¼­ »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù. À̰ÍÀ» ÀÌ¿ëÇÏ¸é ¿¬¼ÓµÇ´Â Äõ¸®¹®¿¡ ´ëÇØ¼­ ¸Å¿ì ºü¸¥ ¼º´ÉÀ» º¸À̸ç, ¿©±â¼­´Â ´Ù·çÁö ¾ÊÁö¸¸ º¸¾È ¹®Á¦ÀÇ ÇØ°á µî »ó´çÇÑ ÀÌÁ¡ÀÌ ÀÖÀ¸´Ï °³ÀÎÀûÀ¸·Î µ¥ÀÌÅͺ£À̽º Ã¥À» º¸°í °øºÎÇÒ¸¸ÇÑ °¡Ä¡°¡ ÃæºÐÈ÷ ÀÖ´Ù°í »ý°¢ÇÕ´Ï´Ù.

 

±×·³ ¿ì¸®°¡ ÇÁ·Î±×·¡¹ÖÇÒ ¶§ ¶Ç ¹«½¼ ÀÌÀÍÀÌ ÀÖÀ»±î¿ä? À§¿Í °°Àº ½ÇÇà´É·Â Çâ»ó ¿Ü¿¡ ÀÚ¹ÙÄڵ忡 Äõ¸®¹®ÀÌ µé¾î °¡Áö ¾ÊÀ¸¹Ç·Î ÀÚ¹Ù Äڵ尡 °£°áÇØÁö°í SQL¿¡ µ¶¸³ÀûÀÌ µÈ´Ù´Â °ÍÀÔ´Ï´Ù. °áÄÚ ±×³É Áö³ªÄ¥ ¼ö ¾ø´Â ºÎºÐÀ̰ÚÁÒ?.

 

CallableStatementÀÇ Æ¯Â¡

n         µ¥ÀÌÅͺ£À̽ºÀÇ ½ºÅä¾îµåÇÁ·Î½ÃÀú¸¦ ½ÇÇà½Ãų ¶§ »ç¿ë

n         ¼Óµµ, ÄÚµåÀÇ µ¶¸³¼º, º¸¾È¼º¿¡ »ó´çÇÑ ÀÕÁ¡ÀÌ ÀÖÀ½

 

½ºÅä¾îµåÇÁ·Î½ÃÀú·Î °ªÀ» ¹Þ¾Æ¿À·Á¸é, È£ÃâÇϱ⿡ ¾Õ¼­ ¹Ýµå½Ã CallableStatement ÀÎÅÍÆäÀ̽ºÀÇ registerOutParameter ¸Þ¼­µå¸¦ È£ÃâÇØ¾ß ÇÕ´Ï´Ù. ÀÌ ÀÎÅÍÆäÀ̽º´Â PreparedStatement ÀÎÅÍÆäÀ̽º·ÎºÎÅÍ »ó¼Ó ¹Þ¾Ò±â ¶§¹®¿¡ setXxx ¸Þ¼­µå¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·³ °£´ÜÇÑ ¿¹Á¦¸¦ ÅëÇØ¼­ CallableStatement¸¦ ÀÌ¿ëÇÑ ½ºÅä¾îµåÇÁ·Î½ÃÀúÀÇ ´À³¦À» ¾Ë¾Æ º¸°Ú½À´Ï´Ù.

 

CallableStatementTest.jsp

CallableStatement¸¦ Å×½ºÆ®ÇÑ ¿¹

<%@page contentType="text/html;charset=euc-kr" import="java.sql.*"%> 
<html>
<body> 
<h3>CallableStatement Å×½ºÆ® </h3>
<hr>
<%  
    Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 
    Connection conn = DriverManager.getConnection
("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=noveljsp;user=novel;password=jsp"); 
    CallableStatement cs = conn.prepareCall("{call myStoredProcedure(?,?,?)}"); 
    cs.setInt(1,3);  
    cs.registerOutParameter(2, java.sql.Types.VARCHAR);  
    cs.registerOutParameter(3, java.sql.Types.INTEGER);  
    cs.execute();  
%>
<table border = "1" cellspacing="0" cellpadding="1"> 
  <tr bgcolor = "pink"> 
    <td><b>name</b></td> 
    <td><b>age</b></td> 
  </tr> 
  <tr> 
    <td><%=cs.getString(2)%></td> 
    <td><%=cs.getInt(3)%></td> 
   </tr> 
<% 
    cs.close();  
    conn.close();  
%> 
</table> 
</body>
</html>

 

MS-SQL¿¡¼­ÀÇ ½ºÅä¾îµåÇÁ·Î½ÃÀú myStoredProcedure ÀÛ¼º±¸¹®

CREATE PROCEDURE  myStoredProcedure

             @age  int

,             @na varchar(20)   OUTPUT

,             @ageo int                         OUTPUT

AS

SELECT  @na = name, @ageo = age  FROM MyTest

Where age = @age

 

¿¹Á¦ÀÇ JSPÄڵ忡´Â SQLÀÇ Äõ¸®¹®ÀÌ µé¾î°¡ ÀÖÁö ¾ÊÀº °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×¸®°í À§¿¡ Á¤¸®ÇØ ³õÀº ½ºÅä¾îµåÇÁ·Î½ÃÀú ±¸¹®À» »ç¿ëÇÏ¿© SQL ¼­¹ö ³»¿¡ Äõ¸®¹®À» ÀúÀåÇß½À´Ï´Ù. ÀÛ¼ºµÈ ½ºÅä¾îµåÇÁ·Î½ÃÀú¿¡ ´ëÇØ Àá½Ã ¼³¸íµå¸®°Ú½À´Ï´Ù.

 

ù¹øÂ° ÁÙÀº ½ºÅä¾îµåÇÁ·Î½ÃÀúÀÇ »ý¼º°ú »ý¼ºµÉ ½ºÅä¾îµåÇÁ·Î½ÃÀúÀÇ À̸§À» ¼±¾ðÇϰí ÀÖ½À´Ï´Ù.

 

n         CREATE PROCEDURE myStoredProcedure

 

µÎ¹øÂ° ÁÙºÎÅÍ ³×¹øÂ° ÁÙ±îÁö´Â ½ºÅä¾îµåÇÁ·Î½ÃÀú¿¡¼­ »ç¿ëÇÒ ¸Å°³º¯¼ö¸¦ ¼±¾ðÇϰí ÀÖ½À´Ï´Ù. ¸Å°³º¯¼ö´Â ±× ¾Õ¿¡ @¸¦ ºÙ¿©¼­ Ç¥½ÃÇÕ´Ï´Ù. ±× Áß¿¡¼­ getXxx ¸Þ¼­µå·Î ¸®Å쵃 ¸Å°³º¯¼ö´Â OUTPUTÀ» »ç¿ëÇÏ¿© µû·Î Ç¥½ÃÇÕ´Ï´Ù. ¸Å°³º¯¼ö´Â ÃÖ´ë 2100°³±îÁö »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç ¿©·¯ °³ÀÇ ¸Å°³º¯¼ö¸¦ ¼±¾ðÇÒ ¶§¿¡´Â ¹Ýµå½Ã ÄÞ¸¶(,)¸¦ »ç¿ëÇÏ¿© ±¸ºÐÇØ¾ßÇÕ´Ï´Ù. °¢°¢ÀÇ Àǹ̴ ´ÙÀ½°ú °°½À´Ï´Ù.

 

n         @¡®º¯¼ö¸í¡¯ ¡®µ¥ÀÌÅÍÇü¡¯ ¡®¸®ÅÏ¿©ºÎ¡¯

 

º¯¼öÀÇ ¼±¾ðÀÌ ³¡³ª¸é as¸¦ »ç¿ëÇÑ ÈÄ SQL ±¸¹®À» ÀÛ¼ºÇÕ´Ï´Ù.

 

n         SELECT @na=name,@ageo=age FROM MyTest WHERE age=@age

 

ÀÌÁ¤µµ¸¸ ¾Ë°í À־ ½ºÅä¾îµåÇÁ·Î½ÃÀú¸¦ »ç¿ëÇÏ´Â µ¥¿¡´Â º° ¹®Á¦°¡ ¾øÀ» °ÍÀÔ´Ï´Ù. Á»´õ ÀÚ¼¼ÇÑ ³»¿ëÀ» ¿øÇÏ½Å´Ù¸é µ¥ÀÌÅͺ£À̽º °ü·Ã ¼­ÀûÀ» º¸½Ã±â ¹Ù¶ø´Ï´Ù.

 

±×·¯¸é Áö±ÝºÎÅÍ À§¿¡¼­ ¼³¸íµå¸° ½ºÅä¾îµåÇÁ·Î½ÃÀú¸¦ »ç¿ëÇÑ CallableStatementTest.jsp¿¹Á¦¿¡ ´ëÇØ ¼³¸íµå¸®°Ú½À´Ï´Ù. CallableStatement °´Ã¼ cs¸¦ »ý¼ºÇÏ¿© ÇÁ·Î½ÃÀú¸¦ È£ÃâÇϱâ À§ÇÑ prepareCall ¸Þ¼­µå¸¦ »ç¿ëÇϰí ÀÖ½À´Ï´Ù. ¿©±â¼­ ¹°À½Ç¥(?)°¡ ÇÁ·Î½ÃÀú·Î Àü´ÞµÇ°í ¹Þ¾Æ¿Ã ¸Å°³º¯¼öÀÎ °ÍÀÔ´Ï´Ù.

 

n         CallableStatement cs = con.prepareCall("{call myStoredProcedure(?, ?, ?)}");

 

 setXxx ¸Þ¼­µå¸¦ ÀÌ¿ëÇÏ¿© ÇÁ·Î½ÃÀú¿¡ »ç¿ëÇÒ ÀÎÀÚ°ªÀ» ³Ö¾îÁÖ°Ô µË´Ï´Ù. ±×¸®°í ¸®ÅϵǴ °ªµéÀ» ¹Þ¾Æ¾ß°ÚÁÒ. ÀÏ¹Ý ¸Þ¼­µå¿Í ´Þ¸® ¿©·¯ °³ÀÇ ÀÎÀÚ°ªÀ» ¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù. À̶§ ½ºÅä¾îµåÇÁ·Î½ÃÀú¿¡¼­ ³Ñ¾î¿À´Â °ªÀ» ¾ò±â À§Çؼ­ registerOutParameter ¸Þ¼­µå¸¦ ÀÌ¿ëÇÏ¿© ¹ÝȯµÇ´Â °ªµéÀ» ¼ÂÆÃÇÏ°Ô µË´Ï´Ù.

 

n         cs.setInt(1,2);

n         cs.registerOutParameter(2, java.sql.Types.VARCHAR);

n         cs.registerOutParameter(3, java.sql.Types.INTEGER);

 

¹ÝȯµÇ´Â °ªÀ» ¾ò±â À§Çؼ­´Â CallableStatement¸¦ ½ÇÇàÇÑ ÈÄ ´ÙÀ½°ú °°ÀÌ ¹Ýȯ°ªÀ» ¾ò¾î ³¾ ¼ö ÀÖ½À´Ï´Ù.

 

n         cs.execute();

n         <td><%=cs.getString(2)%></td>

n         <td><%=cs.getInt(3)%></td>

 

Á¤¸®ÇØ º¸ÀÚ¸é, ÀÌ·¸°Ô CallableStatement ÀÎÅÍÆäÀ̽º´Â µ¥ÀÌÅͺ£À̽ºÀÇ ½ºÅä¾îµåÇÁ·Î½ÃÀú¸¦ È£ÃâÇϱâ À§ÇØ prepareCall ¸Þ¼­µå¸¦ ÀÌ¿ëÇÏ¿© CallableStatement °´Ã¼¸¦ »ý¼ºÇÕ´Ï´Ù. ±× prepareCall ¸Þ¼­µå´Â Connection ÀÎÅÍÆäÀ̽ºÀÇ ¸Þ¼­µåÀÔ´Ï´Ù. ½ºÅä¾îµåÇÁ·Î½ÃÀú¸¦ ½ÇÇàÇϱâ Àü¿¡ ¹Þ¾Æ¿Ã °ª¿¡ ´ëºñÇϱâ À§Çؼ­ registerOutParameter ¸Þ¼­µå¸¦ »ç¿ëÇÏ´Â °Íµµ ¸í½ÉÇØ¾ß ÇÒ Á¡ÀÔ´Ï´Ù.

 

CallableStatement ÀÎÅÍÆäÀ̽º ÁÖ¿ä ¸Þ¼­µå

public void registerOutParameter(int parameterIndex, int sqlType) throws SQLException : ÇÁ·Î½ÃÀú·Î ¹Þ¾Æ¿Â °ªÀ» JDBCŸÀÔÀ¸·Î µî·ÏÇÕ´Ï´Ù. ¸ðµç ¹Þ¾Æ¿Â °ªÀº ¹Ýµå½Ã ÀÌ °úÁ¤À» °ÅÃÄ¾ß ÇÕ´Ï´Ù. ´ëÇ¥ÀûÀÎ sqlTypeÀ» ¾Ë¾Æº¸¸é NULL, FOLAT, INTEGER, DATEµîÀÌ ÀÖ½À´Ï´Ù.

 

*PreparedStatementŬ·¡½º¸¦ »ó¼ÓÇϹǷΠgetXXX()µî, PreparedStatement°¡ °¡Áö°í ÀÖ´Â ¸Þ¼­µå¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.



jabookÀúÀÚ¸íÇÔ
Á¦¸ñ:¼Ò¼³°°ÀºJSP2ºÎ
ÀúÀÚ:ÃÖ¿µ°ü