[ORACLE] PL/SQL변수 - SCALAR DATA TYPE

privatekim·2024년 7월 13일
0

ORACLE

목록 보기
32/38

SCALAR DATA TYPE

이 데이터 타입은 단일 값을 가지는 변수를 의미하며 하나의 변수 안에서 여러개의 값이 존재할 수 없음을 의미한다.

그 종류로는 변수, 상수, 바인드 변수가 있다.

변수

변수의 일반적인 정의는 다음과 같다.

데이터를 임시로 저장하는 메모리 영역

이 정의는 PL/SQL에서도 동일하게 작용된다.

변수 규칙

  1. 변수를 선언할 때는 문자로 시작해야한다.
  2. 문자, 숫자, 특수문자 ( _, #, $) 사용가능.
  3. 변수명의 길이는 1~30까지 이다.
  4. 예약어는 사용할 수 없다.
  5. 변수 선언시 NOT NULL, CONSTANT(상수)로 지정된 변수에 대해서는 반드시 초기값을 할당해야 한다.
  6. 변수 또는 상수는 하나의 행에 하나씩만 선언해야 한다.
  7. 변수 값 할당시 := 또는 DEFAULT키워드를 사용해야 한다.

변수 문법

DECLARE
	v_name varchar(20);
    v_name := '홍길동';
BEGIN
	dbms_output.put_line('my name is '|| v_name ); -- 홍길동
    v_name := '차은우';
    dbms_output.put_line('my name is '|| v_name ); -- 차은우
END;
/

변수의 초기값을 지정하지 않으면 null값으로 초기화 된다.

상수

일반적인 변수와 달리 고정적인 값을 가지고 있는 변수

한 번 선언된 상수에 대해서 다른 값으로 변경하려고 하면 오류를 발생시킨다.

상수 문법

CONSTANT키워드를 통해 해당 변수가 상수임을 알려줘야 하고, 선언시 같은 라인에서 반드시 초기값을 지정해야 한다. 한번 지정한 초기값에 대해서는 변경할 수 없다.

DECLARE
	PI CONSTANT NUMBER := 3.14; -- 반드시 초기값 지정
    NOW_DATE CONSTANT DATE DEFUALT sysdate; -- 반드시 초기값 지정
    r number;
BEGIN
	r := 3;
	DBMS_OUTPUT.PUT_LINE(NOW_DATE);
    DBMS_OUTPUT.PUT_LINE(2*r*r*PI);
END;
/

바인드 변수

호스트 환경 즉, 익명블록구조 바깥에서 선언된 변수로 전역변수의 역할을 할 수 있는 변수이다.

단, 바인드 변수는 반드시 익명블록구조에서만 사용할 수 있다.

또한 세션이 종료될 때 까지 바인드 변수의 메모리는 사라지지 않는다.

바인드 변수 문법

바인드 변수를 선언할 시 익명블록구조 밖에서 var 또는 VARIOUS 키워드를 이용해 선언해줘야 하며 EXECUTE또는 EXEC키워드를 통해 익명블록구조 밖에서 초기값을 지정할 수 있다.

또한 바인드 변수를 이용할 경우 :을 변수명 앞에 사용하여 해당 변수가 바인드 변수임을 알려줘야 한다.

var r number
exec :r := 3
DECLARE
	PI CONSTANT NUMBER := 3.14; -- 반드시 초기값 지정
    
BEGIN
    DBMS_OUTPUT.PUT_LINE(2*r*r*PI);
	:r := 4;
    DBMS_OUTPUT.PUT_LINE(2*r*r*PI);
END;
/

바인드 변수와 SQL활용

바인드 변수는 호스트 환경에서 선언되었기 때문에 SQL문에서도 가져와 사용할 수 있다.

var b_id number;
exec :b_id := 100;

SELECT *
FROM hr.employees
WHERE employee_id = b_id;

이렇게 사용할 경우 변수가 포함된 SQL문의 실행계획이 생성된다.
이 경우 변수에 할당된 값만 변경하면 해당 실행계획을 공유하며 서로다른 값을 조회할 수 있다.

즉 실행계획을 공유함으로서 shared_pool의 메모리 공간을 절약할 수 있다.

주의 점

실행 계획을 공유하는 것이 반드시 좋은것은 아니다.

employee_id와 같이 pk와 uk의 변수에 대해서는 단 하나의 return값이 존재하기 때문에 실행계획을 공유해도 되지만, department_id의 경우는 다르다.

department_id의 경우 결과 값이 1개인 경우, 2개인 경우, 여러개인 경우 즉 값에 따라 결과 값의 분포가 다르기 때문에 새로운 실행계획을 생성해야 하는 경우가 생간다.
이 같은 경우에선 변수를 통한 soft-parsing보다 각 상수를 통해 hard-parsing하는 것이 더욱 효율적이다.

0개의 댓글