트랜잭션(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
치환변수
아래 쿼리에서 모든 건 다 똑같고 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
| $ @/home/oracle/new_dept.sql
|
터미널창에서 리소스부족에러 발생시
보통은 유저가 많이 접속된 경우에 리소스부족에러가 자주 발생한다.
따라서 제일 먼저 의심해봐야하는 건 유저가 동시접속되어있지않은가이다.
터미널창에서 exit 명령어를 이용해서 접속되어있는 유저 한명씩 종료시켜준다. 마지막 한 유저만 남을 때까지.