오라클 사용자 함수를 만들고 싶은데요. 0 4 811

by 동글동글 [PL/SQL] [2017.09.17 23:44:04]


CREATE OR REPLACE FUNCTION strday (v_str VARCHAR2, v_del VARCHAR2 DEFAULT '-')
RETURN varchar2 
IS 
v_strday VARCHAR(50);
BEGIN

SELECT SUBSTR(v_str,1,4)||v_del||SUBSTR(v_str,5,2)||v_del||SUBSTR(v_str,7,2) INTO v_strday
FROM dual;

RETURN v_strday;
END;

 

 

20170917 을 매개변수로 넘겼을시에 2017-09-17로 표현해주는 함수를 짜려고 하는데요

자릿수가 8자리 이하면 들어온 값 그대로 출력하고 싶습니다.

 

201709만 입력시 201709로 출력..

 

begin 이후에 if문으로 제어하면 되나요?

if length(strday)<8 then v_strday :=v_str

 

이런식으로 작성했는데 아니라고 떠서

어찌 짜야하는지 감이 안오네요...도움부탁드립니다~!!

by jkson [2017.09.18 08:46:17]
CREATE OR REPLACE FUNCTION estrday (v_str VARCHAR2, v_del VARCHAR2 DEFAULT '-')
RETURN varchar2 
IS
v_strday VARCHAR(50);
BEGIN

IF LENGTH(v_str)<8 THEN
   RETURN v_str;
END IF;
SELECT SUBSTR(v_str,1,4)||v_del||SUBSTR(v_str,5,2)||v_del||SUBSTR(v_str,7,2) INTO v_strday
FROM dual;
 
RETURN v_strday;
END;

이렇게 하시면 되긴하는데..

되도록 function을 쓰시지 마시고

쿼리에서 해결하세요. 결과 row가 많을 경우 function이 많을 수록 성능이 안 좋아집니다.

 


by 우리집아찌 [2017.09.18 09:04:15]
/* 쿼리에서 표현하자면 */
WITH T AS (
SELECT '201709' DT FROM DUAL UNION ALL
SELECT '20170917' FROM DUAL 
)

SELECT CASE WHEN LENGTH(DT)=8  THEN REGEXP_REPLACE(DT,'(.{4})(.{2})(.{2})' , '\1-\2-\3' )  ELSE DT END  
  FROM T 

 


by 마농 [2017.09.18 10:28:59]

1. Select Into 쓰면 성능 저하됩니다.
  - Select 없이 바로 변수에 대입하세요.
  - v_strday := SUBSTR(v_str,1,4)||v_del||SUBSTR(v_str,5,2)||v_del||SUBSTR(v_str,7,2);
2. varchar 대신 varchar2 쓰세요.
  - varchar(50) ==> varchar2(10)


by 동글동글 [2018.01.02 11:39:10]

모두 감사합니다~!

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