어제 갑자기 장염에 걸리는 바람에 조퇴를 해서
수업을 제대로 듣지 못했다.
아침에 죽 2~3숟갈밖에 먹지 못했는데 분수토를 연달아 4번이나 했다.
머리, 허리, 다리 까지 쑤시고 하루종일 포카리스웨트랑 약만 먹고 정말 힘들었다.
하필 어제부터 새로운 내용에 들어가서 ㅜㅠ 그걸 듣지 못해서 걱정된다.
일단 PPT를 보면서 SQL Developer에 따라 치는 것 까지만 해두긴했는데
무슨 말인지 잘 모르겠다.
오늘 하면서 진도를 따라갈 수 있었으면 좋겠다.
어제것 복습
SQL 문장 -> 오라클 서버에서 돌아가고(select from where~)
PL/SQL -> 껍데기는 PL/SQL 엔진에서 돌아간다
-> 각각 다른 곳에서 처리된다
SQL 구문 : select from where, merge ..
3. PL/SQL 기본 구조
- 선언부(DECLARE), 실행부(BEGIN), 예외처리부 (EXCEPTION)로 구성됨.
-> BEGIN만 있는 경우도 있음(ex. 변수가 없는 경우)
- Anonymous PL/SQL Block(익명블록) 과 Stored PL/SQL Block(저장된 블록) 이 있음.
- 익명 블록은 주로 일회성으로 사용할 경우 많이 사용이 되고, 저장된 블록은 서버에 파싱해서 저장해 놓고 주기적으로 반복해서 사용할 경우 사용됨.
- Stored PL/SQL Block 은 다른 용어로 서브프로그램 또는 프로그램 단위라고도 하며, 스키마를 구성하는 오브젝트로서 파싱 된 후 오라클 서버 내부에 저장되거나 오라클 툴 안에 라이브러리 형태로 저장되어 있음.
- 파싱이란?
ex) txt가 있으면
홍길동, 010--, 서울 중구
김연아, 010-2234-3456, 서울 동구
..
-> 파싱 : ex) , 를 기준으로 쪼갠다.
txt 파일은 1개인데
변수1 변수2 변수3
홍길동 010 서울 중구
이런 식으로 쪼개서 저장
- 서브프로그램, 프로그램 단위
Command Line I (SQL plus) <-> GUI(우리가 sql developer를 볼 때 보이는 모든 것 -> sql plus보다 보기 편하고 깔끔)
- SQL plus를 꼭 써야 할 때 : 비상 상황, 인터넷 연결 안되는 경우 등
Executable : Begin ~ End;
PL/SQL은 기본적으로 처리된 PL/SQL 문장의 결과를 화면에 출력하지 않는다.
-> 결과를 화면에 출력하고 싶으면 미리 사전작업이 필요
-> SET SERVEROUTPUT ON; <- 화면 출력기능 활성화
BEGIN 내에 SELECT FROM WHERE이 SQL 문장이고
INTO vno, vname에서 결합한다.
DECLARE : 선언
vno NUMBER(4);
vname VARCHAR2(10); -> 변수 vno와 vname을 숫자, 문자의 형태로 선언
BEGIN : 실행부 시작
select employee_id, first_name INTO vno, vname -> 직원id와 이름을 앞에서 선언한 vno, vname에 저장한다
from employees -> 직원id와 이름은 employees 테이블에 있는 것을 사용한다
where employee_id=200; -> 조건 : 직원 id가 200인 직원의 이름만
DBMS_OUTPUT.PUT_LINE(vno||' '||vname); -> vno vname 식으로 출력한다.
END; -> 끝
&id : 입력하는 창이 뜸
|| : 문자열 더하기 연산
SEQUENCE - 자동 번호(순서) 생성기
- 사용법 : sequence 이름.NEXTVAL, '문자'
insert into pl_test를 한번 더 수행하면 sequence에 의해 번호가 자동으로 부여되면서 'AAA'가 추가된다
:= 오른쪽에서 왼쪽으로 배정, 할당
SQL문장(delect ~ where)을 PL 블록(declare ~ begin ~ end)이 포함하고 있다.
- begin ~ end는 안에 들어있는 여러 SQL 문장을 한 덩어리를 묶는역할.
- 블록에 이름을 지어 놓으면 묶어 놓은 것을 쓰기 편하다
-> 프로시저
MERGE INTO p2를 m2라고 이름지음
USING p1를 m1라고 이름지음
-> p2라는 것에 p1를 갖다 붙인다, 결합시킨다.(아래 위로)
no가 같을 때
ID가 서로 같으면 update하고
서로 다르면 insert를 하라
원래는 p2에
1 CCC가 있었는데 1이 같아서
1 AAA로 바뀜
2 BBB는 같은게 없어서 insert됨
-> 안보고 작성할 수는 없어도 해석할 수 있고 보면서 비슷한 걸 응용, 작성할 수 있어야 함.
- 식별자(identifier) : 변수 이름, 사용자 정의, 객체에 부여되는 이름
리터럴 : 문자 그대로
1.3f 1.3 'a' "안녕"
원래는 JAVA, python에서는 한글자는 'a', 여러 글자는 "aaa"가 들어감
- 주석 : /* */ 이거 쓰지 말고 -- 이것 쓰기
9. 중첩된 PL/SQL 블록 작성하기
- 중첩 : nested, duplicate(복제된, 중복)
-> nested : 내용1(Begin ~ End) 안에 내용2(Begin ~ End)가 들어가 있는 느낌(병렬x)
ex) 3~12번 안에 6~9번이 중첩되어 있음, 내용1에서 만든 변수, 내용2에서 만든 변수 ex 손흥민
-> 내용2 안에서만 손흥민을 안다. 내용 1에서는 모른다.
But, 내용 1에서 변수 김연아를 만들었다 -> 내용1, 내용2 모두에서 변수 김연아를 안다.
-> duplicate : create a1 있는데 또 만드는 느낌
/
-> 구역을 나눠줌
-> 실행 결과 에러남
-> 내용1에서 v_first 변수 만들고 내용 2에서 v_second를 만들었다. -> 내용1, 2 모두에서 아는 변수는 v_first
-> v_second는 내용2 안에서 만든 변수이므로 내용1에서는 모르는 변수임
-> 내용 1에서 v_second를 지워주면 오류가 나지 않음
a /= 3
-> a = a/3을 줄인 표현
NOT : not price > 20000 -> price > 20000이 참이면 False가 됨
** : 보통 계산기에서는 2^3 = 2 x 2 x 2인데 2**3으로 써주어야 함 -> 자바나 파이썬에서도 마찬가지
2 step
1) 만들기
- 반드시 문자로 시작 ex) 1vno (X), *vno(X)
- 특수문자는 _정도 쓰고 나머지는 쓰지 않는다 ex) v_no
- 변수명 30bytes 이하 -> 한글로 15자, 영어 30자
- 예약어X ex) declare, select 등
- 선언부(Declare)에서 선언해도 되고 원할 시 특정 값으로 초기화 가능
v_no := 0;
2) 사용하기
-> 1번 만들어 놓고 n번 사용한다 -> 한 번만 쓰고 말거면 만들 필요 없다.
5가지
- 스칼라 변수, %TYPE 변수, %ROWTYPE 변수, RECORD TYPE, TABLE TYPE, BIND 변수
구분
- PL/SQL 변수
단순 변수 - 스칼라 변수
- 참조 변수 - %TYPE 변수 ex) v_no 변수의 자료형을 salary의 자료형과 같이 하라
-> salary의 자료형이 바뀌면 v_no 변수의 자료형도 바뀜
- %ROWTYPE 변수 ex) 원본 테이블에 있는 자료형을 참조하라
LOB
복합 변수 - RECORD TYPE
(여러개) - TABLE TYPE ex) a(10) a라는 이름을 붙이고 자료가 10개 -> 10개를 한꺼번에 데리고 가려고
- 비 PL/SQL 변수 - BIND 변수
1. 단순 변수
1) SCALAR 변수 : 자료(유)형 - Data type
- 주요 : number, varchar2, date
- char말고 varchar2를 쓰면 됨
- varchar2(100) 해놓고 3만 썼다. -> 안쓴 데이터 낭비 아닌가? No. -> '가변길이' : 남은 데이터 알아서 정리해 줌
- integer : 정수형(3.14같은 실수 X)
- binary, pls 구분하지 않고 그냥 number 쓰면 되긴 함
256^4 : 42억 ... -> 정수 42억개 표현이 가능하다.
1byte = 2^8
- float : 실수형
-> floating : 부동 소숫점 -> 움직인다
ex) 123.789 -> 1.23789x10^2 : 부동 소숫점 표현
정수부.소수부x지수부
32bit에 10/10/12 나눠서 2^10 = 1024 / 1024 / 4096 .. 이런 식으로 정수 / 소수 / 지수 이만큼 저장이 가능하다
cf) double - 2^64(8바이트), float 2^32(4바이트) 표현 가능
-> 모르겠다? number쓰면 됨
- boolean : true, false만 담을 수 있다.
ex) login varchar2
'성공'
'실패' -> 이렇게 해도 되고
login boolean 으로 설정해 놓으면
True / False
login number
0/1
- binary_double
42억 x 42억 만큼 들어간다.
9바이트 - 72bit정도
- date
TO_DATE : varchar2 -> date
TO_CHAR : date -> varchar2
- TIMESTAMP
ex) 티켓구매 프로그램 구현 - 구매 테이블에 insert into로 누가 샀다~~~ 이런게 입력될 것
-> sequence로 해서 번호 부여해도 되지만 예매 시기가 ms단위까지 똑같을 수도 있다.
-> 그렇기 때문에 sequence 느낌처럼 누가 먼저 insert 했는지 디테일하게까지 시간 저장
- with time zone : 우리 나라는 상관 없는데 미국의 경우 동부 시각, 서부 시각 서로 다름
- interval : 간격
2) Reference 변수(참조 변수)
- Vno emp.ename%TYPE -> Vno 변수는 emp 테이블의 ename과 같은 자료형으로 하라
- Vrow emp%ROWTYPE -> emp 테이블의 모든 자료형을 가지고 옴
- 내가 참조한 자료형의 원본이 바뀌면 같이 변경 된다.
- 변수명 테이블%ROWTYPE; id name salary ..
num var num
-> 칼럼들의 자료형을 다 가지고 온다.
select * into v_row
from 테이블명
사용할 때는 v_row.employee_id, v_row.first_name 등으로 사용
- 입력 받아야 하는 경우
변수 자료형 := &no1 ; -> 자료형을 지정해서 변수를 만들고 no1의 값을 입력 받아서 변수에 넣는다.
- 가장 처음에 변수에 어떤 값을 넣는 것 -> 초기화
if) vno number;
-> 초기화를 안해주면 쓰레기값이 들어가있다.
2. 복합변수
- 둘 다 많이 사용됨
- 레코드(프로그램에서) -> DB(오라클)에서는 튜플이라고 함(가로로 한 줄)
ex) rowtype -> 튜플(한 줄)에서 자료형을 가지고 오는 것
profno
name
birthday
-> 각각의 변수인데 복합변수는 두개를 묶음 -> profno, name, birthday를 하나로 묶음
professor.profno, professor.name, . . 테이블.컬럼
- 컬렉션 : 값들이 있으면 값 앞에다가 별명을 지정하는데 번호로 1, 2, 3, 4, 5 등으로 지정하거나 man1, man2, .. 등의 간단한 key 값을 지정. key 값은 중복X
1 - 박지성
2 - 김연아
3 - 추신수
..
-> 이걸 다 묶어서 user 변수로 지정하면 user(1), user(2)
박지성 김연아
no1 박지성
skt 김연아
3 추신수
user("no1") -> 박지성
user("skt") -> 김연아
..
- 빨간네모 안 내용 : 레코드 타입의 자료형 만들기(정의, define)
TYPE professor IS RECORD : 레코드 타입의 Professor이라는 자료형을 만들겠다
-> professor라는 자료형은 없음 -> 내가 만든 변수 유형/자료형 -> 사용자 정의 자료형
빨간 네모 맨 아래에 있는 v_rec1 professor ; -> v_rec1이라는 변수를 내가 만든 professor형으로 만들것이다.
|number|varchar2|number| -> 요 자료형 => professor형
ex) vPro Professor -> Professor라는 자료형으로 vPro 변수를 만들것이다.
begin
SELECT employee_id, first_name, salary INTO v_rec1
DMBS ~ 사용할 때는 v_rec1.emp_id
- 컬렉션 타입 중 Table Type : 두 칸짜리
* 연관 배열 : 가장 많이 씀 -> name에 값을 넣는데 key값을 매긴다 -> key값은 중복 X -> User라는 이름으로 key 1~4를 묶음 -> User(1) : AAA ..
* 중첩 테이블
* VARRAY
TYPE 자료형 이름 IS TABLE OF : of -> 타입은 하나, 값은 여러 개(ex. number형 값 여러개)
자동으로 순서대로 숫자 0부터 부여됨
index
0 홍길동
1 박지성
2 김연아
3 추신수
4
- 프로그램에서 INDEX : 0으로 시작
tab_type은 변수 이름
e_table_type은 내가 만든 자료형 이름
tab_type first_name
0 Ellen <- tab_type(0)
1 Sundar <- tab_type(1)
2 Mozhe
3 David
4
-> 프로그램에서는 이것을 배열(Array)이라고 함
3. 비 PL/SQL 변수
BEGIN ~ END 까지가 PL 블록
/
PRINT v_bind와는 별개
VARIABLE v_bind NUMBER; -> variable로 하면 전국구 느낌! 별개인 / 이후인 print 영역에서도 v_bind를 사용 가능
Declare에서 v_bind를 쓰면 그 동네 안에서만 사용 가능 / 이하 print 영역에서는 v_bind를 사용 불가능
오잉.. 아무것도 나오지 않는다.
/를 기준으로 윗 부분을 실행시키면
바인드 입력하라는 창이 뜨고
/ 아랫부분을 실행시키면 아무것도 안나오는데..
두개를 같이 실행시키니까 '바인드 입력'창이 나오지 않고 결과가 나온다!
원래는 그냥도 되어야한다고 한다.
아니면 따로 워크시트를 만들어서
스크립트 실행을 누르니까 값이 나왔다.
인터넷에 찾아보니까 아래와 같이 나왔는데 그럼 맞게 나온거 아닌가........?
'명령문 실행'은 정렬 가능한 테이블의 모든 결과의 목록을 제공합니다. 또한 커서 아래 (또는 강조 표시)의 명령문만 실행됩니다. 명령문을 실행할 때 바인드 변수를 입력하라는 프롬프트가 표시됩니다 (앞자리에 :가 있는 공간).
예 :
select * from customers where customer_id = : id
id에 대한 값을 요구할 것입니다.
스크립트 실행은 워크 시트의 모든 명령문을 실행하고 결과의 텍스트 판독 값을 제공합니다. 바인드 변수의 값을 묻지 않습니다.
[출처] Oracle SQL Developer 명령문 실행 스크립트 실행 차이|작성자 바냐파노
요약
[단순]
스칼라 변수 : Number, varchar2 등
참조 - %TYPE : 가지고 온다
참조 - %ROWTYPE : 한 줄의 자료형을 다 가져온다
[복합]
RECORD TYPE : |number|varchar2|number| 이렇게 들고와서 자료형을 만들어서 만든 자료형을 가지고 와서 변수를 만든다.
TABLE TYPE : RECORD와 마찬가지로 여러개를 담을 수 있으나 같은 타입을 담을 수 있다.
[BIND] 영역이 다른 변수를 연결시킴 -> 전국구로 만드는 것
'프로그래밍 > 자바(java) 융합개발자 2차' 카테고리의 다른 글
[자바 기초] 10일차 일지 1 - 6. 데이터 모델링 (0) | 2020.12.28 |
---|---|
[취성패] 자바 배우기 - 9일차 일지(PL/SQL 제어문, 커서) (0) | 2020.12.24 |
[취성패] 자바 배우기 - 7일차 일지(PL/SQL) (0) | 2020.12.23 |
[취성패] 자바 배우기 - 6일차 일지(부속질의 - 스칼라, 인라인 뷰, 중첩질의2) (0) | 2020.12.21 |
[취성패] 자바 배우기 - 5일차 일지 2(부속질의 - 스칼라, 인라인 뷰, 중첩질의1) (0) | 2020.12.18 |