본문 바로가기
일기

24.07.04(목) PL/SQL SQL커서/ CASE문/CASE표현식/ IF문/ 반복문/GOTO문

by Boggi 2024. 7. 10.
반응형

7.04(목)
■GOTO문(잘만쓰면 좋은데 그렇게 선호하지는 않아)
- 코드내에 특정 레이블로 이동하는 문<<location>>
- 반복문 전에 반복문 대신 사용했던 문장.
- 구조적 프로그래밍을 위반하기때문에 권장하지 않아.

■PL/SQL의 SQL문
-SELECT이용해서 행 검색, DML문 사용하여 행 조작, commit/rollback/savepoint 사용하여 transaction 제어 가능

■ SQL CURSOR(커서)
- CURSOR는 SQL문을 실행하는 메모리 영역
- 암시적 커서와 명시적 커서가 있어

■implicit cursor(암시적 커서)
- SELECT ..INTO
- 반드시 1개 행만 fetch해야 한다.(단일행 결과만 가능)
- 결과가 2개 이상이면 명시적 커서를 이용해야한다.

# 암시적 커서에 대한 SQL 커서 속성
1. SQL%ROWCOUNT : 가장 최근의 DML문의 의해 영향을 받은 행의 수를 리턴해주는 값
2.SQL%FOUND : 가장 최근의 DML문에 의해 영향을 받은 행이 있으면 TRUE 없으면 FALSE로 평가되는 부울 속성

◎ %type 
: 손쉽게 컬럼의 타입을 제공받는 방법
 v_id    hr.employees.employee_id%type; -- %type:타입과 속성을 그대로 받겠어
v_fname v_lname%type; --이전에 선언한 변수의 타입과 속성을 그대로 받겠어

var b_avg_sal number

--bind변수 사용하기(현장에서는 전부다 변수처리로 돼 있다.)
--bind변수를 쓴 이유: 프로그램 안에서 값을 받아서 프로그램이 끝나더라도 바깥쪽에서 사용할 수 있는 기능을 모색하기 위해서 사용.
var b_id number
var b_name varchar2(30)
var b_day varchar2(30)
execute :b_id := 1
execute :b_name := 'scott'
execute :b_day := '2024-07-04'
BEGIN
INSERT INTO hr.test(id,name,day)
VALUES(:b_id,:b_name,to_date(:b_day,'yyyy-mm-dd'));
END;
/

--PL/SQL에서 그룹함수 사용하기
전체 사원에 대한 평균 그룹함수는 프로시저에서는 불가능하지만 PLSQL에선 가능하다.
BEGIN
    SELECT round(avg(salary),2)
    INTO :b_avg_sal --프로그램 호출 끝나더라도 바깥에서 쓰고싶어서 bind변수처리해보자
    FROM hr.employees;
    dbms_output.put_line('전체 사원의 평균 급여'||:b_avg_sal);
END;
/
print :b_avg_sal
SELECT * FROM hr.employees WHERE salary > :b_avg_sal;


--INSERT SUBQUERY해보자.
BEGIN
INSERT INTO hr.test(id,name,day)
SELECT employee_id, last_name, hire_date
FROM hr.employees;
dbms_output.put_line(sql%rowcount||' row created');
END;
/


PL/SQL 요약정리
■조건제어문
- boolean data type
- IF 문
- CASE 표현식
- CASE문
※ CASE문과 CASE표현식의 차이
- CASE 표현식은 조건을 평가하여 값을 반환한다.(함수처럼 값만 반환)
  CASE로 시작 END;로 끝
- CASE 문은 조건을 평가하여 작업을(SQL, 로직구현) 수행한다.(SQL문을 사용할 수 있다) -PS/SQL에서만 구현
  CASE로 시작 END CASE;로 끝

■반복문
반복문(LOOP)은 명령문이나 명령문 시퀀스를 여러번 반복한다.
1. LOOP문(기본 LOOP 문)
2. WHILE LOOP문
# CONTINUE
3. 3. FOR LOOP문