트랜잭션(Transaction), 치환변수, save명령어, 리소스부족에러발생시

트랜잭션(Transaction)

  • 아주 중요한 개념
  • 하나의 논리적인 작업단위
  • 논리적이다보니 언제 트랜잭션이 시작되고 끝나는지 눈에 보이지않는 작업이다.
  • 여러 DML이 모여서 하나의 트랜잭션으로 구성되기도 함 : insert, update, delete
  • DML 작업 후 commit, rollback으로 트랜잭션 종료해야함
  • 하나의 DDL 구문이 하나의 트랜잭션으로 구성되기도 함 : create, alter, drop, truncate
  • 하나의 DCL 구문이 하나의 트랜잭션으로 구성되기도 함 : grant, revoke

트랜잭션 시작 및 종료

  • 트랜잭션 시작 : 첫번째 DML구문이 실행 시
  • 트랜잭션 종료 :
    • commit, rollback실행 시
    • DDL 또는 DCL구문 실행 시 (autocommit)
    • SQL PLUS 정상 종료 시 (autocommit)
      • 터미널창 X를 닫는 건 비정상적인 종료
      • 터미널창에서 EXIT() 명령어를 통한 종료는 정상적인 종료
    • SQL Developer 정상 종료 시 (autocommit)
      • SQL Developer의 X를 누르면 저장하시겠습니까 팝업이 뜨는데 저장 안하고 종료하면 비정상적인 종료
      • SQL Developer의 X를 누르면 저장하시겠습니까 팝업이 뜨는데 저장하고 종료하면 정상적인 종료
    • 시스템 장애 시 (autorollback)
  • savepoint
    • 트랜잭션안에서만 사용가능
1
$ savepoint 세이브포인트명




치환변수

아래 쿼리에서 모든 건 다 똑같고 employee_id만 100,101,102,… 변화시키고싶다.
이때 치환변수를 이용하면 훨씬 용이하다

1
2
3
$ select employee_id, last_name, salary
$ from employees
$ where employee_id = 치환변수
  • 치환변수사용법 : &변수명
    • 변수명은 항상 의미있게 작성해야한다.
    • 문자, 날짜가 들어와야하는 데이터인 경우는 ‘&변수명’로 입력하면 된다.
    • 문자는 대소문자를 구분하므로 lower()나 upper()를 양쪽변에 같이 써서 맞춰주면 된다.
1
2
3
4
5
6
7
8
9
//데이터가 숫자
$ select employee_id, last_name, salary
$ from employees
$ where employee_id = &emp_id

//데이터가 문자나 날짜
$ select employee_id, last_name, salary
$ from employees
$ where lower(last_name) = lower('&last_name')

쿼리구문을 작성하면 자동으로 변수를 물어봐준다. 이에 응답하면 데이터를 출력해준다.




save명령어 : 자주 실행되는 쿼리구문 저장하기

만약 회사가 department를 자주 생성하는 회사이다.
이럴경우 치환변수를 넣어 쿼리구문을 저장하고 필요할때마다 편하게꺼내서 실행할 수 있다.
자주 실행되는 쿼리구문은 save 명령어로 저장한다

save명령어로 쿼리구문을 저장하는 방법

  • sql plus에서만 있는 명령어.
  • sql develoepr는 save 명령어가 없다. why? 걍 저장버튼을 누르면 되기때문
1
2
3
4
5
6
7
//1. SQL구문입력
$ insert into departments
$ values (&dept_id, '&dept_name', &mgr_id, &loc_id)
//2. 첫 치환변수들 물음에 답하기
//3. insert성공
//4. save명령어작성
save 저장원하는경로/저장할이름.sql

save명령어 저장된 쿼리구문 사용하는 방법

  • sql plus에서만 있는 명령어.
  • sql develoepr는 @명령어가 없다. why? 걍 열기버튼을 누르면 되기때문
1
$ @/저장한경로/저장한이름.sql
  • 예시
1
$ @/home/oracle/new_dept.sql




터미널창에서 리소스부족에러 발생시

보통은 유저가 많이 접속된 경우에 리소스부족에러가 자주 발생한다.
따라서 제일 먼저 의심해봐야하는 건 유저가 동시접속되어있지않은가이다.
터미널창에서 exit 명령어를 이용해서 접속되어있는 유저 한명씩 종료시켜준다. 마지막 한 유저만 남을 때까지.