FUNTION한번만 봐주십시오 0 6 2,096

by 이묵 [2014.07.29 18:24:25]


사용자의 부주의로 시간입력시 문자열 및 특수기호가 들어가는 경우가있어

간단하게 체크 후 변환시켜주는 FUNTION을 만들고있는데 이상한부분이있어 질문드립니다.

CODE버튼에서 입력이안되서 바로올리겠습니다

해당 FUNCTION입니다.(문제있는부분 빨간색상으로 표기해놓겠습니다)

CREATE OR REPLACE FUNCTION FUN_CQI_CONVERSION_DATE (
  I_WORD     IN     VARCHAR2     ,
  I_FORMATS  IN     VARCHAR2      ) RETURN VARCHAR2 IS
--
V_WORD     VARCHAR2(20);
V_CHECK    CHAR(4)     ;
N_LEN      NUMBER      ;
D_CHECK    DATE        ;
--
--배열선언
TYPE ARRAY_NUMBER_CHECK IS TABLE OF CHAR(1) INDEX BY BINARY_INTEGER;
ARR_NUMBER ARRAY_NUMBER_CHECK;
ARR_WORD   ARRAY_NUMBER_CHECK;
--

BEGIN
  V_WORD  := LTRIM(RTRIM(I_WORD))     ; -- 좌/우 공백제거
  N_LEN   := LENGTH(V_WORD)           ; -- 문자열 길이

  FOR N IN 1..N_LEN LOOP
      ARR_NUMBER(N) := 'Y';
    IF FUN_ORD_IS_NUMBER(SUBSTR(V_WORD,N,1)) = 'N' OR SUBSTR(V_WORD,N,1) = ' ' THEN
      ARR_WORD(N)   := SUBSTR(V_WORD,N,1);
      ARR_NUMBER(N) := 'N';
    END IF;

    V_CHECK := V_CHECK||ARR_NUMBER(N);  ->디버깅시 바로 이부분인데 처음에 배열1값은 잘들어가는데
                                                                          배열2부터 안들어가지고 바로 EXCEPTION구문으로 넘어가집니다

  END LOOP;
 
   
  IF N_LEN = 4 THEN
    --시간오류시 EX) 9X20 -> 0920으로 변환
    IF V_CHECK = 'YNYY' THEN
      V_WORD := LPAD(REPLACE(V_WORD,ARR_WORD(2),NULL),N_LEN,'0');
    --분오류시 EX) 09X2 -> 0920으로 변환 
    ELSIF V_CHECK = 'YYNY' THEN
      V_WORD := RPAD(REPLACE(V_WORD,ARR_WORD(3),NULL),N_LEN,'0');
    END IF;
  END IF;
 
  --마지막 DATE CHECK
  D_CHECK := TO_DATE(V_WORD, I_FORMATS) ; -- DATE CHECK   
  RETURN V_WORD;

 
  EXCEPTION
    WHEN OTHERS THEN
      RETURN 'XXXX';

END FUN_CQI_CONVERSION_DATE;

 

오라클쪽은 아직 많이부족한초보라 한수 부탁드립니다

 

by 아발란체 [2014.07.29 18:27:43]

Exception 메세지라 뭐라고 뜨나용? @.@)?


by 이묵 [2014.07.29 19:29:19]

아무것도 안뜨고 선언한대로 리턴값 'XXXX'만나옵니다.

저부분 문법이 맞는건가요~?


by 아발란체 [2014.07.30 02:21:22]

EXCEPTION 부분에 다음을 추가하면 DBMS 출력으로 에러 메세지를 확인 할 수 있습니다.

WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(SQLCODE);
    DBMS_OUTPUT.PUT_LINE(SQLERRM); 

 


by 이묵 [2014.07.30 08:13:53]

아~ㅎㅎ
SQLCODE값은 -6502

에러메세지는 ORA-06502: PL/SQL: 수치 또는 값 오류

라고 나옵니다


by 마농 [2014.07.30 08:25:19]

문자열 버퍼보다 큰값이 들어가서 그렇죠.
V_CHECK 의 CHAR(4) 를 VARCHAR2(4) 로 바꾸세요.
CHAR(4) 첫번째 값 저장시 이미 공백까지 포함하여 4자리 꽉 차서 들어갑니다.


by 이묵 [2014.07.30 08:55:06]

맙소사

감사합니다 마농님 해결됬습니다

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