identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expression]
identifier
: 변수명(식별자)CONSTNAT
: 상수로 지정, 초기값 반드시 할당 필요datatype
:자료형expression
: Literal, 다른 변수, 연산자나 함수를 포함하는 표현식변수 타입 명시적 작성
-- 변수 1개 선언
DECLARE NAME VARCHAR2(10);
DECLARE NAME VARCHAR2(10) := 'JM';
DECLARE NAME VARCHAR2(10) DEFAULT 'JM';
-- 변수 여러 개 선언
DECLARE
NAME VARCHAR2(20);
AGE NUMBER(3);
GENDER VARCHAR2(50) DEFAULT '여';
-- 변수 선언 후 사용
DECLARE NAME VARCHAR2(10) := 'JM';
BEGIN
DBMS_OUTPUT.PUT_LINE('JM' || NAME); -- 출력
END;
테이블/뷰의 컬럼 속성(데이터 타입)을 받아 오는 방식
변수명 테이블명%ROWTYPE
DECLARE
DATA EMPLOYEE%ROWTYPE;
BEGIN
SELECT * INTO DATA
FROM EMPLOYEE
WHERE EMPLOYEE_NO = 1234;
DBMS_OUTPUT.PUT_LINE(DATA.EMPLOYEE_NAME || ',' || DATA.DEPT_NO);
END;
변수명 테이블명.컬럼명%TYPE
DECLARE
V_EMPLOYEE_NAME EMPLOYEE.EMPLOYEE_NAME%TYPE;
V_DEPT_NO EMPLOYEE.DEPT_NO%TYPE;
BEGIN
SELECT EMPLOYEE_NAME, DEPT_NO INTO V_EMPLOYEE_NAME, V_DEPT_NO
FROM EMPLOYEE
WHERE EMPLOYEE_NO = 1234;
DBMS_OUTPUT.PUT_LINE(V_EMPLOYEE_NAME || ',' || V_DEPT_NO);
END;
:=
사용identifier := expression
- `INTO``절 필요
- 조회 결과 값을 저장할 변수 기술
- 1개의 행만 저장 가능
- SELECT문의 컬럼들은 INTO절의 변수와 1:1로 대응해야한다.
- 개수, 데이터 타입, 길이
SELECT select_list
INTO {variable_name1[, variable_name2, ..] | record_name}
FROM table_name
WHERE condition;
:
을 붙인다.VAR[IABLE]
사용VAR[IABLE] 변수명 [NUMBER | CHAR(n) | VARCHAR2(2)]
VARIABLE V_SALARY NUMBER; -- 선언
EXEC :V_SALARY := 10000; -- 할당
SELECT :V_SALARY AS COL1 FROM EMPLOYEE; -- COL1열에 10000이 입력된 결과가 출력된다.
&
를 붙인다.SET VERIFY OFF; -- 치환되기 전/후의 값을 보일 것인지 여부, DEFUALT=ON
ACCEPT 변수명 PROMPT '값을 등록하세요: ';
V_NAME VARCHAR2(20) := &P_NAME;
;
으로 개별 SQL문 종료DB에서 한 행의 데이터를 추출
값은 단일 집합만 리턴할 수 있다.
- 0개 혹은 2개 이상의 행이 리턴되면 에러 발생
- 표준 예외: NO_DATA_FOUND, TOO_MANY_ROWS
- 예외처리부에서 위 에러 처리 가능
INTO절을 사용(필수)해서 변수에 값을 할당한다.
SELECT절의 컬럼과 INTO절의 출력변수는 동일해야 한다.
- 개수, 위치, 데이터타입
예시
일반 SELECT문
SELECT select_list
INTO {variable_name[, variable_name, ..] record_name}
FROM table
WHERE condition;
TOO_MANY_ROWS 발생
DECLARE
V_SUM_SALARY EMPLOYEE.SALARY%TYPE;
V_DEPT_NO EMPLOYEE.DEPT_NO%TYPE;
BEGIN
SELECT DEPT_NO, SUM(SALARY)
INTO V_DEPT_NO, V_SUM_SALARY
FROM EMPLOYEE
GROUP BY DEPT_NO;
:SALARY := V_SUM_SALARY;
:DEPT := V_DEPT_NO;
END;
/
SUM
같은 그룹 함수는 PL/SQL 구문에서는 사용 못 한다. SQL에서만 가능%TYPE
, &ROWTYPE
으로 동적으로 데이터타입 지정 DECLARE
V_EMPLOYEE_NO EMPLOYEE.EMPLOYEE_NO%TYPE;
BEGIN
SELECT EMPLOYEE_NO_SEQUENCE.NETVAL
INITO V_EMPLOYEE_NO
FROM DUAL;
INSERT INTO EMPLOYEE(EMPLOYEE_NO, NAME, JOB, DEPT_NO)
VALUES(V_EMPLOYEE_NO, 'JM', 'ENGINEER', 5);
END;
/
DECLARE
V_SALARY_INCREASE EMPLOYEE.SALARY%TYPE := 2000;
BEGIN
UPDATE EMPLOYEE
SET SALARY = SALARY + V_SALARY_INCREASE
WHERE JOB = 'ENGINEER';
END;
/
DECLARE
V_DEPT_NO EMPLOYEE.DEMPT_NO%TYPE := 10;
BEGIN
DELETE FROM EMPLOYEE
WHERE DEPT_NO = V_DEPT_NO;
END;
/