제목 그대로다

 PreparedStatement 에서 LIKE 를 쓰고 싶을때, '?' 와 '%' 합치는 법

출처 :  http://mainia.tistory.com/557 녹두장군님



웹 어플리케이션 작업시 sql 쿼리를 보통 properties xml 로 문자열을 만들어 빼놓는다.

예전처럼 무식하게 쿼리를 문자열 합치기로 소스상에서 사용하지는 않는다여러가지 문제가

많기 때문이다.

 

쿼리에서 동적으로 변하는 데이타는 ? 를 써서 문자열을 만들고 PreparedStatement 사용해

파라미터 값을 맵핑시킨다아래는 스프링의 예이다스프링은 framework 내부에 PreparedStatement

사용해서 맵핑을 구현해 놓았고 우리가 사용하는 부분은 아래와 같이 함수에 파라미터로

갯수에 맞게 Objec 배열로 넘기면 된다.

 

쿼리문자열

test.srch.select = \n\

           select * from board where id = ? \n\

 

String sql = message.getMessage("test.srch.select");

getJdbcTemplate().queryForList(sql, new String[]{srchText});

 

일반적인 쿼리문자열은 이렇게 적용을 하면 되는데 문제는 like 를 사용할때 이다.

보통 사용하는 것처럼 like %?% 로 하면 안된다. % 문자와 ? 맵핑할 문자를 합쳐야 된다.

RDBMS 프로그램에 따라 차이가 있다. Oracle 일때에는  like '%' || ? || '%' 사용하면 된다.

중간에 ORM framework 인 iBatis 를 사용할 경우에는 like '%' || #?# || '%' 이다.

 

 

하지만 MySql 일 경우에는 이것이 통하지 않는다그래서 문자열을 합치는 함수를 사용해

해결하였다일반적인 경우는 like concat ('%', ?, '%') 이며 

iBatis 
라고 한다면

like concat ('%', #?#, '%') 사용해서 처리 하면된다.



 
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST



윈도우7 64bit 에서

오라클 sql developer 가 java.exe 를 찾지 못하면서  실행되지 않는 이유는

JDK 가 64bit 용이기 때문이다.

오라클 Sql Developer 는  64bit java.exe 를 사용하지 못한다.

그래서 JDK 를 32bit 버전을 깔고,

그 패스를 지정해주면 정상적으로 실행된다. 






Oracle SQL Developer unable to find Java Virtual Machine

Published: April 21, 2011 , Updated: April 21, 2011 , Author: mkyong

Problem

Here’s my PC environment :

  1. Database : Oracle 11g
  2. OS Platform : Windows 7 Ultimate 64 bits
  3. JDK : 1.6 .0_24, 64 bits

While click on the Oracle SQL developer, it prompts me to key in the JDK folder. However, after i specified the JDK folder, it prompts me following error dialog box :


Oracle SQL developer is NOT support on 64 bits JDK. To solve it, install a 32 bits / x86 JDK and update your SQL developer config file, so that it points to the 32 bits JDK.

Fix it!
Edit the “sqldeveloper.conf“, which can be found under “{ORACLE_HOME}\sqldeveloper\sqldeveloper\bin\sqldeveloper.conf“, make sure “SetJavaHome” is point to your 32 bits JDK.

For example, “SetJavaHome C:\Program Files (x86) \Java\jdk1.6.0_13“.


YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


PL/SQL 이란 ?

- PL/SQL 은 Oracle's Procedural Language extension to SQL. 의 약자 입니다.
- SQL 문장에서 변수정의, 조건처리(IF), 반복처리(LOOP, WHILE, FOR)등을 지원하며,

오라클 자체에 내장되어 있는 Procedure Language 입니다
- DECLARE 문을 이용하여 정의되며, 선언문의 사용은 선택 사항입니다.
- PL/SQL 문은 블록 구조로 되어 있고 PL/SQL 자신이 컴파일 엔진을 가지고 있습니다.


PL/SQL 의 장점

- PL/SQL 문은 BLOCK 구조로 다수의 SQL 문을 한번에 ORACLE DB 로 보내서 처리하므로 수행속도를 향상 시킬수 있습니다.
- PL/SQL 의 모든 요소는 하나 또는 두개이상의 블록으로 구성하여 모듈화가 가능하다.
- 보다 강력한 프로그램을 작성하기 위해서 큰 블록안에 소블럭을 위치시킬 수 있습니다.
- Variable, Constant, Cursor, Exception 을 정의하고, SQL 문장과 Procedural 문장에서 사용합니다.
- 단순, 복잡한 데이터형태의 변수를 선언합니다.
- 테이블의 데이터 구조와 DataBase 의 컬럼럼에 준하여 동적으로 변수를 선언 할 수 있습니다.
- Exception 처리 루틴을 이용하여 Oracle Server Error 를 처리합니다.
- 사용자 정의 에러를 선언하고 Exception 처리 루틴으로 처리 가능 합니다.

PL/SQL Block Structure

- PL/SQL 은 프로그램을 논리적인 블록으로 나누는 구조화된 블록 언어 입니다.
- PL/SQL 블록은 선언부(선택적), 실행부(필수적),예외 처리부(선택적)로 구성되어 있고, BEGIN 과 END 키워드는 반드시 기술해 주어야 합니다.
- PL/SQL 블록에서 사용하는 변수는 블록에 대해 논리적으로 선언할 수 있고 사용할 수 있습니다.

◈ Declarative Section(선언부)
- 변수, 상수, CURSOR, USER_DEFINE Exception 선언

◈ Executable Section(실행부)
- SQL, 반복분, 조건문실행
- 실행부는 BEGIN 으로 시작하고 END 로 끝납니다.
- 실행문은 프로그램 내용이 들어가는 부분으로서 필수적으로 사용되어야 합니다.

◈ Exception Handling Section(예외처리)
- 예외에 대한 처리.
- 일반적으로 오류를 정의하고 처리하는 부분으로 선택 사항입니다.




● DECLARE
- Optional
- Variables, cursors, user-defined exceptions
● BEGIN
- Mandatory
- SQL Statements
- PL/SQL Statements
● EXCEPTION
- Actions to perform when errors occur
● END;
- Mandatory



PL/SQL 프로그램의 작성 요령

- PL/SQL 블록내에서는 한 문장이 종료할 때마다 세미콜론(;)을 사용합니다. .
- END 뒤에 ;을 사용하여 하나의 블록이 끝났다는 것을 명시 합니다.
- PL/SQL 블록의 작성은 편집기를 통해 파일로 작성할 수도 있고, SQL 프롬프트에서 바로 작성할 수도 있습니다.
- SLQ*PLUS 환경에서는 DELCLARE 나 BEGIN 이라는 키워드로 PL/SQL 블럭이 시작하는 것을 알 수 있습니다.
- 단일행 주석 : --
- 여러행 주석 : /* */
- PL/SQL 블록은 행에 / 가 있으면 종결됩니다.

출처 : http://www.oracleclub.com/oraclelecture.action?lectureType=PLSQL
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


프로시져란?

 - 특정 작업을 수행할수 있고, 이름이 있는 PL/SQL 블록으로서. 매개 변수를 받을 수 있고..

반복적으로 사용할 수 있는거죠.. 보통 연속 실행 또는 구현이 복잡한 트랜잭션을 수행하는 PL/SQL 블록을 데이터 베이스에 저장하기 위해 생성합니다.
⊙ CREATE OR REPLACE 구문을 사용하여 생성합니다.
⊙ IS 로 PL/SQL 의 블록을 시작합니다.
⊙ LOCAL 변수는 IS 와 BEGIN 사이에 선언합니다.




프로시저 작성방법입니다.

// 리턴값이 없는 프로시져입니다. 
// 모든 파라미터 타입이 'IN' 입니다.

create or replace PROCEDURE setContent
(in_id VARCHAR2, in_title VARCHAR2, in_body VARCHAR2, in_password VARCHAR2, in_fileName VARCHAR2)
// Parameter Type 이 in, 인자 out 인지 생략되어 있는데
// 생략할 경우 in_in in VARCHAR2 처럼 in 으로 인식됩니다. 

is

BEGIN
INSERT INTO
margo VALUES(
margo_sequence.NEXTVAL,
in_id,
in_title,
in_body,
in_password,
0,
0,
sysdate,
in_fileName
);
commit; // 커밋을 해야합니다. 만약 트랜잭션의 경우 예외처리를 두어서 RollBack 도 생각해볼수 있습니다.
end;
 


위 구문에서 'create or replace' 뜻은 없으면 프로시져를 생성하고, 있으면 수정하라는 뜻 입니다.

'is' 로 PL-SQL 블록을 시작합니다.

LOCAL 변수는 IS 와 BEGIN 사이에 선언합니다.

위 예제는 리턴값이 없는 디비에 in 만하는 예제였습니다.




다음 예제는 디비에 입력후에 리턴값을 받아보는 예제입니다.

create or replace PROCEDURE getContentTest
(in_article_num NUMBER, out_title
OUT varCHAR2, out_hit OUT NUMBER)
//리턴받는 파라미터로 2개를 주겠습니다.


is
BEGIN
SELECT
title,
hit
INTO
out_title,
out_hit
FROM margo
WHERE article_num = in_article_num;
commit;
end;
/ <<<<<<<<<-----  끝낼때는 무조건 '/' 기호를 붙이면 프로시져 작성이 끝납니다. 


article_num 이 입력받은 파라미터인  
in_article_num 과 같은 글의 title과 hit 을 가져와서 INTO out_title, out_hit에

입력하고 있습니다.

이렇게 입력된 파라미터는 리턴되어 외부에서 callableStatement 에서 심어진 인덱스번호로 뽑아낼수있습니다.




이제 위 프로시져를 사용하는 자바코드를 보겠습니다.

  
private CallableStatement cstmt = null;

..................


try{
conn = this.getConnection();
cstmt = conn.prepareCall("{call getContentTest( ?, ?, ? )}"); // 3개를 심습니다.
cstmt.setInt(1, article_num); // 첫번째는 가져올 컨텐츠의 글번호 입니다.
cstmt.registerOutParameter(2,Types.CHAR); //  저위의 예제에서 OUT 파라미터 와 매핑되는 리턴입니다.

cstmt.registerOutParameter(3,Types.INTEGER);  
//  저위의 예제에서 OUT 파라미터 와 매핑되는 리턴입니다.

cstmt.executeUpdate();
System.out.println("타이틀은 : " + cstmt.getString(2));
System.out.println("힛은 : " + cstmt.getInt(3));
} catch(Exception e){
e.printStackTrace();
}finally{
closeDoor();
}

 
{call getContentTest( ?, ?, ? )} 프로시져를 부를때는 

{} 괄호 사이에 프로시저명 앞에 call 을 붙이고,
인자를 순서와 개수에 맞게 입력해주면 됩니다. 


 

cstmt.registerOutParameter(2,Types.CHAR); 

cstmt.registerOutParameter(3,Types.INTEGER); 

보통의 리턴값은 ResultSet 을 이용해서 받지만 

프로시져를 이용하면 리턴값은 CallableStatement 자체가 됩니다.

심어놓은 인덱스번호를 그대로 뽑아내면 됩니다.


registerOutParameter() 메소드를 이용해서 (? 를심어놓은 순번, 리턴받을 타입) 을 해서, 리턴값을 받은다음

cstmt.getString(2) <<-- 이런식으로 순번을 적어서 값을 이용할수 있습니다. 











 
 
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST