database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 38672 게시물 읽기
No. 38672
오라클에서 배열 문자 중 특정 순차의 문자를 가져오는 함수에서 오류 문의
작성자
gemini2k
작성일
2011-07-07 19:58
조회수
4,637

/*==================================================================================================

P_ARRAY               VARCHAR2,     예) 테스트치⊥테스트⊥테스⊥

P_CASE                VARCHAR2,      예) ⊥ 
P_ORDER               NUMBER         예) 1

위의 예로 실행을 했을때 단어 끝에 '치' 라는 글자만 들어가면 깨집니다.

어떻게 처리를 해야하는지 답변주시면 감사하겠습니다.

AMERICAN_AMERICA.US7ASCII 입니다.

==================================================================================================*/

 

CREATE OR REPLACE FUNCTION F_ARRAY
(
    P_ARRAY               VARCHAR2,                                                                 --배열 문자
    P_CASE                VARCHAR2,                                                                 --구분자
    P_ORDER               NUMBER                                                                    --순서
)
RETURN VARCHAR2
IS
    V_I                   PLS_INTEGER := 0;
    V_J                   PLS_INTEGER := 0;
    V_S                   NUMBER;
BEGIN
    IF P_ARRAY IS NULL THEN RETURN P_ARRAY; END IF;
    IF P_ORDER = 0 THEN RETURN NULL; END IF;
   
    V_S := LENGTH(P_CASE);
   
    IF P_ORDER = 1 THEN

        V_I := INSTR(P_ARRAY, P_CASE);

        IF V_I > 0 THEN RETURN RTRIM(SUBSTR(P_ARRAY, 1, V_I - 1), CHR(161));
        ELSE            RETURN P_ARRAY;
        END IF;

    END IF;

    V_I := INSTR(P_ARRAY, P_CASE, 1, P_ORDER - 1);
    V_J := INSTR(P_ARRAY, P_CASE, 1, P_ORDER);

    IF V_I = 0 AND V_J = 0 THEN RETURN NULL; END IF;
       
    IF V_I <> 0 AND V_J = 0 THEN RETURN RTRIM(SUBSTR(P_ARRAY, V_I + V_S), CHR(161)); END IF;
   
    RETURN RTRIM(SUBSTR(P_ARRAY, V_I + V_S, V_J - V_I - 1), CHR(161));

EXCEPTION WHEN OTHERS THEN
    RETURN NULL;
END;

이 글에 대한 댓글이 총 1건 있습니다.

TRIM 구문의 CHR(161) 이 문제네요.
SELECT DUMP('치') FROM dual;
결과==> Typ=96 Len=2: 196,161
왜? 이 문자로 트림하나요? 그래야 할 이유가 없어보입니다.
오라클 10g 이상이라면 굳이 사용자 함수를 이용할 필요 없을 듯.
REGEXP_SUBSTR(p_array, '[^'||p_case||']+', 1, p_order)

마농(manon94)님이 2011-07-08 10:17에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
386789와 11에서 구문 에러 차이 발생 [1]
gugizi
2011-07-10
3484
38675오라클 접속지연
초보DB
2011-07-08
4365
38674쿼리질문이요~ [2]
busters
2011-07-08
3117
38672오라클에서 배열 문자 중 특정 순차의 문자를 가져오는 함수에서 오류 문의 [1]
gemini2k
2011-07-07
4637
38670오라클 클라이언트 와 developer suite를 같이 설치하면...
박제권
2011-07-07
3691
38669(주)DB웍스 임직원 분들께 감사드립니다. [2]
사람넷
2011-07-07
5380
38668고수님들 Query부탁드립니다 [2]
jinkuidong
2011-07-06
4565
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.052초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다