1. SELECT 쿼리 예제
// 숫자형을 리턴할때
int countOfActorsNamedJoe = this.jdbcTemplate.queryForInt(
"select count(0) from t_actors where first_name = ?", new Object[]{"Joe"});

// 도메인 객체와 매핑할때
public Collection findAllActors() {
return this.jdbcTemplate.query( "select first_name, surname from t_actor", new ActorMapper());
}
private static final class ActorMapper implements RowMapper {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Actor actor = new Actor();
actor.setFirstName(rs.getString("first_name"));
actor.setSurname(rs.getString("surname"));
return actor;
}
}

2. INSERT, UPDATE, DELETE 쿼리 예제
this.jdbcTemplate.update(
"insert into t_actor (first_name, surname) values (?, ?)",
new Object[] {"Leonor", "Watling"});

SQL문만 다를뿐 모두 update 메서드를 사용하면 된다.
또한 간단한 스토어드프로시져도 update메서드를 이용할수 있다.
this.jdbcTemplate.update(
"call SUPPORT.REFRESH_ACTORS_SUMMARY(?)",
new Object[]{Long.valueOf(unionId)});


3.기타
그밖에 DDL 같은 특수한 쿼리를 실행할때는 execute()메서드를 사용하기도 한다.
this.jdbcTemplate.execute("create table mytable (id integer, name varchar(100))");


출처 : 
http://yunsunghan.tistory.com/239
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