📚 Study/Oracle
Oracle :: %TYPE, %ROWTYPE
bono-hye
2023. 11. 6. 23:02
(파일명 20231102_03_hr(plsql))
■ %TYPE
- 특정 테이블에 포함되어 있는 컬럼의 데이터타입(자료형)을 참조하는 데이터타입
- 형식 및 구조
변수명 테이블.컬럼명%TYPE [:= 초기값];
-- HR.EMPLOYEES 테이블의 특정 데이터를 변수에 저장
DECLARE
--V_NAME VARCHAR2(20);
V_NAME EMPLOYEES.FIRST_NAME%TYPE;
BEGIN
SELECT FIRST_NAME INTO V_NAME -- 쿼리로 얻어낸 값을 변수에 담을 때에는 V := 쿼리 이런게 아니라 INTO 변수로!!
FROM EMPLOYEES
WHERE EMPLOYEE_ID = 103;
DBMS_OUTPUT.PUT_LINE(V_NAME);
END;
--○ EMPLOYEES 테이블을 대상으로 108번 사원(Nancy)의
-- SALARY 를 변수에 담아 출력하는 PL/SQL 구문을 작성한다.
DECLARE
V_SAL EMPLOYEES.SALARY%TYPE;
BEGIN
SELECT SALARY INTO V_SAL
FROM EMPLOYEES
WHERE EMPLOYEE_ID = 108;
DBMS_OUTPUT.PUT_LINE(V_SAL);
END;
--==>>
/*
12008
PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/
--○ EMPLOYEES 테이블의 특정 레코드 항목 여러 개를 변수에 저장
-- 103번 사원의 FIRST_NAME, PHONE_NUMBER, EMAIL 항목을 변수에 저장하여 출력
-- Alexander, 590.423.4567, AHUNOLD
DECLARE
V_FIRST_NAME EMPLOYEES.FIRST_NAME%TYPE;
V_PHONE_NUMBER EMPLOYEES.PHONE_NUMBER%TYPE;
V_EMAIL EMPLOYEES.EMAIL%TYPE;
BEGIN
SELECT FIRST_NAME, PHONE_NUMBER, EMAIL INTO V_FIRST_NAME, V_PHONE_NUMBER, V_EMAIL
FROM EMPLOYEES
WHERE EMPLOYEE_ID = 103;
DBMS_OUTPUT.PUT_LINE(V_FIRST_NAME || ' ,' || V_PHONE_NUMBER || ', ' || V_EMAIL);
END;
--==>> Alexander ,590.423.4567, AHUNOLD
■ %ROWTYPE
- 테이블의 레코드와 같은 구조의 구조체 변수를 선언 (여러 개의 컬럼)
- 형식 및 구조
변수명 테이블명%ROWTYPE;
DECLARE
--V_FIRST_NAME EMPLOYEES.FIRST_NAME%TYPE;
--V_PHONE_NUMBER EMPLOYEES.PHONE_NUMVER%TYPE;
--V_EMAIL EMPLOYEES.EMAIL%TYPE;
V_EMP EMPLOYEES%ROWTYPE;
BEGIN
SELECT FIRST_NAME, PHONE_NUMBER, EMAIL
INTO V_EMP.FIRST_NAME, V_EMP.PHONE_NUMBER, V_EMP.EMAIL
FROM EMPLOYEES
WHERE EMPLOYEE_ID = 103;
--DBMS_OUTPUT.PUT_LINE(V_FIRST_NAME || ' ,' || V_PHONE_NUMBER || ', ' || V_EMAIL);
DBMS_OUTPUT.PUT_LINE(V_EMP.FIRST_NAME || ' ,' || V_EMP.PHONE_NUMBER || ', ' || V_EMP.EMAIL);
END;
--==>>
/*
Alexander ,590.423.4567, AHUNOLD
PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/
--○ EMPLOYEES 테이블의 전체 레코드 항목 여러 개를 변수에 저장
-- 모든 사원의 FIRST_NAME, PHONE_NUMBER, EMAIL 항목을 변수에 저장하여 출력
DECLARE
V_EMP EMPLOYEES%ROWTYPE;
BEGIN
SELECT FIRST_NAME, PHONE_NUMBER, EMAIL
INTO V_EMP.FIRST_NAME, V_EMP.PHONE_NUMBER, V_EMP.EMAIL
FROM EMPLOYEES;
DBMS_OUTPUT.PUT_LINE(V_EMP.FIRST_NAME || ' ,' || V_EMP.PHONE_NUMBER || ', ' || V_EMP.EMAIL);
END;
--==>> 에러 발생
-- (ORA-01422: exact fetch returns more than requested number of rows)
--> 여러 개의 행(ROWS) 정보를 얻어와 담으려고 하면
-- 단일 변수에 저장하는 것 자체가 불가능해진다.