'oracle'에 해당되는 글 9

  1. 2009/09/17 간단한 Stored Procedure 예제.
  2. 2008/02/04 Tomcat & Oracle DBCP 설정 (2)
  3. 2007/10/15 ROWNUM 으로 조건절... (1)
  4. 2007/08/03 Oracle Long 형 insert 에러... ORA-01461 (2)
  5. 2007/03/15 Eclipse 로 FTP 연동 개발. (3)
  6. 2007/01/30 Proc 의 기초..
  7. 2006/11/20 Decode..
  8. 2006/11/16 NVL 함수. (4)
  9. 2006/10/19 Toad 활용 팁..
 

간단한 Stored Procedure 예제.

프로그래밍/Database | 2009/09/17 11:46 | Posted by taesuz

Oracle Store Procedure 를 사용하게 되어서, 처음으로 SP를 사용해 보았다.
아래는 아주 간단한 예제..
예제를 쉽게 만들어서 이해 하기 아주 쉬울꺼라고 생각한다..
좀더 응용적인건 계속 추가 예정..

create table MEMBER(
  id         varchar2(12)      primary key,
  name    varchar2(10)      not null
)

insert into MEMBER values('taesuz', '조태수');

create or replace
procedure hello_proc( in_id IN VARCHAR2, out_name OUT VARCHAR2 )
is
  begin
    select name INTO out_name from MEMBER
    where id=in_id;
    dbms_output.put_line( out_name );

EXCEPTION
  WHEN NO_DATA_FOUND THEN
    out_name:='NO_DATA_FOUND';
end hello_proc;


실행:

VARIABLE name varchar2(10);
execute hello_proc('taesuz', :name);
print name;

 

결과값:

name
---
조태수


크리에이티브 커먼즈 라이선스
Creative Commons License


 

pool.jocl

<object class="org.apache.commons.dbcp.PoolableConnectionFactory"
    xmlns="http://apache.org/xml/xmlns/jakarta/commons/jocl">

   <object class="org.apache.commons.dbcp.DriverManagerConnectionFactory">
      <string value="jdbc:oracle:thin:@taesuz.net:1521:taesuzdb" />
      <string value="taesuz" />
      <string value="1111" />
   </object>
 
   <object class="org.apache.commons.pool.impl.GenericObjectPool">
      <object class="org.apache.commons.pool.PoolableObjectFactory" null="true" />
      <int value="10" />
      <byte value="1" />
      <long value="10000" />
      <int value="10" />
      <int value="3" />
      <boolean value="true" />
      <boolean value="true" />
      <long value="600000" />
      <int value="5" />
      <long value="3600000" />
      <boolean value="true" />
   </object>
 
   <object class="org.apache.commons.pool.impl.GenericKeyedObjectPoolFactory" null="true" />


   <string null="true" />
 
   <boolean value="false" />
 
   <boolean value="true" />
</object>



 

DBCPInit.java

package taesuz.dbpool;

import javax.servlet.http.HttpServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import java.util.StringTokenizer;

public class DBCPInit extends HttpServlet {

    public void init(ServletConfig config) throws ServletException {
        try {
            String drivers = config.getInitParameter("pool");
            StringTokenizer st = new StringTokenizer(drivers, ",");
            while (st.hasMoreTokens()) {
                String DB = st.nextToken();
                Class.forName(DB);
            }
           
            Class.forName("org.apache.commons.dbcp.PoolingDriver");
           
        } catch(Exception ex) {
            throw new ServletException(ex);
        }
    }
}


 

web.xml

<web-app>
 <servlet>
  <servlet-name>DBCPInit</servlet-name>
  <servlet-class>taesuz.dbpool.DBCPInit</servlet-class>
  <init-param>
   <param-name>pool</param-name>
   <param-value>oracle.jdbc.driver.OracleDriver</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>
</web-app>






설정 끝~~~~



테스트를 위한 JSP와 커넥션을 가져오는 클래스

DBConnect.java

package taesuz.dbpool;

import java.sql.*;

public class DBConnect {
 /**
  * APP/Web 환경에서 쓰이도록 지정 DBCP를 사용한다.
  * default poolName : pool
  * @return Connection
  * @throws SQLException
  */

 public static Connection getConnection() throws SQLException {
  return DriverManager.getConnection("jdbc:apache:commons:dbcp:/pool");
 }

 /**
  * APP/Web 환경에서 쓰이도록 지정 DBCP를 사용한다.
  * @param poolName
  * @return Connection
  * @throws SQLException
  */

 public static Connection getConnection(String poolName) throws SQLException {
  return DriverManager.getConnection("jdbc:apache:commons:dbcp:/"
    + poolName);
 }

}



test.jsp

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="java.sql.*" %>
<%@ page import="taesuz.dbpool.DBConnect" %>

<%
try{
 Connection conn = null;
 Statement stmt = null;
 ResultSet rs = null;

 conn = DBConnect.getConnection();
 String query = "select * from DUAL";
 stmt = conn.createStatement();
 rs = stmt.executeQuery(query);
 
 if(rs.next())
  out.print(rs.getString(1));


} catch(Exception e) {
 System.out.println(e);
} finally {
     if (rs != null) try { rs.close(); } catch (Exception e) {}
     if (stmt != null) try { stmt.close(); } catch (Exception e) {}
     if (conn != null) try { conn.close(); } catch (Exception e) {}
 }

%>



다른 관련 설정 트랙백 참조.

크리에이티브 커먼즈 라이선스
Creative Commons License

ROWNUM 으로 조건절...

프로그래밍/Database | 2007/10/15 15:24 | Posted by taesuz


ROWNUM
은 쿼리내에서 사용 가능한 가상컬럼입니다.
ROWNUM에는 숫자 1,2,3,4,...N의 값이 할당됩니다. 여기서 N은 ROWNUM과 함께 사용하는 로우의 수를 의미합니다. ROWNUM의 값은 ROW에 영구적으로 할당되지 않습니다. 테이블의 로우는 숫자와 연계되어 참조될 수 없습니다. 따라서 테이블에서 "ROW 5"를 요청할 수 있는 방법은 없습니다.

ROWNUM 값은 쿼리의 조건절이 처리되고 한 이후, 그리고 SORT, AGGREGATION 수행되기 이전에 할당됩니다.


-----------------------------------------------------------------------------------------------


[code type=sql]select * from STUDENT
     where rownum 10 between 100
[/code]

이렇게 하면 데이터가 안나온다..

쿼리를 한번더 묶고, rownum을 데이터화 시키고 사용한다..

[code type=sql]select * from (
     select rownum rnum, NAME, GRADE, AGE from STUDENT
) where rnum 10 between 100[/code]



빙고~
크리에이티브 커먼즈 라이선스
Creative Commons License

'프로그래밍 > Database' 카테고리의 다른 글

우편번호 쿼리 문... (zipcode)  (0) 2007/10/24
MySQL 쿼리 툴.... SQLyog  (0) 2007/10/22
ROWNUM 으로 조건절...  (1) 2007/10/15
서브쿼리. (SubQuery)  (0) 2006/12/08
Pro*C 개발을 하면서 느낀점...  (0) 2006/11/24
Decode..  (0) 2006/11/20
TAG oracle, rownum, SQL

메일 발송 시스템을 개발하고 있었다..

게시판에 올린글을 메일로 발송하는것이였다.

말이 메일 발송이지 DB에 insert만 하면 끝나는 거였는데..


개발을 다하고 테스트를 하는 도중.. 정말 어이없는 에러 발생..

내용을 Insert하는 CONTENT의 TYPE이 LONG 이다..



java.sql.SQLException: ORA-01461: LONG 값은 LONG 열에만 입력할 수 있습니다




이런 에러를 내뿜으면서.. 안되는거다..

그래서 글자수가 문제가 되나? 해서 봤지만.. 잘 Insert되는 것중에는,

10000자가 넘는것도 있고, 발송이 안되는건 그 이하의 것도 있고 들쑥날쑥..

'혹시 HTML코드가 문제인가?' (본문내용에 HTML코드가 삽입되어있음)

하여 HTML코드를 replaceAll() 로 정규식으로 치환하여 삭제.. 그래도 안됨..

혹시 줄바꿈에 문제가 있나? '\r\n' 처리.. 안됨..

혹시 ' <- 문자 처리에 오류가 있나? .. 그래도 안됨..

웃긴건 Insert 안되는것을.. 내 테스트 로컬에 Insert 하면 잘 들어간다..


사람 환장한다. -_-


3일동안 정말 해볼꺼 안해볼꺼 다해봤다.. 근데 오늘.. 백지화 상태에서 다시 시작..

글내용을 내가 임의로 넣고 보내봤다..

그런데.. Insert가 안된다!!!!!

뭐지 이뭐병..


그리하여 prepareStatement 를 내용 하나만 집어 넣고,

나머지는 텍스트에 붙여주는 형식으로 했다..

before)
query.append(" INSERT INTO MAIL                                ");
query.append(" (IDX, SNAME, SMAIL, TITLE, CONTENT) ");
query.append(" VALUES(                                              ")
query.append(" ?, ?, ?, ?, ? ");

after)
query.append(" INSERT INTO MAIL                                ");
query.append(" (IDX, SNAME, SMAIL, TITLE, CONTENT) ");
query.append(" VALUES(                                              ");
query.append( maxRow + "'" + sname + "'" + smail + "'" + title + "', ? )" );



이렇게 바꾸니까 된다.. 진짜 어이없네..

왜이런거지? 이유가 뭐지?

java의 버그인가 oracle의 jdbc버그인가?

아님 처리하는 부분에서 내가 모르는 부분이 있나??

대략 난감이네.. 아시는 분들 알려주세요..
크리에이티브 커먼즈 라이선스
Creative Commons License

Eclipse 로 FTP 연동 개발.

프로그래밍/Eclipse | 2007/03/15 11:23 | Posted by taesuz


회사환경은 JSP는 Weblogic 6.1 , Oracle 환경이고..

ASP는 MS-SQL, Win2k server (뭐 asp면 당연한 환경..)에서

일하고 있는데.. JSP환경에서 서버에 물려서 EditPlus로 줄곳 작업하고 있었는데,

이게 좀 어딘가 맘에 안드는겁니다.. 맞습니다.


사용자 삽입 이미지
우리 Java 개발자를 위한 최고의 툴 Eclipse 군이 저를 살살 꼬시고 있었습니다.

그러나.. Eclipse에는 FTP연결 기능이 안들어 있기 때문에..
Weblogic 환경을 제 피시에 구축할수도 없고 참.. 이것저것 뒤져보고있었는데..

Plugin 중에 AUTOFTP 라는 좋은 플러그인이 존재 하고 있었습니다. :)

FTP환경을 꾸며주고, 로컬에서 저장을 하면 그 파일을 자동으로 업로드 시켜주는것이지요!



이게 Ediplus 환경보다. 훨씬 좋은 겁니다.


Eclipse 의 기능도 쓰고, 내 피시에 자동으로 소스파일은 있을테고, 백업도 자동으로 되는셈이니

일석 이조 아니겠습니까. :)


FTP로 직접 물려서 작업하시는 분들은 한번 써보시는것도 괜찮을 듯 싶습니다.



ps. 구축후 화면은 저랑 틀릴수 있습니다. 저는 Eclipse + MyEclipse 4.1 환경입니다.


2007-03-16  추가 :   순수하게 FTP에 물려서 작업하신다면, WTP + AutoFTP 조합이 더 빠르고,
                            쾌적하네요.. 참고하세요~
 



크리에이티브 커먼즈 라이선스
Creative Commons License

'프로그래밍 > Eclipse' 카테고리의 다른 글

MyEclipse 5.5.1  (0) 2007/07/04
MyEclipse 5.1.1, 5.5.1 Download  (1) 2007/06/21
Eclipse 로 FTP 연동 개발.  (3) 2007/03/15
자동으로 getter / setter 생성..  (0) 2006/07/21
Eclipse JSP 개발시 ANT 세팅..  (2) 2006/07/18
Eclipse 실행 속도 줄이기..  (0) 2006/05/31

Proc 의 기초..

프로그래밍 | 2007/01/30 10:09 | Posted by taesuz


proc에 관한 기본적인 것에 대한 wiki 페이지가 있어 링크합니다.

http://www.joinc.co.kr/modules.php?name=News&file=article&sid=94#AEN9




열공~!
크리에이티브 커먼즈 라이선스
Creative Commons License

'프로그래밍' 카테고리의 다른 글

개발자 격언...  (0) 2007/04/28
정규식 활용. 2가지의 조건을 동시에..  (3) 2007/02/05
Proc 의 기초..  (0) 2007/01/30
쉘스크립트 활용. "테터툴즈 자동 백업"  (0) 2007/01/17
Shell Script (쉘 스크립트)..  (0) 2007/01/16
오늘의 교훈....  (2) 2006/12/07
TAG oracle, Pro*C

Decode..

프로그래밍/Database | 2006/11/20 11:16 | Posted by taesuz

DECODE

Decode(검색컬럼,  조건-1, 결과값-1,

                          조건-2, 결과값-2,..............,기본값);


[code type=oracle8]

SELECT  JOB, SAL,
                 DECODE(JOB, 'ANALYST', SAL * 1.10,
                                      'CLERK',     SAL * 1.15,
                                      'MANAGER', SAL * 1.20, SAL) SALARY
FROM EMP;

[/code]
크리에이티브 커먼즈 라이선스
Creative Commons License

'프로그래밍 > Database' 카테고리의 다른 글

서브쿼리. (SubQuery)  (0) 2006/12/08
Pro*C 개발을 하면서 느낀점...  (0) 2006/11/24
Decode..  (0) 2006/11/20
NVL 함수.  (4) 2006/11/16
Toad 활용 팁..  (0) 2006/10/19
My SQL 사용  (0) 2006/08/08
TAG Decode, oracle

NVL 함수.

프로그래밍/Database | 2006/11/16 11:40 | Posted by taesuz

- NVL

   문법: NVL( expr1, expr2 ) 형식으로 사용.

   만약 1의 값이 NULL 이라면 2의 값을 반환하고, 1이 NULL이 아니면 그냥 1의 값을 반환한다.


- NVL2

   문법: NVL2(expr, expr1, expr2)

   expr의 값이 null이 아니면 expr1, null이면 expr2

크리에이티브 커먼즈 라이선스
Creative Commons License

'프로그래밍 > Database' 카테고리의 다른 글

서브쿼리. (SubQuery)  (0) 2006/12/08
Pro*C 개발을 하면서 느낀점...  (0) 2006/11/24
Decode..  (0) 2006/11/20
NVL 함수.  (4) 2006/11/16
Toad 활용 팁..  (0) 2006/10/19
My SQL 사용  (0) 2006/08/08

Toad 활용 팁..

프로그래밍/Database | 2006/10/19 11:35 | Posted by taesuz




table desc   : 테이블명에 커서를 놓고 F4

table name 자동완성  : ctrl + .

table colum 보기  : ctrl + T

예전에 실행한 쿼리 보기 : F8

현재 커서상태에서 실행  : Shift + F9, Ctrl + Enter


from http://cafe.naver.com/toadsoft.cafe

F1

Toad 도움말 파일의 SQL Editor 부분이 표시됩니다.

F2

전체 화면 Editor Editor/Results 패널 표시 장치 사이를 전환합니다.

<SHIFT>F2

전체 화면 그리드를 전환합니다.

F3

다음으로 일치하는 것을 찾습니다.

<SHIFT>F3

이전에 일치하는 것을 찾습니다.

F4

팝업 창의 테이블, , 프로시저, 함수, 또는 패키지를 설명합니다.

F5

스크립트로 실행합니다.

F6

커서를 Editor Results 패널 사이로 전환합니다.

F7

모든 텍스트를 지웁니다.

F8

이전 SQL 문을 재호출합니다(SQL Statement Recall 창을 불러옵니다).

F9

실행문을 실행합니다.

<CTRL>F9

실행(구문 분석) 없이 실행문을 검사합니다.

<SHIFT>F9

커서 위치에서 현재 실행문을 실행합니다.

F10

오른쪽 클릭 메뉴를 표시합니다.

F11

Script 같은 실행(=F5)

F12

편집기 내용을 지정된 외부 편집기로 전달합니다.

<CTRL>A

모든 텍스트를 선택합니다.

<CTRL>C

복사

<CTRL>D

프로시저 인수를 표시합니다.

<CTRL>E

현재 실행문에서 Explain Plan 실행합니다.

<CTRL>F

텍스트를 찾습니다(Find Text 창을 불러옵니다).

<CTRL>G

라인으로 이동합니다(Goto Line 창을 불러옵니다).

<CTRL>L

텍스트를 소문자로 변환합니다.

<CTRL>M

Make Code Statement

<CTRL>N

이름이 지정된 SQL 문을 재호출합니다(SQL Statement Recall 창을 불러옵니다).

<CTRL>O

텍스트 파일을 엽니다.

<CTRL>P

Strip Code Statement

<CTRL>R

검색 바꾸기(Find and Replace Text 창을 불러옵니다)

<CTRL>S

파일을 저장합니다.

<SHIFT><CTRL>S

파일을 다른 이름으로 저장합니다.

<CTRL>T

드롭다운을 표시합니다.

<CTRL>U

텍스트를 대문자로 변환합니다.

<CTRL>V

붙여넣기

<CTRL>X

잘라내기

<SHIFT><CTRL>Z

마지막으로 취소한 작업을 재실행합니다.

<ALT><UP>

이전 실행문을 표시합니다.

<ALT><DOWN>

다음 실행문을 표시합니다(<ALT><UP> 사용한 사용)

<ALT><PgUp>

이전 탭으로 이동

<ALT><PgDn>

다음 탭으로 이동

<CTRL><ALT><PgUp>

이전 결과 패널 탭으로 이동

<CTRL><ALT><PgDn>

다음 결과 패널 탭으로 이동

<CTRL><HOME>

데이터 그리드에서는 위의 레코드셋으로 이동하며, 결과 그리드에서는 커서가 위치한 행의 번째 열로 이동하고, 편집기에서는 텍스트의 번째 열과 번째 행으로 이동합니다.

<CTRL><END>

데이터 그리드에서는 레코드셋의 끝으로 이동하며, 편집기에서는 텍스트의 마지막 열과 마지막 행으로 이동합니다. 단원의 "주의" 참조하십시오.

<CTRL><SPACE>

코드 완성 템플릿을 활성화합니다.

<CTRL><TAB>

MDI Child 창의 콜렉션을 순환합니다.

<CTRL><ENTER>

커서 이치에서 현재 SQL 문을 실행합니다.

<CTRL>. (마침표)

테이블 이름을 자동으로 완성합니다.

크리에이티브 커먼즈 라이선스
Creative Commons License

'프로그래밍 > Database' 카테고리의 다른 글

서브쿼리. (SubQuery)  (0) 2006/12/08
Pro*C 개발을 하면서 느낀점...  (0) 2006/11/24
Decode..  (0) 2006/11/20
NVL 함수.  (4) 2006/11/16
Toad 활용 팁..  (0) 2006/10/19
My SQL 사용  (0) 2006/08/08