본문 바로가기
Study/SQL

22.plsql 변수

by 로롤로롱 2023. 5. 15.

/*
<PL/SQL>
    오라클 자체에 내장되어 있는 절차적 언어로 SQL 문장 내에서 변수의 정의, 조건 처리(IF), 반복 처리(LOOP, FOR, WHILE) 등을 지원한다.
        (다수의 SQL 문을 순서대로 실행 할 수 있다)
        
        [PL/SQL의 구조]
            1) 선언부(DECLAER SECTION)
                DECLARE로 시작, 변수나 상수를 선언 및 초기화하는 부분이다.
                생략가능
            2) 실행부(EXECUTABLE SECTION) 
                BEGIN로 시작, SQL 문, 제어문(조건, 반복문) 등의 로직을 기술하는 부분이다.
            3) 예외 처리부(EXCEPTION SECTION) 
                EXCEPTION로 시작, 예외 발생 시 해결하기 위한 구문을 기술하는 부분이다.
                생략가능

DECLARE
    선언부
    - 변수선언
    - 각 문장의 끝은 세미콜론;
    - 생략가능
BEGIN
    실행부
    - 로직처리
    - 조건문, 반복문
    - DML문만 사용 가능
EXCEPTION
    예외처리
    - 오류발생시 실행
    - 생략가능
*/

-- 환경설정을 해주지 않으면 출력되지 않는다
-- 프로시저를 사용하여 출력하는 내용을 화면보여주도록 설정하는 환경변수
SET SERVEROUTPUT ON;
-- 출력기능 OFF
SET SERVEROUTPUT OFF;

-- 실행부
-- 선언부, 예외처리부 생략 가능
-- 블록 명칭이 생략 된 경우 익명블록이라고 함
BEGIN
DBMS_OUTPUT.PUT_LINE('안녕하세요!');
END;

/*
한페이지에 여러개의 PL/SQL문장이 있는경우 /를 이용해서 구분
하나의 PL/SQL문장의 끝을 나타내줌
*/

/*
1) 변수선언 -> 변수명 데이터타입 := 초기값;
    - 초기값을 할당하지 않는 경우 null값 할당
2) 상수선언 -> 상수명 CONSTANT 데이터타입 := 상수값;
    - 한 번 값을 할당하면 변경 불가
*/
-- 선언부
DECLARE
    -- 변수명 변수타입
    vi_num NUMBER;
-- 실행부
BEGIN
    -- vi_num :=100;
    DBMS_OUTPUT.PUT_LINE('vi_num : '||vi_num);
END;
/

DECLARE
    -- CONSTANT : 상수는 선언과 동시에 초기화
    pi CONSTANT NUMBER := 3.14;
BEGIN
    -- 상수는 값 변경 불가
    -- pi := 10;
    DBMS_OUTPUT.PUT_LINE('pi : '||pi);
END;
/
/*
3) 변수 데이터 타입
    (1) SQL 타입(NUMBER, CHAR, VARCHAR2 DATE 등)
     - 변수의 타입을 SQL타입을 이용하여 지정
       -> 변수명 타입;
    (2) PL/SQL타입
     - 변수의 타입을 테이블의 컬럼의 데이터 타입을 참조하여 지정
       -> 변수명 테이블명.컬럼명%TYPE;
     - 변수의 타입을 테이블의 모든 컬럼을 참조하여 지정
       -> 변수명 테이블명%ROWTYPE;
4) DML 문 
    (1) SELECT INTO : 테이블에서 특정 값을 선택해 변수에 할당할 경우 사용
    (2) &를 넣으면 값을 입력 받는 창이 나옴 ex) WHERE emp_id = '&emp_id';
*/

/* EX)
    변수선언 : radius, pi(상수)
*/
DECLARE
    -- 선언과 동시에 초기화 가능
    radius NUMBER := 5;
    -- 선언과 동시에 초기화 하지 않으면 오류 발생
    pi CONSTANT NUMBER := 3.14;
BEGIN
    -- 변수이므로 중간에 값 변경 가능
    radius := 10;
    DBMS_OUTPUT.PUT_LINE('원의 둘레 : '||radius*pi*2);
END;
/
/*
문제1)
 eid, ename을 변수로 선언하고 초기화하여 아래와 같이 출력
 eid : 999
 ename : 나애리
*/
DECLARE
    eid NUMBER := 999;
    ename VARCHAR2(10) := '나애리';
BEGIN

    DBMS_OUTPUT.PUT_LINE('eid : '||eid);
    DBMS_OUTPUT.PUT_LINE('ename : '||ename);

END;
/

RENAME employee TO emp;
RENAME department TO edpt;

-- SQL문을 이용해서 조회된 결과를 변수에 할당
SELECT emp_id, emp_name
FROM emp
WHERE emp_id = 200;

DECLARE
    eid NUMBER;
    ename VARCHAR2(10);
BEGIN
    SELECT emp_id, emp_name
    INTO eid, ename -- 제시된 컬럼과 변수의 개수와 타입이 일치해야한다.
    FROM emp
    -- 다수의 행이 반환 된 경우 오류 발생
    WHERE emp_id = &사번; -- &사번 : 사용자로부터 입력받은 값으로 대체
    
    DBMS_OUTPUT.PUT_LINE('eid : '||eid);
    DBMS_OUTPUT.PUT_LINE('ename : '||ename);
END;
/

/*
    1. 파라메터로 입력받는 방법
        사번에 대한 데이터값 입력 창이 뜨고, 사용자로부터 입력 받은 값으로 변경해준다.
        WHERE emp_id = &사번;
    2. SELECT문의 조회결과를 변수에 담는 방법
        SELECT emp_id, emp_name
        INTO eid, ename  <- 조회되는 컬럼의 개수와 타입이 일치해야함
*/

DECLARE
    eid EMP.EMP_ID%TYPE;
    ename EMP.EMP_NAME%TYPE;
BEGIN
    SELECT emp_id, emp_name
    INTO eid, ename
    FROM emp
    WHERE emp_id = &사번; 
    
    DBMS_OUTPUT.PUT_LINE('eid : '||eid);
    DBMS_OUTPUT.PUT_LINE('ename : '||ename);
END;
/

/*
< PL/SQL 선언부(DECLAER SECTION) >
        변수 및 상수를 선언해 놓는 공간
        선언과 동시에 초기화도 가능
    
    < 변수 및 상수의 타입 >
        1) 일반 타입 변수 
            - SQL 타입 (NUMBER, CHAR, VARCHAR2, DATE 등)
        2) 레퍼런스 타입 변수 
            - PL/SQL 타입 (테이블의 컬럼타입을 참조)
        3) ROW 타입 변수
            - PL/SQL 타입 (하나의 테이블의 모든 컴럼의 값을 한꺼번에 저장할 수 있는 변수)
        
    1) 일반 타입 변수의 선언 및 초기화
            [표현법]
                변수명 [CONSTANT] 자료형(크기) [:= 값];
      자료형 : NUMBER, CHAR, VARCHAR2, DATE 등 SQL타입
    
     2) 레퍼런스 타입 변수 선언 및 초기화
            [표현법]
                변수명 테이블명.컬럼명%TYPE;
            
            - 변수의 타입을 지정하는데
                테이블의 컬럼의 데이터 타입을 참조 하여 지정
*/

-- 문제) 사원명을 입력받아서 사원의 사번, 사원명, 급여정보를 각각 eid, ename, sal 변수에 대입 후 출력
-- job_name 출력
DECLARE
    eid EMP.EMP_ID%TYPE;
    ename EMP.EMP_NAME%TYPE;
    sal VARCHAR2(15);
    job_name JOB.JOB_NAME%TYPE;
BEGIN
    SELECT emp_id, emp_name, TO_CHAR(salary,'999,999,999'), job_name
    INTO eid, ename, sal, job_name
    FROM emp
    JOIN job USING(job_code)
    WHERE emp_name='선동일'; -- 문자타입인 경우 '(홑따옴표)'로 감싸줌
    
    DBMS_OUTPUT.PUT_LINE('eid : '||eid);
    DBMS_OUTPUT.PUT_LINE('ename : '||ename);
    DBMS_OUTPUT.PUT_LINE('salary : '||sal);
    DBMS_OUTPUT.PUT_LINE('salary : '||job_name);
END;
/

/*
     3) ROW 타입 변수 선언 및 초기화
            [표현법]
                변수명 테이블명%ROWTYPE;
                
            - 하나의 테이블의 여러 컴럼의 값을 한꺼번에 저장할 수 있는 변수를 의미한다.
            - 모든 컬럼을 조회하는 경우에 사용하기 편리하다.
             
            * ERROR : 테이블이름과 같은 변수명은 오류를 발생
*/
DECLARE
    e EMP%ROWTYPE;
BEGIN
    SELECT * INTO e
    FROM emp
    WHERE emp_id=200;
    
    -- 변수명.컬럼명으로 접근 가능
    DBMS_OUTPUT.PUT_LINE('사번 : '||e.EMP_ID);
    DBMS_OUTPUT.PUT_LINE('사원명 : '||e.EMP_NAME);
END;
/
-- 학생 백업 테이블 생성(테이블 구조만 복사)
CREATE TABLE tb_student_bk
AS SELECT * FROM tb_student WHERE 1=2;

/*
실습
    변수선언
        student_info : TB_STUDENT테이블의 모든 컬럼정보를 담고 있습니다
        
    1. 학번이 A213046인 학생의 정보를 조회하여 변수에 담기
    2. 학생의 정보를 TB_STUDENT_BK테이블에 입력

*/
SELECT *
FROM tb_student
WHERE student_no = 'A213046';

DECLARE
    student_info tb_student%ROWTYPE;
BEGIN
    SELECT * INTO student_info
    FROM tb_student
    WHERE student_no = 'A213046';
    
    INSERT INTO tb_student_bk VALUES student_info;
    
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT||'건 처리 되었습니다.');
END;
/
SELECT * FROM tb_student_bk; 

'Study > SQL' 카테고리의 다른 글

24.plsql함수  (0) 2023.05.17
23.plsql실행부  (0) 2023.05.16
21.인덱스  (0) 2023.05.13
16.DML  (0) 2023.05.08
13.JOIN  (0) 2023.05.05

댓글