SELECT OBJECT_NAME, STATUS
, TO_CHAR(CREATED,'YYYY-MM-DD HH24:mi:ss') as CREATED
, TO_CHAR(LAST_DDL_TIME,'YYYY-MM-DD HH24:mi:ss') as LAST_DDL_TIME
FROM USER_OBJECTS
WHERE OBJECT_TYPE = 'PROCEDURE'
AND OBJECT_NAME LIKE '%PRO_IF_T_%'
주문 > 취소 관계아 아래 데이터와 같을때.. START WITH ~ CONNECT BY 절을 사용하여 하나의 주문에 엮여 있는 취소 건들을 하나로 조회할 수있다.
[주문정보] * 주문정보가 있어야 취소가 가능하다.
SELECT
A."주문번호"
, A."원주문번호"
, B."주문상품순번"
, DECODE(A."구분", 1, '매출', 2, '취소') AS "주문구분"
, B."금액합계"
, A."주문일"
FROM
주문_마스터 A,
주문_상품 B
WHERE 1=1
AND A."주문번호" = B."주문번호"
AND A."주문번호" = 'OR00000000000001' -- 주문번호
[취소정보]
SELECT
A."주문번호"
, A."원주문번호"
, B."주문상품순번"
, DECODE(A."구분", 1, '매출', 2, '취소') AS "주문구분"
, B."금액합계"
, A."주문일"
FROM
주문_마스터 A,
주문_상품 B
WHERE 1=1
AND A."주문번호" = B."주문번호"
AND A."원주문번호" = 'OR00000000000001' -- 주문번호
원주문번호 'OR00000000000001' 의 취소 주문번호인 'OR00000000000011' 의 번호로, 원주문번호에 엮인 주문건들의 합을 조회해보자.
[최상위 (매출)주문번호 하위의 주문(취소)정보들 가져오기]
SELECT
A."주문번호"
, A."원주문번호"
, B."주문상품순번"
, DECODE(A."구분", 1, '매출', 2, '취소') AS "주문구분"
, B."금액합계"
, A."주문일"
FROM
주문_마스터 A,
주문_상품 B
WHERE 1=1
AND A."주문번호" = B."주문번호"
START WITH
A."주문번호" = ( SELECT MAX (Z."주문번호")
FROM 주문_마스터 Z
START WITH Z."주문번호" = 'OR00000000000011' --.ORD_NO = 'OR20170800011597' 인 값에서..
CONNECT BY PRIOR Z."원주문번호" = Z."주문번호" -- ORI_ORD_NO 아래의 ORD_NO를 연결하고.
GROUP BY CONNECT_BY_ISLEAF -- 자식 노드가 있으면 1, 없으면 0
HAVING CONNECT_BY_ISLEAF = '1'
)
CONNECT BY PRIOR A."주문번호" = A."원주문번호" -- "주문번호" 아래의 "원주문번호"
AND PRIOR B."주문상품순번 = B."주문상품순번
ㅜ.ㅜ 쿼리는 언제나 어려워......
START WITH : 어떤 데이터로 계층구조를 지정할 것인가? 가장 처음에 데이터를 거르는 플랜을 타게 되기때문에 해당 컬럼에는 인덱스가 걸려있어야 한다. CONNECT BY : 각 행들의 연결 관계를 설정 ( 결과에는 LEVEL 이라는 컬럼이 있으며, 이는 계층의 깊이를 의미한다.
실수로데이터를 삭제(DELETE) 하고 COMMIT 까지 완료한 경우 삭제 전의 데이터를 TIMESTAMP를 사용하여 조회/복구 할 수 있으니..당황하지 말자..
-- 1. 데이터 삭제 DELETE FROM T_OUT; -- COMMIT:
-- 2. 삭제 5분 전 데이터 복구 INSERT INTO T_OUT (AA,BB,CC,REG_DT) SELECT AA,BB,CC,REG_DTFROM T_OUT AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '5' MINUTE) -- SECOND, MINUTE, HOUR, DAY
COLUMN : 컬럼명 REG_EXP : 정규표현식 [^@]+ : @ 기준으로 split START_INDEX : 정규표현식을 검색할 문자열의 시작 INDEX 지정. GROUP_INDEX : 해당 정규표현식으로 잘라진 그룹이 2개 이상이라면 INDEX 를 지정해 그룹을 선택할 수 있다.
SELECT REGEXP_SUBSTR('retriver@gmail.com', '[^@]+', 1, 1) AS EMAIL_ID -- 'r' 부터 검색
, REGEXP_SUBSTR('retriver@gmail.com', '[^@]+', 3, 1) AS EMAIL_ID_CUT -- 't' 부터 검색
, REGEXP_SUBSTR('retriver@gmail.com', '[^@]+', 1, 2) AS EMAIL_DOMAIN
FROM DUAL
[Study] 구분자(^)로 구분한 값들을 분리하여 가져오기
SELECT REGEXP_SUBSTR('0001^0002^0003','[^^]+', 1, 1) AS COL_1
, REGEXP_SUBSTR('0001^0002^0003','[^^]+', 1, 2) AS COL_2
, REGEXP_SUBSTR('0001^0002^0003','[^^]+', 1, 3) AS COL_3
FROM DUAL
[Study] Connect By 를 사용하여 list형태로 가져오기
SELECT REGEXP_SUBSTR('0001^0002^0003','[^^]+', 1, LEVEL) COL FROM DUAL
CONNECT BY REGEXP_SUBSTR('0001^0002^0003', '[^^]+', 1, LEVEL) IS NOT NULL
특정문자만 추출
SELECT A.TEST_NM, REGEXP_REPLACE(A.TEST_NM, '[^0-9,-]') AS TEST_TEL
FROM TEST A