728x90

공부를 하다 시간이없어 바로 벌크 쿼리를 야생형으로 공부해보았다.

 

미래의 나를 위해 정리를 해보자

 

우선.

 

벌크 쿼리란?

 

단순하게 10개의 데이터를 DB에 넣어야할때, 

10번을 나눠넣냐 1번으로 넣냐 이렇게 생각하면 쉽다(수정도 마찬가지)

 

좀더 쉽게 예를들면

 

엑셀에서 10,000개의 행을 읽었을때 과연 나는 for 문을 돌면서 10,000 번 insert 를 해야할때

부담을 느낄 수 밖게 없다.

 

이럴때 쓰는게 벌크 쿼리이다.

 

다음과 같이 테스트 하기위해서 테이블을 만들었다.

여기다 insert 할 것이다.

 

 

 

그리고 데이터가 있는 테이블을 하나 정했는데 다음과 같으며

딱 3개의 칼럼만 사용할 것이니 부담없이 보자

ename, job, sal

 

 

이제  PL / SQL 문을 알아볼것인데

이는 하나의 프로그래밍 언어 레벨로 이해하면된다.

따라서 반복문, 조건문, 예외처리 같은 문법들도 사용할 수 있다.

 

심플하게 문법을 알아보자

 

구조는 다음 과 같다

DECLARE (1)

     ...

BEGIN (2)

     ...

END;

 

(1) 영역 :

타입을 선언하고, 변수에 타입을 바인딩한다

자바로 비유하면 인스턴스 멤버들을 정의한다, 즉  String 이라는 타입을 정의하고, name 이라는 필드에 타입을 바인딩한다. 결론은 String name; 을 만드는것이다. 이때 초기화도 직접해줄수 있다

또 자바에서도 다른 클래스를 타입으로 가질수있는데 private Book book, private  Contents contents 이런식으로

이또한 가능하다

 

사진으로 이해해보자

EMP 테이블의 하나의 로우를 타입으로 갖는 "타입"을 정의하고

l_emp 라는 변수가 그 "타입"이라고 정의했다.

EMP 테이블의 레코드가 타입이라는건 EMP%ROWTYPE 이라고 작성한다

 

 

 

만약 String name, int age 처럼 하나의 칼럼만 정의하고싶다면

이렇게 하면된다

EMP.job%TYPE => EMP 테이블의 job 칼럼의 타입을 사용한다

 

 

만약에 초기화를 직접 하고싶다면

이런식의 문법으로 하면된다

여기서 주의할게 죄다 List 처럼 컬렉션이라고 생각하면 편안하다

 

 

이제 begin ~ end 문은 실제 동작할 부분을 작성하는 곳인데 좀더 봐야한다 .

예제를 보면서 감을 익히자


 

첫번째 예제 - insert + 단순

 

1. 숫자 15개를 채울 수 있는 배열을 만든다

2. 숫자 15개를 채울 수 있는 리스트를 만든다

3. 반복문을 돌면서 각각 출력해본다

4. 각 루프 마다 값이 짝수나 홀수이면

"배열", "짝/홀수", "값" "리스트","짝/홀수", "값" 

이런식으로 my_bulk 테이블에 insert 한다

 

 

 

출력은  DBMS.OUTPUT.PUT_LINE() 을 이용하면 된다 

 

실제 출력 결과는 다음처럼 나왓다

 

 

 

my_bulk 테이블은 다음과같이 데이터가 들어왔다

 

 

 

잘들어왔다

 

지금 상황은

 

직접 값을 정의한다음 그 값을 반복문과 조건문을 써서 insert 한 경우이다

 

 


두번째 예제 - Update 

 

미안하다, 

PK 가 필요해서 두번째 테이블을 만들었다... (update 벌크쿼리를 위해)

 

 

우선 아까 만든 PL/SQL 에 한줄씩 추가해서 기본데이터가 들어가게 만들었다

 

 

자 이제 pk도 있겠다. 준비는 되었다

 

update 벌크 쿼리에 대해서 알아보자 

 

 

여기서부턴 좀 자세히 알아볼건데

 

세가지 유형을 알아볼건데, update 상황에서 이를 알아보자 (insert문도 가능)

첫번째 유형  - 기존 방식

두번째 유형 - CURSOR 방식

세번쨰 유형 - FORALL 방식 

 

 

1. 기존 방식

 

insert 에서 하던 방식인데 결국 이와 비슷하다 볼 수 있다

여기서 update 쿼리를 날리진 않았지만 DB 를 더 괴롭히는 방식이라고 볼 수있다

 

결과는 다음과 같다

 

 

2. CURSOR 도입

자바를 공부했다면 JDBC 를 가지고 JAVA로만 직접 select 를하고

결과셋을 가지고 반복문 돌면서 데이터를 다룬적이 있을 것이다 그때도 CURSOR (커서) 를 이용하는데

그와 같은 개념이다 (포인터)

 

언제사용하는가? 소량의 데이터에는 적합하다. 대량의 데이터는 FORALL 문을 써야한다

커서는 루프마다 실제 쿼리가 나간다,

즉 에러가나면 그 루프에서 멈추고 이전까지 작업된 내용은 반영되어있다.

 

 

다음은 c1 칼럼값이 리스트인 데이터들을 2건씩 가져와서

c3 값을 10씩 증가시키는 PL / SQL 문이다

 

 

기존 데이터

 

 

결과 데이터

 

 


 

3. FORALL 도입

FORALL 을 사용하면 커서때와 다르게

JPA 처럼 SQL 쓰기저장소에 쭉쭉쌓였다가 마지막 한번에 나간다.

즉, 1번만 나간다고 생각하면된다 따라서 대용량 데이터 작업에 유용하다.

 

또한 원자성을 지키기 때문에 하나라도 실패하면 전체 실패하게된다.

전체 실패, 전체 성공 두개뿐이다.

 

주의할게 있는데 FORALL 내에서는 insert, update, delete 문을 쓸수있고 

for문처럼 콘솔에 찍는것은 할 수 없다 for문에서 해야한다.

그리고 순회하는 타입도 레코드형이면안되고 단순 타입이어야한다

자바로 비유하면 List<Book> 은 안된다 (커서쓸때는 가능)

List<String> , List<Integer> 형태만 된다 .

 

코드는 좀더 짧아졌다.

앞으로 테이블 결과는 10씩 증가되는거니 생략하겠다.

 

 

 


 

3. CURSOR + FORALL  조합 

인간의 욕심은 끝도없다

아무리 한방이 좋다해도 메모리가 부담될 수 있다.

이때는 커서와 조합해서 써야한다

 

하지만 역시 주의할게. 트랜잭션 단위이다

만약 forall 를 loop 가 감싸고있다면 이 루프 갯수만큼 트랜잭션이 있는 것이다.

따라서 savepoint 가 필요하고, 예외처리도 필요하다.

 

728x90
728x90

 

✅ 뷰포트 내부 높이 구하기, 스크롤바 포함 ! 

window.innerHeight

 

 

 

✅  브라우저 전체 높이 구하기

window.outerHeight

 

 

✅ 실제 스크롤까지 펼친 높이, 넘치는 부위까지 다 계산

document.documentElement.scrollHeight

 

 

아래그림을 참고하자

 

728x90
728x90

 

화면작업을 하다보면 가끔 요소의 좌표축이 필요할때가 있다

 

특정 dom을 접근하여 getBoundingClientRect   메서드를 실행하면

다양한 값을 얻을 수 있다

 

 

 

 

속성 이름 설명 계산 방식 / 특징

x 요소의 왼쪽 경계가 뷰포트 기준으로 위치한 x 좌표. left와 동일한 값을 가짐. 뷰포트 기준 좌표
y 요소의 상단 경계가 뷰포트 기준으로 위치한 y 좌표. top과 동일한 값을 가짐. 뷰포트 기준 좌표
top 요소의 상단 경계가 뷰포트 기준으로 위치한 y 좌표. 스크롤 상태에 따라 값이 변함. y와 동일
left 요소의 왼쪽 경계가 뷰포트 기준으로 위치한 x 좌표. 스크롤 상태에 따라 값이 변함. x와 동일
right 요소의 오른쪽 경계가 뷰포트 기준으로 위치한 x 좌표. left + width
bottom 요소의 하단 경계가 뷰포트 기준으로 위치한 y 좌표. top + height
width 요소의 가로 길이(콘텐츠, 패딩, border 포함). 렌더링된 실제 크기
height 요소의 세로 길이(콘텐츠, 패딩, border 포함). 렌더링된 실제 크기
728x90
728x90

LVM 을 알아보자... 사진을 찍을 힘이없어서 못찍었다.. 미안..

 

✨ 일단 다음과 같은 명령어로 나의 환경을 본다

lsblk 또는 df -h

 


✨ /dev/sdb 디스크에서 각각 2기가 크기의 /dev/sdb1, /dev/sdb2  파티션 생성 (2번 생성하니까)
명령어 패턴 (n > p > +2GB,  n > p > +2GB , w)

fdisk /dev/sdb





✨ 위에서 생성한 파티션을 pv로 생성하기

pvcreate /dev/sdb1 /dev/sdb2
pvscan




✨ my_lvm 이라는 이름으로 vg 생성한다, 이때 /dev/sdb1 /dev/sdb2 를 그륩원으로 넣는다

vgcreate my_lvm /dev/sdb1 /dev/sdb2
vgscan
vgdisplay -v my_lvm



✨ my_lvm 라는 VG로 부터 크기가 1GB이고, 이름이 my_lvm_1G인 lvm 생성

lvcreate -L 1G -n my_lvm_1G my_lvm
lvscan
lvdisplay -v my_lvm
vgdisplay -v my_lvm




✨ 해당 lvm을 파일 시스템을 xfs 로 생성하고, (자동)마운트 한다

ext3 나 ext4로 하고싶다면 mkfs.ext3 또는 mkfs.ext4 로 적으면 된다

mkfs.xfs /dev/my_lvm/my_lvm_1G
mkdir /lvm_1G
mount -t xfs /dev/my_lvm/my_lvm_1G /lvm_1G
mount | grep lvm
cat /etc/fstab
echo /dev/my_lvm/my_lvm_1G /lvm_1G xfs defaults 0 0 >> /etc/fstab
mount -av




✨ vg로 부터 남는 용량을 이용해서 lvm 용량을 1GB 증가, 리사이즈 적용
1기가 증설 -> 2기가 됨

lvextend -L +1G /dev/my_lvm/my_lvm_1G
fsadm resize /dev/my_lvm/my_lvm_1G
lsblk 또는 df -h

 

728x90
728x90

우분투 버전 : 24

 

웬걸 오랜만에 우분투에 오니

 

netplan 이라는걸 쓰더라? 그래서 좀 알아보고 사용했던것을 정리하려한다

 

(참고로 ifconfig 도 기본적으로 명령어가 없고 ip a 로 사용해야한다, 물론 다운받으면 쓸수있다)

 

 

 

시작하기전에 내 아이피 확인이나 하자

 

ip a 또는 ifconfig

 

 

환경 설정 파일 위치는 다음과 같다 

 

/etc/netplan 내에 있는 yaml 파일

 

 

 

필자의 경우는 다음 처럼 존재한다

/etc/netplan/50-cloud-init.yaml

 

참고로 back 은 내가 백업으로 추가한것이다

 

 

 

vi 에디터로 열고 다음처럼 수정하자

 

예를들어 필자의 경우는 이렇게 설정했다

 

주의할께 ethernets 아래에 인터페이스 이름을 주의 해야한다 

사람마다 다를 수 있으니 ip a 또는 ifconfig 를 사용해서 자신의 인터페이스 이름을 알아야한다

 

사람마다 이름이 다를 수 있다 필자의 경우에는 지금 enp0s3 이다 

 

 

 

 

이제 설정파일의 내용을 바꿔보자

 

1
2
3
4
5
6
7
8
network:
  ethernets:
    ens33:
      addresses: [192.168.35.50/24]
      gateway4: 192.168.35.1
      nameservers:
        addresses: [168.126.63.18.8.8.8]
  version: 2
cs

 

 

yaml 파일이니 들여쓰기에 주의하자.

 

 

이후 

 

적용하는 명령어는 다음과 같다

netplan apply

 

 

다시 아이피를 확인하자

ip a 또는 ifconfig
728x90
728x90

환경 19c

 

역시나 테이블은 이거쓸꺼다

 

 

 

p_store 별로 합계를 구할때 보통 이렇게 쓸것이다

 

 

이건데 이걸 말하고싶은게 아니다.

 

바로 누계(부분합)를 구하고싶다.

 

문법은 간단하니 사진으로 대체 하겠다.

 

 

 

 

 

728x90
728x90

환경 19c

 

이전 글 

https://nataekoon.tistory.com/179

 

ORACLE - LAG 함수 : 이전 행의 값을 가져온다

19C 환경 웹개발시 엑셀이나 어떤 표를 그릴때 적합할 것 같다. 테이블이 다음과 같은 데이터가 있다고 보자 P_STORE 별로 P_DATE 일자가 있는것 같고, 그에 따른 P_TOTAL 값이 보인다 (코드, 수량은

nataekoon.tistory.com

 

 

이 테이블의 데이터를 또 쓸것이다

 

 

이전 블로그를 참고했다면 문법은 거의 똑같다

 

사진 한장으로 대체 하겠다

 

728x90
728x90

19C 환경

 

웹개발시 엑셀이나 어떤 표를 그릴때 적합할 것 같다.

 

테이블이 다음과 같은 데이터가 있다고 보자

 

P_STORE 별로 P_DATE 일자가 있는것 같고, 그에 따른 P_TOTAL 값이 보인다 (코드, 수량은 무시하자)

 

 

이제 P_STORE 가 1000 인 제품의 표를 만들고 싶은데 하나의 칼럼을 추가하여 이전행의 값이 나왓으면 좋겠다

그리고 다음 칼럼에는 이전행과의 차이값을 나타냈으면 좋겠다. (증분값)

 

말로 설명하면 어려우니 한단계 씩 차례를 밟아보자

 

그림으로 보면 알 수 있을 것이다 

 

LAG(칼럼명, 건너뛸 로우수, 디폴트 값)  에서 건너뛸 로우수

즉, offset 을 1 로 했기에 이전행 = 1줄의 이전행 이라는 것이다

 

현재행 - 이전행 = 차이 를 구할 수 있다

 

이제 where 문을 없에고 p_store 별로 구해보자

 

partition by 칼럼명 문을 추가하면  되겠다.

 

 

728x90

'데이터베이스 > Oracle' 카테고리의 다른 글

ORACLE - SUM 함수의 다른 활용법  (0) 2025.01.28
ORACLE - LEAD 함수 : 다음 행의 값을 가져온다  (1) 2025.01.28
ORACLE - RANK 함수  (0) 2025.01.28
ORACLE - PIVOT, UNPIVOT  (0) 2025.01.26
docker 기반 oracle 19c 설치  (0) 2025.01.11

+ Recent posts