열라 바쁜 가끔 빈곤 곰돌이

우리 딸래미가 태어난지 얼마인지 궁금해서 찾아보니 오라클에 이런 함수도 있다. 


SELECT MONTHS_BETWEEN(SYSDATE,'20150211') FROM DUAL;


MONTHS_BETWEEN 이란 함수로... 

계산하면 우리 딸은 이 글을 쓰는 현재 1.2개월이 되었다. 


엑셀에도 있을법한 함수인데 없습니다.

혹시 아신다면 엑셀로 알려주시기 바랍니다.




실제로 요새 어지간한 사칙연산은 오라클이 대신해주고 있다;;

SQLGate는 맨날 켜놓는데 반해 (먹고 살아야지;;;) 계산기는 자주켜는게 아니니;;; ㅎㅎㅎ

Comment +0

오라클에 테이블 정보등을 검색하고 거기 테이블의 데이터 개수를 구하라는 미션이 떨어졌습니다.

갑님들이 하는게 다 그렇지 뭐... 


그리하여 아래와 같이 함수를 만들었습니다.


CREATE OR REPLACE FUNCTION FN_GET_ROW_CNT(strTABLE_NAME IN VARCHAR2) RETURN VARCHAR2

IS

ROW_CNT VARCHAR2(300);

v_sql VARCHAR2(1000);


BEGIN

v_sql := 'SELECT COUNT(*) FROM '||strTABLE_NAME;

      EXECUTE IMMEDIATE v_sql INTO ROW_CNT;


   RETURN ROW_CNT;


   EXCEPTION

     WHEN NO_DATA_FOUND THEN

          RETURN(' ');

     WHEN OTHERS THEN

       RETURN('ERROR');


END FN_GET_ROW_CNT;



상단함수에서 생각해 보아야할 내용은 v_sql 이라고 쿼리를 변수로 따로 담은 부분입니다.

오라클에서는 테이블명은입력받은 변수로 바로 사용을 못합니다. 

그래서 위와 같이 변수로 입력받은 값에 쿼리 전체 문구를 만들어서 하나의 변수에 다시 넣어주어야 합니다.


그러고 나서 




SELECT

A.TABLE_NAME,

      (SELECT B.COMMENTS FROM USER_TAB_COMMENTS B WHERE A.TABLE_NAME = B.TABLE_NAME ) AS TABLE_COMMENTS,

      '' AS TABLE_DESC,

      (SELECT COUNT(C.COLUMN_NAME) FROM USER_TAB_COLUMNS C WHERE A.TABLE_NAME = C.TABLE_NAME ) AS COL_CNT,

      FN_GET_ROW_CNT(TABLE_NAME) AS ROW_CNT

FROM USER_TABLES A


위에 처럼 빨간색으로 함수를 호출하여 쓰면... 변수로 넘긴 테이블명을 이용하여 전체 갯수를 검색해줍니다.

Comment +0

SELECT * FROM TEST WHERE A = 'PJET'


위와 같이 검색하는데 결과가 잘 나오는 반면


SELECT * FROM TEST WHERE A = :A


위와 같이 바인드 변수로 해서 데이터를 입력하면 결과값이 아무것도 안나오는 놀라운 일이 벌어졌습니다. 




인터넷에 찾다가 TRIM이 있어서 적용해보니 결과가 잘 나옵니다.


원인 : A 컬럼이 CHAR(10) 이었습니다.



SELECT * FROM TEST WHERE TRIM(A) = :A


이렇게 하여 검색하면 됩니다. 




알아야 뭘 해먹지요... -_-;;;

Comment +0

TO_CHAR(TO_DATE(A.STOP_TO,'YYYYMMDD'),'YYYY-MM-DD') STOP_TO_NAME,


쿼리중에 위와 같은 쿼리를 날리니 자꾸 날짜가 이상하다고 에러가 나온다. 

코드의 문제는 아닌거같은데 자꾸 저렇게 나오니 뭔가 되게 궁금해서 

SQLGate 에서 확인해보니 일부 데이터는 잘 불러오는데 1700건이 넘어가니 바로 에러가 나온다.


오호라... 그 전까지는 에러가 없다는 거구나... 


앞에 TO_CHAR나 TO_DATE를 다 빼고 데이터의 길이를 비교해보니

한 줄의 날짜 데이터가 2013731 로 해서 7자리인것이다. 


YYYY-MM-DD이므로 날짜는 8자리가 되어야 하는데 


UPDATE F_BDA SET STOP_TO='20130731' WHERE STOP_TO='2013731'


위와 같은 쿼리를 날려주니 문제 해결...


다른 블로그에 보면 뭐 날짜 형식을 바꿔주라고 해서 ALTER를 하라는 블로그들도 많은데

정말 그런문제도 있는 반면 이런 문제도 있으니 확인해보는게 좋을거 같아 블로그에 남김.


나처럼 남들은 삽질하지 말길 바라며 ㅋㅋㅋ

Comment +0

SELECT  A.MID, B.CID, D.AID
FROM CS_MASTER_MAIN A, CS_CONTENTS_MAIN B, CS_FILE_MAIN C
WHERE A.MID = B.MID  AND B.CID = C.CID


SELECT 
CM.CID, -- CID(컨텐츠 메인)
'', -- CONTENTS CODE
MM.PID, -- PID
'', -- CONTENTS COUNT
'audio/mpeg', -- MIME_TYPE
'2', -- Encryption Method
'파일레벨의 FILE_PATH , source_path', -- NAS Input Path
'', -- NAS Output Path
CM.TITLE, -- TITLE
CM.DESCRIPTION, -- DESCRIPTION
'', -- COPYRIGHT
MA.BUBBING_ARTIST, -- PERFORMER
MA.WRITER, -- AUTHOR
'', -- GENRE
CM.CATEGORY_1, -- CLASSIFICATION
CM.KEYWORD, -- KEYWORD
CM.COUNTRY_ORIGIN, -- LOCATION
'', -- ALBUM
CM.CREATION_DATE , -- YEAR
'' -- RESULT
FROM CS_CONTENTS_MAIN CM, CS_MASTER_AUDBOOK MA, CS_MASTER_MAIN MM
WHERE CM.CID = MA.MID AND MA.MID = MM.PID

Comment +0

-- 트리거 작성 절차 

CREATE OR REPLACE TRIGGER -- 트리거 이름
AFTER INSERT OR DELETE OR UPDATE ON -- 트리거가 실행될 테이블 이름
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
-- 각각의 변수명 선언, 낫널은 설정하지 않는다. 변수명(CP_NO CHAR(5) 이후 반드시 세미콜론(;)으로 끝맺는다.
-- 이미 테이블들에 있는 변수는 설정하지 않는다. 새롭게 사용할 변수만 설정하자.

BEGIN -- 트리거 시작
INSERT INTO ( -- 트리거 실행 테이블에서 트리거가 저장될 테이블명
-- 인서트 구문을 작성한다.
-- 만약 다른 구문들이 필요하다면 추가로 작성하고 
-- IF문 등을 사용할수 있다.
) VALUES (

-- 들어갈 데이터들 :OLD. 인지 :NEW. 인지 구분하도록 한다. (현재 작업들은 전부 :NEW로 시작하자)
); -- 보통의 테이블 인서트 구문처럼 완료한다.
END;





기본적인 트리거 생성에는 이와같은 경우 외에는 거의 변경이 없다.
 PL/SQL 문이므로 필요한 경우 창의적(?) 코딩을 하자... -_-; 
그래놓고 나도 맨날 남의거 베껴다 쓰곤 하지;;;

Comment +0