ORACLE SQL 9

[ORACLE] 특정 컬럼으로 중복된 항목 제거

회사에서 운영중인 시스템중 요청 후 결재선을 선택하는 화면이 있는데 정상적으로 결재가 되지 않는다는 연락을 받았다. 데이타 : ROWNUM | 승인자명 1 | 요청자 A 2 | 요청자 팀장 3 | 주관부서 B 4 | 주관부서 팀장 위 데이터에서 문제는 요청자 A의 팀장과 주관부서 팀장이 같은 경우에 결제승인 프로세스가 정상적으로 타지 않는다는 것이었다. 그래서 해결 방법으로는 요청자 팀장과 주관부서 승인자가 동일할시 중복결재가 되지 않도록 요청자 팀장의 결재라인을 지움으로서 동일인물에 대한 중복 결재를 없애는것 으로 설계하였다. 하지만 쿼리를 보니 주관부서와 요청자를 서브쿼리로 UNION하였고 ROWNUM은 하드코딩 되어있는 상태여서 DISTINCT나 GROUP BY를 할시 ROWNUM에 걸려 중복제거를..

ORACLE SQL 2023.11.17

오라클 시노님(Synonym)이란?

다른유저 혹은 DB링크에 종속된 테이블 같은경우 우리는 보통 스키마 라는 것을 붙여 테이블을 조회하곤 한다. ex) SELECT * FROM DUSER.ADRESS_USER 위의 쿼리에서 DUSER라는 스키마를 붙이고 싶지 않을 경우에는 시노님 이란 것을 생성하여 테이블명을 임의로 변경 해줄 수 있다. ex) CREATE SYNONYM ADDRESS_USER FOR DUSER.ADDRESS_USER -> SELECT * FROM ADDRESS_USER ex) CREATE SYNONYM ADRESS FOR DUSER.ADDRESS_USER -> SELECT * FROM ADRESS

ORACLE SQL 2023.08.21

피벗 쿼리를 작성해보자 (PIVOT TABLE QUERY)

피벗 쿼리란 ROW별로 데이터가 나오는것을 특정 컬럼의 ROW값 기준이 되서 ROW가 아닌 컬럼으로 만든다. 아래는 ROW에 나오는 특정 값들이 반복해서 나온다고 했을 때 그 값을 ROW 값이 아닌 컬럼으로 표현하는 쿼리이다. SELECT * FROM ( SELECT VU.DT_NAME , WU.UNAME , VU.USER_NM , WU.AGR_FILED FROM WU_TABLE WU LEFT OUTER JOIN VU_TABLE VU ON WU.UNAME = VU.USER_ID WHERE SUBSTR(AGR_NAME, 2, 2) = 'FI' ) PIVOT ( COUNT(*) FOR AGR_FILED IN ( 'FIELD01' AS FIELD01,'FIELD02' AS FIELD02,'FIELD03' AS..

ORACLE SQL 2023.07.31

ORACLE SELECT UPDATE 각각의 Key값에 각기 다른 값 SET 하기

상황 : 신규 DATE TYPE의 컬럼 추가 이후 신규 컬럼에 Key별로 각기 다른 값을 update 해야 하는 상황 과거 신입때는 select 후 모든 데이터를 내려 받은 후 update문을 만들어 맵핑 작업을 했던 경험이 있고 데이터를 불러들여 엑셀 입력하듯 하는 방법은 있으나 한번에 50row 밖에 붙여넣기가 안되는 상황 발생 엑셀로 update문을 만들기는 귀찮고 developer를 통해 업데이트를 하자니 한번에 50개밖에 업데이트가 안되고 그런데 developer에 각 row별로 업데이트 치는 기능이 있는것을 보고 혹시 select insert 처럼 update도 select한 값을 각각 update 할 수 있을지 않을까 라는 합리적인 의심을 함 그래서 구글링을 한 결과 가능했다. UPDATE ..

ORACLE SQL 2023.07.11

ORACLE) SPLIT 함수 만들기

AND EXISTS ( SELECT 1 FROM TABLE(FN_CLOB_SPLIT( TO_CLOB('1102110,1102112,1102115') )) S WHERE S.COLUMN_VALUE = STORE_CD )​ FN_CLOB_SPLIT - 문자열(CLOB)을 넘겨 각각의 로우 데이터를 반환하고 그것이 존재하는지 찾는다. create or replace FUNCTION FN_CLOB_SPLIT ( P_LIST IN CLOB , P_GUBUN IN VARCHAR2 DEFAULT ',' ) RETURN SPLIT_TBL PIPELINED AS /* EXCEPTIONS */ NONEEXISTENT_LOB_VALUE EXCEPTION; PRAGMA EXCEPTION_INIT(NONEEXISTENT_LOB..

ORACLE SQL 2022.08.23

LISTAGG 문자열 연결의 결과가 너무 깁니다 에러 발생시

java.sql.SQLException: ORA-01489: 문자열 연결의 결과가 너무 깁니다 문제발생 : 쿼리에 LISTAGG 사용시 문자열을 연결하다가 4000바이트가 초과되면 에러발생 * 처리방법 수정전 LISTAGG(COLUM1, ',') WITHIN GROUP (ORDER BY COLUM1, COLUM2, COLUM3) OVER(PARTITION BY COLUM1) 수정 후 LISTAGG(COLUM1, ',' ON OVERFLOW TRUNCATE) WITHIN GROUP (ORDER BY COLUM1, COLUM2, COLUM3) OVER(PARTITION BY COLUM1) 결과 COLUM1,COLUM2,COLUM3,중간생략,COLUM3900,...(10) --초과된 10건이 더 있다는 뜻 참..

ORACLE SQL 2022.06.15

프로시저를 워크시트에서 돌려보자

1. 선언 : SET SERVEROUTPUT ON; 2. declare에 파라미터를 선언한다. 3. begin절에 프로시저를 작성한다. 4. 돌출할(DBMS_OUTPUT.put_line)라인 결과물 파라마터를 작성한다. SET SERVEROUTPUT ON ; declare UP_USR varchar2(100):= ''; UP_DATE varchar2(100):= ''; RESULT varchar2(100):= ''; begin PKG_TEST.SP_TEST_PIPE ( 'A', 'B', 'C', 'D', 'E', UP_USR, UP_DATE ); DBMS_OUTPUT.put_line('RESULT:'||RESULT); DBMS_OUTPUT.put_line('UP_USR:'||UP_USR); DBMS_OU..

ORACLE SQL 2021.04.22