function (토큰길이구하는) 함수인데요, 널값 인식을 잘 못하는듯... 0 3 1,941

by 옹네 [2008.11.26 17:21:56]


하단에 토큰 길이를 구하는 함수입니다. (--------) 이거 아래.

select sf_acm_token_count('|201|301|601|801|901|121|201'   , '|') from dual;

이 쿼리를 날리면 7개 정상으로 리턴해줍니다.

select sf_acm_token_count(''   , '|') from dual

이렇게 널값을 넘기면 0 값 리턴하라고 함수처리해 준거 같은데...

마치 무한루프 도는거마냥 바로 안나오고... 계속 진행시간이 나옵니다. (토드에서..)

분명히 널값이나 '' 처리 해주었는데..

그 부분을 인식 못하는거 같아요.

무엇이 잘못되었는지 도움좀...

ㅠㅠ

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

CREATE OR REPLACE FUNCTION ACCT.sf_acm_token_count (
   arg_val       varchar2, -- 대상문자열
   arg_token     varchar2  -- 토큰문자
)
   RETURN integer IS
  
   li_idx         integer       := 0;
   li_end         integer       := 1;
   li_start       integer       := 1;
   li_total       integer       := 0;
   str_flag       varchar2(1)   := 'S';
BEGIN
    if arg_val = null or arg_val = '' then
        return 0;
    end if;
   
    li_total := length(arg_val);
   
    if li_total = 0 then
       return li_total;
    end if;
   
    while  str_flag = 'S' loop
        li_end := instr(arg_val, arg_token, li_start);
        if li_end <> 1 then
            if li_end = 0 then
                li_end := li_total + 1;
                str_flag := 'E';
               
                if substr(arg_val,length(arg_val),'1') = '|' then
                    li_idx := li_idx - 1;
                end if;
            end if;
           
            li_idx   := li_idx + 1;
        end if;
       
        li_start := li_end + 1;
    end loop;
   
    RETURN li_idx;

EXCEPTION
    WHEN OTHERS THEN
    return 0;
END sf_acm_token_count;
/

by 대궁이 [2008.11.26 17:24:25]
체크하실때
if arg_val = null or arg_val = '' then

if arg_val is null or arg_val = '' then
로 바꾸시면 될겁니다^^ null 은 is null 체크를;

by 호야 [2008.11.26 17:40:17]
컬럼의 데이터가 | 와 1234567890 으로 이루어 진다면
FUNCTION 말고 SQL 내장함수로도 가능합니다만

NVL(LENGTH(TRANSLATE('', '|1234567890','|')),0) RESULT

by 채용근 [2008.11.26 17:51:23]
SELECT NVL(LENGTH( REGEXP_REPLACE ( COL, '\d', '' ) ), 0 ) FROM DUAL

10g면 이렇게도 가능
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입