변수와 상수, 리터럴

    변수

    변수는 PL/SQL 블록의 선언부(DECLARE와 BEGIN 사이의 구역)에서 선언한다

    변수명 데이터타입  [ NOT NULL ]  [ := 초기값 ] ;

    식별자 명명 규칙에 의하여 변수명은 대소문자를 구별하지 않는다.

    DECLARE
        v_num NUMBER;
        V_NUM NUMBER;	-- 대소문자를 구별하지 않으므로 위의 v_num와 중복되는 선언(오류)
    BEGIN
        v_num := 10;
        V_NUM := 20;
        DBMS_OUTPUT.PUT_LINE(v_num);
    END;

    위 코드에서 발생하는 오류를 피하려면 변수명에 큰따옴표를 사용하면 된다.

    DECLARE
        "v_num" NUMBER;
        "V_NUM" NUMBER;	-- 대소문자를 구별하므로 위의 "v_num"과는 다른 선언이다
    BEGIN
        "v_num" := 10;
        "V_NUM" := 20;
        DBMS_OUTPUT.PUT_LINE(v_num);
    END;

    변수는 선언과 동시에 초깃값을 지정할 수 있다. 이 때 할당 연산자 :=를 사용한다.

    이 때 =과  :=를 혼동하는데 =는 논리 비교에 사용되는 연산자로 :=와는 호환되지 않는 완전히 다른 연산자이다.

     

    상수

    상수(Constant)는 선언과 동시에 값이 정의되며, 그 후로는 값을 변경할 수 없는 저장소다.

    상수명 CONSTANT 데이터타입 := 초기값 ;
    DECLARE
        c_pi CONSTANT NUMBER := 3.14;   -- 상수 선언
    BEGIN
        c_pi := 3.1415996;      -- 상수 변경하면 오류 발생
    END;

     

    리터럴

    DECLARE
        v_sum NUMBER := 0;
    BEGIN
        FOR i IN 1..10
        LOOP
            v_sum := v_sum + i;
        END LOOP;
        DBMS_OUTPUT.PUT.LINE('(1..10) = ' || v_sum);
    END;

    위 코드에서 리터럴은 2번 줄의 0, 4번 줄의 1과 10, 8번 줄의 문자열 '(1..10) = '이다

     

    -리터럴 유형

    분류 설명
    문자형 작은 따옴표 사이에 위치하는 리터럴로 문자열을 의미
    수치형 자연수, 정수, 부동 소수 등의 문자형 리터럴
    따옴표를 사용하지 않는 표현형으로 사용
    날짜형 날짜, 시각, INTERVAL 등의 값
    BOOLEAN형 TRUE, FALSE

    데이터 타입과 상관없이 공통적으로 쓰이는 리터럴로 NULL이 있다.

    NULL을 사용할 때 주의할 점은 리터럴 NULL도 데이터 타입이 있다는 것이다.

    NULL이라고 하더라도 문자형 리터럴 NULL, 수치형 리터럴 NULL, 날짜형 리터럴 NULL, BOOLEAN형 리터럴 NULL은 서로 다르다.

     

    문자형 리터럴

    작은따옴표로 문자열을 감싼 '문자열'과 같은 형태로 사용되는데, 표현식, 조건문, 함수,  SQL문 등에서 사용된다.

    큰따옴표로 둘러싸인 문자열은 리터럴이 아니라 식별자이다.

     

    -특징

    • 대소문자를 구별한다,
    • 공백 문자도 중요한 의미를 가진다.
    • 문자형 리터럴 '0' ~ '9'와 수치형 리터럴 0 ~ 9는 서로 다르다.
    • 길이가 0인 문자열 리터럴('')은 NULL로 취급된다. 이 규칙은 오라클에서 적용되는 규칙이며, 다른 대부분의 DBMS에서는 길이가 0인 문자열과 NULL은 다른 값으로 취급한다.

    문자열 리터럴에는 작은 따옴표를 사용하는 형태와 접두사 Q를 사용하는 형태 두가지가 있다.

    예로 다음 SQL문장을 VARCHAR2 변수에 저장하는 경우를 생각해보자.

    SELECT EMPNO, ENAME
    FROM EMP
    WHERE ENAME IN ('SMITH', 'ALLEN', 'WARD', 'JONES', 'MARTIN');
    
    -- 접두어 Q를 사용하지 않는 문자열 리터럴
    DECLARE
    	v_SQL	VARCHAR2(1000);
    BEGIN
    	v_SQL := 'SELECT EMPNO, ENAME
    				FROM EMP
    				WHERE ENAME IN (''SMITH'', ''ALLEN'', ''WARD'', ''JONES'', ''MARTIN'')';
       DBMS_OUTPUT_PUT_LINE(v_SQL);
    END;
    
    
    -- 접두어 Q를 사용한 문자열 리터럴
    DECLARE
    	v_SQL	VARCHAR2(1000);
    BEGIN
    	v_SQL := Q'[SELECT EMPNO, ENAME
    				FROM EMP
    				WHERE ENAME IN ('SMITH', 'ALLEN', 'WARD', 'JONES', 'MARTIN')]';
       DBMS_OUTPUT_PUT_LINE(v_SQL);
    END;

    - 두 번째 방법에 사용된 문자 리터럴의 형식

    Q + ' + 시작구분자 + 원본문자열 + 끝구분자 + '

    시작구분자와 끝구분자는 한 글자이기만 하면 어떤 글자라도 사용할 수 있다.

    시작구분자로 [, {, <, (를 사용하면 끝 구분자는 각각 ], }, >, )여야 한다.

     

    수치형 리터럴

    - 수치형 리터럴 유형 비교

    비교 항목 십진수형 FLOAT형 DOUBLE형
    표현 방식 숫자(정수형, 소수형, 지수형 등) 숫자 + F 숫자 + D
    내부 형식 가변 길이 십진수 4바이트 IEEE 754 표준 형식 8바이트 IEEE 754 표준 형식
    저장 데이터 타입 NUMBER BINARY_FLOAT BINARY_DOUBLE
    리터럴 예 1, +2, -3. 3.14
    6.0221409e+23
    1F, +2F, -3F, 3.14F
    6.0221409e+23F
    1D, +2D -3D, 3.14D
    6.0221409e+23D

     

    날짜형 리터럴

    오라클에서 날짜형 리터럴은 전통적인 형식과 ANSI SQL 표준방식 두가지로 사용된다.

    전통적인 형식은 엄밀히 말하면 날짜형 리터럴이 아니고 오라클의 형 변환 함수인 TO_DATE 함수를 사용해 문자형 리터럴을 날짜 값으로 변환하는 방식이다. ANSI 형식은 진정한 날짜형 리터럴이다.

     

    리터럴 유형 전통적 형식 ANSI 형식
    날짜 TO_DATE('2020-01-01', 'YYYY-MM-DD') DATE'2020-01-01'
    일시 TO_DATE('2020-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS') TIMESTAMP'2020-01-01 12:00:00'
    TIMESTAMP TO_TIMESTAMP('2020-01-01 12:00:00.123', 'YYYY-MM-DD HH24:MI:SS.FF') TIMESTAMP'2020-01-01 12:00:00.123'
    TIMESTAMP WITH TIME ZONE TO_TIMESTAMP_TZ('2020-01-01 12:00:00 +02:00', 'YYYY-MM-DD HH24:MI:SS  TZH:TZM') TIMESTAMP'2020-01-01 12:00:00 +02:00'
    INTERVAL YEAR TO MONTH INTERVAL '123-4' YEAR TO MONTH -- 123년 4개월
    INTERVAL '123' YEAR      -- 123년
    INTERVAL '50' MONTH   -- 50개월(4년 2개월)
    ※YEAR는 기본값이 두자리이므로 세자리 이상 시에 오류를 방지하려면 변수 선언에서 'v_intervalYM INTERVAL YEAR(3) TO MONTH'와 같이 길이를 반드시 명시해야 한다.

    ※PL/SQL에서의 리터럴과 SQL문에서의 리터럴 사용에 약간의 차이가 있다.
    INTERVAL DAY TO SECOND INTERVAL '4 5:12:10.222' DAY TO SECOND(3)

    TIMESTAMP WITH TIME ZONE과 두 개의 INTERVAL 형식은 무수히 많은 변형이 가능하다.

    상세한 건 오라클 매뉴얼을 참고하라.

    'DATABASE > SQL, PL-SQL' 카테고리의 다른 글

    표현식 - 2  (0) 2021.01.24
    표현식 - 1  (0) 2021.01.24
    앵커(%)를 사용한 데이터 타입 지정  (0) 2021.01.19
    데이터 타입 상세 소개 - 2  (0) 2021.01.19
    데이터 타입 상세 소개 - 1  (0) 2021.01.19

    댓글