:meta-keywords: prepare statement, execute prepared, deallocate prepare, drop prepare ****************** PREPARED STATEMENT ****************** prepared statement ê¸°ëŠ¥ì€ ë³´í†µ JDBC, PHP, ODBC ë“±ì˜ ì¸í„°íŽ˜ì´ìФ 함수를 통해서 ì‚¬ìš©í• ìˆ˜ 있는ë°, SQL ë ˆë²¨ì—ì„œë„ ì§ì ‘ ìˆ˜í–‰í• ìˆ˜ 있다. prepared statement ì‚¬ìš©ì„ ìœ„í•´ 다ìŒì˜ SQL ë¬¸ì„ ì œê³µí•œë‹¤. * ì‹¤í–‰í•˜ê³ ìž í•˜ëŠ” SQL ë¬¸ì„ ì¤€ë¹„í•œë‹¤. :: PREPARE stmt_name FROM preparable_stmt * prepared statement를 실행한다. :: EXECUTE stmt_name [USING value [, value] ...] * prepared statement를 í•´ì œí•œë‹¤. :: {DEALLOCATE | DROP} PREPARE stmt_name .. note:: * SQL ìˆ˜ì¤€ì˜ PREPARE ë¬¸ì€ CSQL ì¸í„°í”„리터ì—서만 ì‚¬ìš©í• ê²ƒì„ ê¶Œìž¥í•œë‹¤. ì‘ìš© 프로그램ì—서 사용하는 경우 ì •ìƒ ë™ìž‘ì„ ë³´ìž¥í•˜ì§€ 않는다. * SQL ìˆ˜ì¤€ì˜ PREPARE ë¬¸ì€ DB ì—°ê²° 당 개수가 최대 20개로 ì œí•œëœë‹¤. SQL ìˆ˜ì¤€ì˜ PREPARE ë¬¸ì€ DB ì„œë²„ì˜ ë©”ëª¨ë¦¬ ìžì›ì„ 사용하므로 DB 서버 ë©”ëª¨ë¦¬ì˜ ë‚¨ìš©ì„ ë°©ì§€í•˜ê¸° 위해 ì œí•œëœë‹¤. * ì¸í„°íŽ˜ì´ìФ í•¨ìˆ˜ì˜ prepared statement는 브로커 파ë¼ë¯¸í„°ì¸ :ref:`MAX_PREPARED_STMT_COUNT <max-prepared-stmt-count>` 를 통해 DB ì—°ê²° 당 prepared statement 개수가 ì œí•œëœë‹¤. PREPARE 문 ========== **PREPARE** ë¬¸ì€ **FROM** ì ˆì˜ *preparable_stmt* ì— ì§€ì •ëœ ì§ˆì˜ë¬¸ì„ ì¤€ë¹„í•˜ê³ , ì´í›„ì— í•´ë‹¹ SQL ë¬¸ì„ ì°¸ì¡°í• ë•Œ 사용ë ì´ë¦„ì„ *stmt_name* ì— í• ë‹¹í•œë‹¤. ì˜ˆì œëŠ” :ref:`execute-statement` ì„ ì°¸ê³ í•œë‹¤. :: PREPARE stmt_name FROM preparable_stmt * *stmt_name* : prepared statementì˜ ì´ë¦„ì„ í• ë‹¹í•œë‹¤. 해당 í´ë¼ì´ì–¸íЏ ì„¸ì…˜ì— ì´ë¯¸ ë™ì¼í•œ *stmt_name* ì„ ê°€ì§€ëŠ” SQL ë¬¸ì´ ì¡´ìž¬í•˜ë©´, 기존 prepared statementì„ í•´ì œí•œ 후 새로운 SQL ë¬¸ì„ ì¤€ë¹„í•œë‹¤. 주어진 SQL ë¬¸ì˜ ì˜¤ë¥˜ë¡œ ì¸í•´ **PREPARE** ë¬¸ì´ ì •ìƒ ìˆ˜í–‰ë˜ì§€ 않는 경우, 해당 SQL ë¬¸ì— í• ë‹¹ëœ *stmt_name* ì€ ì¡´ìž¬í•˜ì§€ 않는 것으로 처리ëœë‹¤. * *preparable_stmt* : 반드시 ë‹¨ì¼ SQL 문ì´ì–´ì•¼ 하며, 여러 ê°œì˜ SQL ë¬¸ì„ ì§€ì •í• ìˆ˜ 없다. *preparable_stmt* ì¸ìžì— ë°”ì¸ë“œ 파ë¼ë¯¸í„°(?)를 ì‚¬ìš©í• ìˆ˜ 있으며, ì´ë¥¼ 따옴표로 ê°ì‹¸ì§€ 않아야 한다. .. note:: **PREPARE** ë¬¸ì€ ì‘ìš© í”„ë¡œê·¸ëž¨ì´ ì„œë²„ì— ì—°ê²°í•˜ë©´ì„œ 시작ë˜ë©° ì‘ìš© í”„ë¡œê·¸ëž¨ì´ ì—°ê²°ì„ ì¢…ë£Œí•˜ê±°ë‚˜ 세션 ê¸°ê°„ì´ ë§Œë£Œë˜ê¸° ì „ê¹Œì§€ ìœ ì§€ëœë‹¤. 세션 ê¸°ê°„ì€ ì‹œìŠ¤í…œ 파ë¼ë¯¸í„°ì˜ **session_state_timeout** 파ë¼ë¯¸í„°ë¡œ ì„¤ì •í• ìˆ˜ 있으며, ê¸°ë³¸ê°’ì€ **21600** ì´ˆ(=6시간)ì´ë‹¤. ì„¸ì…˜ì— ì˜í•´ 관리ë˜ëŠ” ë°ì´í„°ëŠ” **PREPARE** 문 ì™¸ì— ì‚¬ìš©ìž ì •ì˜ ë³€ìˆ˜, 가장 ë§ˆì§€ë§‰ì— ì‚½ìž…í•œ ID(**LAST_INSERT_ID**), 가장 ë§ˆì§€ë§‰ì— ì‹¤í–‰í•œ ë¬¸ìž¥ì— ì˜í•´ ì˜í–¥ ë°›ì€ ë ˆì½”ë“œì˜ ê°œìˆ˜(**ROW_COUNT**)를 í¬í•¨í•œë‹¤. .. _execute-statement: EXECUTE 문 ========== **EXECUTE** ë¬¸ì€ prepared statementì„ ì‹¤í–‰í•˜ë©°, prepared statementì— ë°”ì¸ë“œ 파ë¼ë¯¸í„°(?)를 í¬í•¨í•˜ë©´ **USING** ì ˆ ë’¤ì— ë°ì´í„° ê°’ì„ ë°”ì¸ë”©í• 수 있다. **USING** ì ˆì—서는 세션 변수ë¿ë§Œì´ ì•„ë‹ˆë¼ ë¦¬í„°ëŸ´, ìž…ë ¥ 파ë¼ë¯¸í„°ì™€ ê°™ì€ ê°’ë„ ì§€ì •í• ìˆ˜ 있다. :: EXECUTE stmt_name [USING value [, value] ...] * *stmt_name* : ì‹¤í–‰í•˜ê³ ìž í•˜ëŠ” prepared statementì— ë¶€ì—¬ëœ ì´ë¦„ì„ ì§€ì •í•œë‹¤. *stmt_name* ì´ ìœ íš¨í•˜ì§€ 않거나 prepared statementê°€ 존재하지 않는 경우 ì—러가 ì¶œë ¥ëœë‹¤. * *value* : ë°”ì¸ë“œ 파ë¼ë¯¸í„°ê°€ prepared statementì— ìžˆëŠ” 경우 ë°”ì¸ë”©í• ë°ì´í„°ë¥¼ ìž…ë ¥í•œë‹¤. ë°”ì¸ë“œ 파ë¼ë¯¸í„°ì™€ ë°ì´í„°ì˜ 개수 ë° ìˆœì„œê°€ 대ì‘ë˜ì–´ì•¼ 한다. ê·¸ë ‡ì§€ 않으면 ì—러가 ì¶œë ¥ëœë‹¤. .. code-block:: sql PREPARE st FROM 'SELECT 1 + ?'; EXECUTE st USING 4; :: 1+ ?:0 ========================== 5 .. code-block:: sql PREPARE st FROM 'SELECT 1 + ?'; SET @a=3; EXECUTE st USING @a; :: 1+ ?:0 ========================== 4 .. code-block:: sql PREPARE st FROM 'SELECT ? + ?'; EXECUTE st USING 1,3; :: ?:0 + ?:1 ========================== 4 .. code-block:: sql PREPARE st FROM 'SELECT ? + ?'; EXECUTE st USING 'a','b'; :: ?:0 + ?:1 ========================== 'ab' .. code-block:: sql PREPARE st FROM 'SELECT FLOOR(?)'; EXECUTE st USING '3.2'; :: floor( ?:0 ) ========================== 3.000000000000000e+000 DEALLOCATE PREPARE 문, DROP PREPARE 문 ====================================== **DEALLOCATE PREPARE** 문과 **DROP PREPARE** ë¬¸ì€ ë™ì¼í•˜ë©°, prepared statement를 í•´ì œí•œë‹¤. **DEALLOCATE PREPARE** 문 ë˜ëŠ” **DROP PREPARE** ë¬¸ì„ ìˆ˜í–‰í•˜ì§€ 않ë”ë¼ë„ í´ë¼ì´ì–¸íЏ ì„¸ì…˜ì´ ì¢…ë£Œë˜ë©´, ì„œë²„ì— ì˜í•´ ëª¨ë“ prepared statementê°€ ìžë™ í•´ì œëœë‹¤. :: {DEALLOCATE | DROP} PREPARE stmt_name * *stmt_name* : í•´ì œí•˜ê³ ìž í•˜ëŠ” prepared statementì— ë¶€ì—¬ëœ ì´ë¦„ì„ ì§€ì •í•œë‹¤. *stmt_name* ì´ ìœ íš¨í•˜ì§€ 않거나 prepared statementê°€ 존재하지 않으면 ì—러가 ì¶œë ¥ëœë‹¤. .. code-block:: sql DEALLOCATE PREPARE stmt1;