database
-
[PostgreSQL] 커서를 활용하는 프로시저 만들기개발/Database 2020. 2. 16. 12:24
차세대 프로젝트에서 데이터 이관 작업을 하다 보니 타겟 목록을 SELECT 하여 커서에 담은 뒤, 커서의 크기만큼 반복문을 돌며 원하는 처리를 해주는 패턴이 굉장히 유용했다. 이번에도 우연한 기회에 PostgreSQL에서 비슷한 작업을 했는데, 내가 까먹을 것 같아서 기록해둔다. 오라클 프로시저와의 차이점은 약간의 문법 차이 정도만 있고, 거의 유사한 것 같다. (유의사항 : PostgreSQL 11에서부터 프로시저를 지원) 아래 예제는 실제 사용했던 프로시저를 포스팅용으로 많이 요약한 버전으로, student 테이블에서 grade가 1인 데이터를 추출하여 커서에 담은 뒤 커서를 반복문으로 돌리면서 student_2020 테이블에서 커서에 담은 데이터의 id와 동일한 로우의 grade를 2로 업데이트해준..
-
[Oracle] 계정 잠금 해체개발/Database 2019. 7. 20. 10:20
JDBC 드라이버 통해서 쿼리를 날렸는데 갑자기 "the account is locked" 라는 메시지가 뜨면서 프로그램이 안 돌아간다는 제보를 받았다. 원인은 패스워드 유효기간 만료일수도 있고, 관리자가 직접 계정 lock을 걸어서 계정이 잠겼을 수도 있다는데 나도 DB 무식자다보니 정확한 원인은 모르겠다. 아마도 다시 DBA를 만나게 되면 여쭤볼 수는 있겠다만 언제 오실지 모르니... 우선 아래 쿼리를 날려서 잠긴 계정을 확인 1 2 3 4 5 6 SELECT * FROM DBA_USERS WHERE ACCOUNT_STATUS LIKE 'LOCKED%'; cs 전달받은 대로 계정 하나가 잠겨있는 상태였다. 잠긴 계정을 푸는 쿼리도 날려본다. 1 2 3 ALTER USER [USER_NAME] ACCO..
-
[MySQL] MySQL에서 ROW_NUMBER 사용하기개발/Database 2019. 2. 19. 17:43
오라클, 티베로..등에서 쿼리를 짤 때 툭하면 ROW_NUMBER() OVER 를 줘서 뽑다가 MySQL로 오니 당연히 신택스 에러가 떨어진다. MySQL에서는 특이하게도 SELECT 절에서 function 을 활용한다거나 이런 방식이 아니라변수를 선언하고 이 변수에 1씩 더해서 뽑아내는 방식으로 Row num을 줄 수 있다. 알고보니 MySQL에서는 쿼리에서도 변수를 선언해서 사용할 수 있고이걸 응용해서 뽑아내는 것 같다. 일단 쿼리를 보자면 요렇게 123456789101112SELECT @ROWNUM := @ROWNUM + 1 AS ROWNUM ,TB.* FROM ( SELECT NOTE_NO ,NOTE_TITLE ,NOTE_CONTENTS FROM EXAMPLE.NOTE ORDER BY NOTE_N..
-
SQL을 활용해서 스네이크 케이스를 카멜 케이스로 바꾸기개발/Database 2018. 7. 26. 16:51
INITCAP() 이라는 함수를 써서 쉽게 바꿔줄 수 있다.물론 딸랑 INITCAP() 하나만 써서는 안되고 다른 함수들을 같이 섞어서 써주면 가능 결론만 먼저 말하자면 아래처럼 쓰면 된당SUBSTR ( REPLACE ( INITCAP ( '1' || 대상문자열 ), '_' ), 2) 이제 안에서부터 하나씩 쪼개보겠음 1. INITCAP() - 대상 문자열에서 각 단어의 첫 글자만 대문자로, 나머지는 소문자로 변환 - '1' || 'ABC_DEF_GHI' 로 문자열 앞에 '1' 은 왜 붙였나? ∵ INITCAP 을 쓰면 무조건 단어의 첫글자를 대문자로 변환해주는데, 카멜 케이스는 맨 앞 단어의 첫 글자는 소문자가 되야 하기 때문에 앞에 다른 문자를 아무거나 붙여서 맨 앞 단어의 첫 글자가 대문자가 되는 ..
-
나도 WITH절을 써보자개발/Database 2018. 7. 26. 13:50
출처는 내 영혼의 구원자 구루비 http://wiki.gurubee.net/pages/viewpage.action?pageId=27427118 http://www.gurubee.net/lecture/1505 http://wiki.gurubee.net/pages/viewpage.action?pageId=27427116 1. WITH절 사용 시 장점 = 데이터 중복 액세스 제거- SQL에서 동일한 데이터를 반복 처리할 경우, 성능개선방법으로 WITH절을 많이 활용- 데이터 건수는 적으나 데이터 추출 시 I/O 처리량이 많은 경우에 효과적- 여러 부분에 사용될 데이터를 1회 추출하여 Global Temporary Table 에 저장하고, 요청 시 저장된 데이터만 읽어 처리하면 되므로 SQL 성능 개선 및 I/..
-
DELETE VS TRUNCATE VS DROP개발/Database 2018. 7. 26. 11:20
요즘 쿼리 짜기에 재미를 붙여서 신나게 쿼리를 뚱땅뚱땅 만들고 있는데INSERT 쿼리문이 시작하기 전에 TRUNCATE 문을 붙여주라는 명을 받았다. 그러고보니 CREATE TABLE...시작 전에는 DROP TABLE.... 을 붙여주고INSERT INTO... 시작 전에 TRUNCATE...를 붙여주는걸 스크립트에서 종종 발견했다.무슨 차이인지 검색해보니 이미 너무 알아보기 쉽게 잘 정리된 것이 있어서 퍼옴 출처 : https://wikidocs.net/4021 * DELETE, TRUNCATE, DROP 명령어의 차이점 이 그림을 보면 정말 명확하게 차이점이 드러난다. 1. DELETE - 데이터만 지워지고 테이블 용량과 인덱스 등은 삭제되지 않음 - WHERE 조건을 걸어 특정 데이터만 삭제 가능..
-
DECODE 와 CASE : 과연 그놈이 그놈일까개발/Database 2018. 7. 18. 15:05
DECODE와 CASE를 잘 쓰면 소스 코드 짤 때의 삽질을 엄청나게 줄일 수 있기 때문에 쿼리 짤 때 요놈들을 자주 쓰게 된다.이걸 배울 때는 DECODE와 CASE는 비슷하게 쓰일 수 있다~ 정도로만 이해하고 넘어갔는데오늘 쿼리를 짜면서 문득 이게 별 차이가 없다면 굳이 두개가 다 있을 필요가 없다는 생각이 들었다.그래서 좀 더 파보는 시간을 가져보도록 한다. 1. DECODE DECODE(값, IF1, THEN1, IF2, THEN2, .... ) 2. CASE CASE 값 WHEN IF조건1 THEN1 WHEN IF조건2 THEN2 ....ELSE END 3. 차이점 물론 신택스가 다르므로 쿼리도 달라진다. 예) NUM 컬럼의 값이 1이면 첫번째, 2면 두번째, 3이면 세번째, 다른 값이면 기타를..
-
[ERwin] ERwin으로 DB 연결해서 자동으로 ERD 뽑아오기개발/Tool 2018. 7. 12. 16:09
이미 완성된 데이터베이스가 있는데 ERD는 없을 때...데이터모델 정의서를 보면서 하나 하나 그릴 수는 없지 않은가이럴 땐 ERwin의 Reverse Engineering으로 DB와 연결하여 편하게 ERD를 뽑아올 수 있다. * ERwin과 DB 연결하여 ERD 뽑아오기 1. Tools -> Reverse Engineer 선택 2. New Model Type 은 Logical/Physical 을 선택, Target Database 역시 연결하고자 하는 디비의 버전을 선택 3. 연결할 DB의 Owner를 입력 4. 접속할 유저 아이디, 비밀번호와 접속 디비의 IP, 포트 번호, SID를 입력 후 Connect 버튼을 누르면 끝 * IP, 포트번호, SID는 아래와 같은 형식으로 넣어야 한다. 예) 디비 I..