본문 바로가기
반응형

IT/Oracle21

Oracle 조건 in 쿼리 1000개 제한 피하기. 1. 개요얼마 전 주소록을 일괄삭제해주는 기능이 동작하지 않는다는 사용자 문의를 받았다. 이를 확인해보니 특정 쿼리가 수행되지 않고 예외를 발생시키고 있었는데 오늘은 이에 대해 이야기를 해보려고 한다.해당 이슈는 ORA-01795: maximum number of expressions in a list is 1000으로 in절의 파라미터가 1000개를 초과할 때 발생하는 오류이다.2. 왜 발생할까???해당 예외는 Oracle에서 의도적으로 발생시키는 예외로, 이유가 분명해보였다. 그렇다면 왜 이런 예외를 발생시킬까??당연히 성능때문이다. 이러한 제한은 Oracle이 메모리를 효율적으로 사용하기 위한 것인데 IN절의 파라미터를 처리하기 위해 Oracle은 메모리 내에 일시적인 테이블을 생성한다. 하지만 이.. 2024. 10. 21.
서버에서만 발생하는 오라클 Literal 오류 literal does not match format string  문자와 데이트형식을 비교 및 대입했을 때 발생한다.  TO_CHAR 와 TO_DATE를 이용해서 서로 같은 형식으로 비교 및 대입해주면 된다.함수 두번째 인자 값을 생략하지 말고 꼭 기입해준다. ex> to_char(sysdate , 'yyyymmdd') 이렇게 개발 하지 않으면 로컬에서는 오류없이 실행되던게 서버에서는 오류가 날수도있다.지금 내피시에서 오류가 안난다고 약식으로 자동 형변환을 유도하는건 좋지 않다.그래서 개발시 꼭 습관화를하는게 좋다. 리터럴 오류는OS의 LANG 설정이 달라서 문자열을 묵시적으로 날짜로 변환을 못해서 발생하는 에러기때문에 - 리눅스 명령어echo @LANGlocale - 윈도우 같은경우 설정에서 확인 가.. 2024. 7. 15.
decode 와 case 사용 시 차이와 주의할점 오라클에서 조건문으로 사용할수 있는 수식이 decode와 case가 있는데.주의해야 할점이decode(strA ,3 ,FN_GETB() ,FN_GETC() )strA가 3이면 FN_GETB()함수 값을 같지 않으면  FN_GETC() 함수를 값을 리턴해주는건 맞지만내부적으로는 두개다 호출(실행)된다. 그래서 두함수가 모두 단순 select 리턴 함수면 상관없지만 (채번등) 함수 안쪽에서 update,insert, 시퀀스 등을 사용하는 함수라면 문제가 될수 있다. 만약 위와 같은 경우라면 반드시 case문을 사용해야 한다.case문은 보통 우리가 아는대로 조건이 거짓일 경우 실행되지 않는다. 그래서 왠만하면 decode를 사용할때는 안에 함수들어가는 수식은 사용하지 않는것이 좋다. 2024. 7. 10.
대용량 insert 출처 : https://velog.io/@aszxvcb/Bulk-InsertUpdate-%EB%B0%B0%EC%B9%98%EC%9E%91%EC%97%85%EC%97%90%EC%84%9C%EC%9D%98-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%B2%98%EB%A6%AC-%EB%A6%AC%ED%84%B4%EA%B0%92returnValue [Bulk Insert/Update] Mybatis 배치작업과 리턴값(returnValue)들어가며, 주문/재고 관리시스템에서 배치작업을 개발/개선하는 업무를 맡게되었습니다. 배치작업 특성상 많은 데이터를 한번에 처리하면서 겪게되었던 경험을 정리해봅니다. 글의 순서 다건velog.io   들어가며,주문/재고 관리시스템에서 배치작업을 개발/개선하는 업무를 맡.. 2024. 6. 20.
오라클 인덱스가 타지 않는 경우 1. 인덱스 컬럼 절을 변형한 경우 - 수식이나 함수 등으로 인덱스 컬럼 절을 변형하였을 경우 - 반드시 함수나 수식을 사용해야 하는 경우에는 인덱스 컬럼 부분에 적용하지 말고, 여기에 대입되는 컬럼이나 상수부분에 적용해야 한다. BAD SELECT column_name FROM table_name WHERE TO_CHAR(column_name, 'YYYYMMDD') = '20130909'; 추천 SELECT column_name FROM table_name WHERE column_name = TO_DATE('20130909', 'YYYYMMDD'); BAD SELECT column_name FROM table_name WHERE column_name * 100 > 10000; 추천 > SELECT co.. 2023. 9. 8.
오라클 프로시저 컴파일 오류 확인하는 법 프로시저 컴파했을때 오류메시지가 정확히 안나오고 스키마 브라우저(Schema Browser)에서 X 표시가 나올때가 있다. 프로시저가 컴파일 오류날때 등록되는 테이블이있다. 몇번째 라인에서 어떤 오류가 발생하는지 정확하게 확인이 가능하다. SELECT * FROM ALL_ERRORS WHERE name = 'SP_AFCR_ORD_PROC'; 2023. 7. 26.
오라클 프로시저 생성 및 호출 IN, OUT 사용법 ----------------------------------------------------------------------( DBEAVER 기준) 간단한 호출 방법-아웃파라메터를 ?로 해서 실행하면 된다. CALL 프로시저명('in파라메터',' in파라메터', ?, ?); 위에 구문을 실행하면 아웃파라메터 내용이 Result 창에 찍힌다. 프로시저에서 찍은 로그들은 ctrl + shift + o 를 하면 로그들을 확인할수 있는 Output 창이 보인다. (주의 : 실행시 구문 상단에 주석이 있으면 오류가 발생한다. 블럭잡고 실행하거나  상단에 주석을 제거해야한다.)----------------------------------------------------------------------    #파라.. 2023. 7. 26.
오라클 PL/SQL 기본 구문, 프로시저 디버깅 PL/SQL 블록 구조 DECLARE -- 선언부(옵션) -- 변수나 상수를 정의 BEGIN -- 실행부(필수, BEGIN-END) -- 로직 수행(일반 SQL문, 조건문, 반복문 등) EXCEPTION -- 예외처리부(옵션) -- 로직 수행중 에러 발생 시 예외 사항 처리 END; 오라클 PL/SQL 작성시 기본 구문정리, 프로시저등을 바로 생성하지 않고 다음과 같이 테스트 후 생성하면 된다. DECLARE M_NAME VARCHAR2(50) := '투케이'; --초기 변수 선언 --특정테이블의 컬럼타입을 변수에 지정하기. --V_ENAME 테이블명.컬럼명%TYPE; OUT_MSG VARCHAR2(50); NUM NUMBER:=11; v_num NUMBER:=0; -- 사용자정의 EXCEPTION 선언.. 2023. 7. 26.
꼭알아야할 오라클 힌트절 7가지 출처 : https://dataonair.or.kr/db-tech-reference/d-lounge/expert-column/?pageid=3&mod=document&keyword=%ED%94%8C%EB%9E%9C%EC%9D%84+%EB%B3%B4%EB%8A%94+%EB%B2%95&uid=52344 반드시 알아야 하는 오라클 힌트절 7가지 ◎ 연재기사 ◎ ▷ 물탱크 구조로 알아본 오라클의 블록 옵션 ‘PCTFREE와 PCTUSED’ ▷ 이산가족 찾기 생방송을 통해 배우는 DB 원리 ▷ 개발자에게 맞는 DB 공부방법 찾기: 물리적 분류와 논리적 분 dataonair.or.kr CBO 방식에서 옵티마이저는 주어진 환경(통계정보, SQL문) 하에서 최적의 실행계획(PLAN)을 제공한다. 그런데 잘못된 SQL문.. 2022. 7. 22.
DB 플랜 보는방법 및 기본적인 튜닝 방법 원본사이트 : https://dataonair.or.kr/db-tech-reference/d-lounge/expert-column/?pageid=3&mod=document&keyword=%ED%94%8C%EB%9E%9C%EC%9D%84+%EB%B3%B4%EB%8A%94+%EB%B2%95&uid=52341 오라클 플랜을 보는 법 ◎ 연재기사 ◎ ▷ 물탱크 구조로 알아본 오라클의 블록 옵션 ‘PCTFREE와 PCTUSED’ ▷ 이산가족 찾기 생방송을 통해 배우는 DB 원리 ▷ 개발자에게 맞는 DB 공부방법 찾기: 물리적 분류와 논리적 분 dataonair.or.kr 오라클 플랜 보는 법 플랜에 대한 내용은 기본적인 내용이라 일반적인 DB 도서에서는 자세한 내용을 설명하지 않는다. 하지만 필자가 경험하기로는 .. 2022. 7. 22.
오라클 조인 방식 종류와 이해. 원본사이트:https://dataonair.or.kr/db-tech-reference/d-lounge/expert-column/?pageid=3&mod=document&keyword=%ED%94%8C%EB%9E%9C%EC%9D%84+%EB%B3%B4%EB%8A%94+%EB%B2%95&uid=52359 조인이란 무엇인가 흔히 조인이라 하면 Inner Join 혹은 Outer Join을 생각하는 경우가 많다. 이번 연재 내용은 그러한 조인이 아니라 테이블 간에 어떤 방식으로 접근하는가에 대한 조인이다. 다시 말해서 오라클에서 조인 방식이란, 테이블 간의 데이터 접근 방법을 의미한다. 관계형 데이터베이스에서 쿼리는 Join 없이 단독으로 사용하는 경우가 거의 없다. 대부분의 쿼리는 여러 테이블 간에 관계를 맺.. 2022. 7. 22.
NULL 처리 시 유의 사항 및 항상 헷갈리는 내용 총정리 출처 : https://dataonair.or.kr/db-tech-reference/d-lounge/expert-column/?mod=document&uid=52319 [Oracle] 오라클 NULL 사용시 주의사항 정리 오라클에서 쿼리문을 작성할 때 NULL을 제대로 이해하지 않으면 원하는 결과가 출력되지 않을 때가 많다. 다른 DB나 언어와 다른 부분이 있으니 아래의 예제를 보면서 오라클에서 NULL 사용법을 조 gent.tistory.com 개발자에게 NULL은 쉬우면서도 어려운 존재다. 경험이 많은 개발자라도 NULL의 예상치 못한 결과에 당황하는 경우가 간혹 있다. 또한 NULL은 성능에도 영향을 미치며 잘못된 결과값을 리턴 하기도 한다. 오라클에서 NULL은 길이가 0인 문자열과 동일한 의미를.. 2022. 7. 22.
오라클 LNNVL함수 / nullable 컬럼에 부정 조건을 사용해야하는 경우 출처 : https://gent.tistory.com/387 조건문은 긍정문으로 작성하는게 국룰이지만 가끔은 부정문을 써야할때도 있다. 그런데 문제는 해당 컬럼이 Nullable일때 그냥 where col != '값' 이렇게 해버리면 col의 값이 null이 row는 검색이 안된다. 굉장히 자주 일어날수 있는 오류다. 이걸 해결하려면 nvl로 col을 치환하거나, or문으로 is null까지 비교해야하는데. 오라클에서는 이걸 해결하기 위해 존재하는 함수가 LNNVL이다. 오라클에서 LNNVL 함수는 간단한 함수 같지만, 함수의 기능을 제대로 이해하지 않으면 아주 복잡하게 느껴지는 함수이다. LNNVL 함수는 해당 컬럼에 NULL이 존재할 경우 NULL 처리와 조건문을 한 번에 연산하기 위해서 사용한다. .. 2022. 7. 22.
대용량 insert 출처 : 어디선가 복사해둔 글인데 사이트를 잊어버렸는네요..;; ㅠㅠ 몇가지 방안이 있습니다. 그런데 명심하실 건, DBMS 에서 다량의 insert 쿼리는 매우 좋지 않다는 것입니다. 가장 좋지 않는 방법에서 좋은 방법 순으로 나열하겠습니다. 1. insert into ~ values ~; insert ~ values ~; ... 2-1. insert all into ~ values ~ into ~ values ~ ...; (Oracle) 2-2. insert into ~ select ~ union all select ~ ...; (MS SQL Server) 2-3. insert into ~ values ~, ~, ... (MySQL) 3. Bulk Insert Bulk insert 가 효율이 가장 좋.. 2022. 7. 6.
오라클 페이징 쿼리. ------------------------------------------------------------------------------------------------------------------------- ▣ 문제 : 페이징 쿼리가 느리다. ▣ 데이터 건수 : 1억건 ▣ 인덱스 : PK_TB_TABLE ( COL_01, COL_02 ) ------------------------------------------------------------------------------------------------------------------------- 그냥 페이징인데! 속도가 느리다. 페이징 방식은 많이 있다. 그중에 대용량 데이터에서 많이 사용하는 ROWNUM 방식으로 쿼리 했지만 결과가 느.. 2022. 2. 18.
엑셀 import Valid 체크 및 MyBatis 다중 루프 시 변수 처리 이글은 제가 개인적으로 기억해두려고 저장한 글입니다. 1. 엑셀을 받아서 import용 테이블에 넣고 밑에 체크하는걸 추천한다. (밑에 내용을 저장하지 않고 dual을 사용해 임시 테이블 처럼 만들어 체크했다.) 2. myBatis에서 다중 루프가 가능하다. 루프안에 루프 변수를 아래와 같이 호출 가능함 #{uiDatsList.${colList.sCamelColumnId}} 단, $를 사용해야 하기 때문에 해당 List변수(colList)는 반드시 ui단에 받은 리스트가 아닌 서버단에서 만들어지 리스트여야 한다. 3. 날짜 검증은 REGEXP_LIKE를 사용했으니 참고. WITH TMP_TBL_COLS AS ( /*동적컬럼에 명칭 및 타입 등을 갖고 있는 데이터. DB에 저장 된 상태라면 그냥 그 테이블.. 2021. 2. 4.
오라클 락 확인 -- 특정 테이블에 LOCK 확인 SELECT A.SID, A.SERIAL#, B.TYPE, C.OBJECT_NAME FROM V$SESSION A, V$LOCK B, DBA_OBJECTS C WHERE A.SID = B.SID AND B.ID1 = C.OBJECT_ID AND B.TYPE='TM' AND C.OBJECT_NAME IN ('TB_CO_GENO'); -- LOCK 테이블 확인 SELECT DO.OBJECT_NAME, DO.OWNER, DO.OBJECT_TYPE, DO.OWNER, VO.XIDUSN, VO.SESSION_ID, VO.LOCKED_MODE FROM V$LOCKED_OBJECT VO, DBA_OBJECTS DO WHERE VO.OBJECT_ID = DO.OBJECT_ID; -- .. 2021. 2. 3.
오라클 CONNECT BY - 재귀호출 / 계층형 쿼리 오라클 CONNECT BY - 재귀호출 문법을 활용할 수 있는 내용입니다. 잘 정리 된 곳이 있어 퍼왔어요. 출처는. tiboy.tistory.com/m/563 [HOW]계층형 쿼리 사용하는 방법, START WITH... CONNECT BY ~ ORDER SIBLINGS BY - 오라클(ORACLE) 안녕하세요. 신기한 연구소입니다. 개발을 하다 보면 계층형 쿼리를 만나게 됩니다. 사실 계층형 쿼리를 제대로 배워서 사용하는 개발자도 있겠지만 그냥 다른 개발자가 만든 것을 복사해서 대 tiboy.tistory.com 사실 계층형 쿼리를 제대로 배워서 사용하는 개발자도 있겠지만 그냥 다른 개발자가 만든 것을 복사해서 대충 쓰거나 잘 이해도 못하고 사용하는 경우도 있습니다. 필자도 사실 처음 그랬던 기억이 .. 2021. 2. 3.
오라클 조건문에 특수문자 & or % or ? 문자로 인식시키기 1. 조건문 문자에 ? & 조회 시 쿼리문 문자조건 안에 & 또는 ?가 들어가 있을 경우 오라클이 실행 되면서 이녀석을 변수로 생각해서. 값을 넣으라는 창이 뜬다. 이경우는 set define off;를 실행 후 실행 하면 된다. 실행하면 원상 복귀 set define on 실행 2. LIKE 절에 %를 조회 하고 싶을때 select * from tbl where a like 'a%' LIKE 절을 써서 a로 시작하는 데이터가 아닌 a% 를 찾고 싶을때는 ESCAPE를 쓰면 된다. with tbl as ( select 'a%b' c from dual union all select 'azb' c from dual ) /*ESCAPE 뒤에 오는 '#'은 구분자 역할을 하며 #뒤에 있는%를 일반 문자로 인식하.. 2021. 2. 3.
오라클 문자에 특정문자가 몇개나 있는지 검색하는 법 INSTR() - INSTR(문자열, 찾을 문자열, 시작 위치, 몇 번째로 발견할것인지 위치) 첫자리 1부터 반환. */ SELECT INSTR('abcdefg', 'c') from dual; -- =>> 3 /*마지막 특정문자 이후의 문자만 가져오기 (당근 select 하기 ) */ /*주의 : 한글은 이방법으로는 안됨. (reverse하면 깨짐)*/ select reverse(substr(reverse(f), 1, instr(reverse(f),',')-1)) from( select 'app,fff,dff' as f from dual ); -- =>> dff 2021. 2. 3.
Mybatis #사용시 속도가 느려지는 현상 1. 오라클에서 직접 실행하면 빠른데 Mybatis에서 느린경우: 너무 느린 쿼리를 로그에서 카피해서 오라클등에 실행해보면 빠르게 나올수 있다. 오라클에서 :변수 (앞에 세미클론) 로 해서 실행하면 마이바티스에서 실행하는 것처럼 PreparedStatement로 작동하기 때문에 이렇게 속도체크를 해봐야한다. #을 사용하게 되는경우는 내부적으로 PreparedStatement로 작동하기 때문에 옵티마이저가 바인드변수로 처리한다. 바인드 변수로 처리하는건 오라클에서 적극 권장하는 방식이지만 특정한 몇가지 경우 옵티마이저가 이상행동을 한다. 예를들어 바인드 변수의 사용시 조건절의 컬럼에 인덱스가 있더라도 varchar2형에 숫자형을 바인드변수로 비교하게되면 인덱스가 있는 컬럼쪽이 to_number()로 형변환.. 2021. 2. 3.
반응형