database/Oracle

[Oracle] PL/SQL_variable

솧이 2022. 9. 5. 11:58

▶ PL/SQL (Procedural Language SQL) 변수

변수는 데이터 임시 저장 영역이다

저장된 값을 저장 할 수 있다

저장된 값을 반복해서 재사용 할 수 있다

 

 

 변수명 규칙

반드시 문자로 시작한다

문자, 숫자, 특수문자 포함 가능하다

변수명 30byte 이하로 예약어는 포함이 불가하다

TYPE 변수 사용한다

 

 변수 Type을 선언할때 명시적으로 작성하지 않고 사용하는 방법도 있다.

%ROWTYPE - 해당 테이블이나 뷰의 컬럼 속성을 그대로 들고 오는 형태이다.  - 사용방법 : 변수명 테이블이름%ROWTYPE

  1. 테이블이나 뷰 내부의 컬럼 데이터 형 , 크기 , 속성을 그대로 사용할 수 있다.
  2. 테이블이름%ROWTYPE ; 으로 사용
  3. 지정된 테이블의 구조와 같은 변수 구조를 선언 할 수 있다.
  4. DB컬럼의 데이터타입, 컬럼의 수 등등 알기 어려울 때 쓰면 편하다
  5. 테이블의 컬럼이 변경돼도 수정할 필요 없다.

%TYPE - 해당 테이블의 컬럼 속성을 지정하여 그대로 들고 오는 형태이다. - 사용방법 : 변수명 테이블이름.컬럼명%TYPE

 

DECLARE
	v_profno f_professor.profno%TYPE; -- column 속성을 지정해서 들고 오기
    	v_pay f_professor.pay%TYPE;
BEGIN
	SELECT profno, pay INTO v_profno, v_pay
	FROM T_PROFESSOR 
	WHERE profno = 1001;
	DBMS_OUTPUT.PUT_LINE(v_profno || '번 교수의 급여는' || v_pay || '입니다');
END;
/
DROP TABLE t_emp5 CASCADE CONSTRAINT;
CREATE TABLE t_emp5
AS 
SELECT empno, ename, sal FROM t_emp;

DECLARE
    vno t_emp5.empno%TYPE;
    vname t_emp5.ename%TYPE;
    vsal t_emp5.sal%TYPE;
BEGIN
    SELECT empno, ename, sal INTO vno, vname, vsal
    FROM t_emp5
    WHERE empno = 7900;
    
    DBMS_OUTPUT.PUT_LINE(vno || ' ' || vname || ' ' || vsal);
       
END;
/

 

 rowtype 변수를 활용한 테이블 -> 테이블 데이터 입력

v_record에 row_test 컬럼을 담고 no = 1인 row_test를 v_record에 담는다 그리고 row_test2에 v_record를 삽입한다

CREATE TABLE row_test (
	no NUMBER,
    name VARCHAR2(10),
    hdate DATE
);

CREATE TABLE row_test2
AS
SELECT * FROM row_test;

INSERT INTO row_test VALUES(1, 'AAA', SYSDATE);
INSERT INTO row_test VALUES(2, 'BBB', SYSDATE);
INSERT INTO row_test VALUES(3, 'CCC', SYSDATE);

SELECT * FROM row_test;
SELECT * FROM row_test2;

DECLARE
    v_record row_test%ROWTYPE;
BEGIN
    SELECT * INTO v_record -- 모든 컬럼이 담긴 row 타입
    FROM row_test
    WHERE no = 1;
    
    INSERT INTO ROW_TEST2 
    VALUES v_record; -- rowtype 변수로 insert
END;
/

 

 

 update

DECLARE
	v_record row_test%ROWTYPE;
BEGIN
	SELECT * INTO v_record
    FROM ROW_TEST
    WHERE NO = 1;
    
    v_record.name := 'DDD';
    UPDATE row_test2
    SET ROW = v_record -- ROW 사용하여 모든 row를 rowtype 변수 값으로 업데이트
    WHERE no = 1;
END;
/

 

'database > Oracle' 카테고리의 다른 글

[Oracle] PL/SQL_cursor  (0) 2022.09.05
[Oracle] PL/SQL_control  (0) 2022.09.05
[Oracle] constraint 정리  (0) 2022.09.04
[Oracle] constraint (제약조건)  (0) 2022.09.04
[Oracle] View  (0) 2022.09.04