2016년 9월 28일 수요일

[오라클학원,SQL학원,PLSQL학원추천◆탑크리에듀]#6. [PLSQL강좌]변수, 데이터 타입

[PLSQL강좌]변수, 데이터 타입

PL/SQL 변수, 데이터 타입


변수, 데이터타입


[형식]
변수이름 [Constant] 데이터타입 [NOT NULL] [:= | Default 수식]

n  Pl/SQL BEGIN ~ END 안에서 사용할 변수들은 DECLARE 섹션에서 정의하며 변수명은 오라클 오브젝트명과 동일한 네이밍룰을 따른다.
n  NOT NULL로 정의한 변수는 값이 반드시 값이 입력되야 하므로 기본값을 주거나 초기값을 할당해야 하는데 초기값은 할당 연산자(:=)를 사용하여 부여한다.

sal number(5) not null := 0;
sal number(5) not null default 0;

n  상수를 정의하기 위해서는 CONSTANT 키워드를 사용하고 반드시 초기값을 부여해야 한다.
v_max_sal CONSTANT NUMBER(9) := 999999999;


3.1.1 Scalar Data Type


한가지 타입의 값을 가지는 변수로써 Numeric, Character, Boolean, Datetime 계열이 있다.

[Numeric 계열]

PLS_INTEGER or BINARY_INTEGER
부호있는 4바이트 정수표시 -2,147,483,648 ~ 2,147,483,647, PLS_INTEGER가 저장공간을 적게 차지하고 BINARY_INTEGER보다 빠르다
NUMBER
고정/부동 소수점 숫자 표현

[Character 계열]

CHAR
32,767 바이트까지 표시하는 고정길이 문자열
VARCHAR2
32,767 바이트까지 표시하는 가변길이 문자열
LONG
32,767 바이트까지 표시하는 가변길이 문자열
LONG RAW
32,767 바이트까지 표시하는 가변길이 바이너리데이터, PL/SQL에서는 해석되지 않는다.
ROWID
물리적인 레코드를 나타내는 식별자

[Datetime 계열]

YEAR
-4712 to 9999 사이의 연도를 표시
MONTH
월
DAY
일
HOUR
시
MINUTE
분
SECOND
초
DATE
날짜 및 시각을 표시

[Boolean 계열]
BOOLEAN
논리값인 TRUE or FALSE를 표시


SQL> edit ojc5

-- CHAR TYPE의 비교예제
-- 작은쪽을 큰쪽과 같이 늘여 사이즈를 맞춘 후 비교
SET SERVEROUTPUT ON
DECLARE
      name1 CHAR(5)  := 'OJC';      -- 공백없음
      name2 CHAR(10) := 'OJC    ';  -- 뒤부분에 공백있음
    BEGIN
      IF name1 = name2 THEN
        DBMS_OUTPUT.PUT_LINE(name1 || ' = ' || name2);
      ELSE
        DBMS_OUTPUT.PUT_LINE(name2 || ' != ' || name1);
     END IF;
   END;
   /

SQL> @ojc5
OJC   = OJC

SQL> edit ojc6

/* VARCHAR2 TYPE의 비교예제
 비교대상 한쪽이라도 VARCHAR2라면 CHAR와 달리 공백을
 채우지 않고 비교(작은쪽을 늘이지않는다)
 그러므로 아래 두 값은 같지않다.
*/
SET SERVEROUTPUT ON
DECLARE
      name1 VARCHAR2(5)  := 'OJC';      -- 공백없음
      name2 VARCHAR2(5)  := 'OJC  ';    -- 뒤부분에 공백있음
    BEGIN
      IF name1 = name2 THEN
        DBMS_OUTPUT.PUT_LINE(name1 || ' = ' || name2);
      ELSE
        DBMS_OUTPUT.PUT_LINE(name2 || ' != ' || name1);
     END IF;
   END;
   /

SQL> @ojc6
OJC   != OJC


SQL> edit ojc7

/* VARCHAR2, CHAR TYPE의 비교예제
 비교대상 한쪽이라도 VARCHAR2라면 CHAR와 달리 공백을
 채우지 않고 비교(작은쪽을 늘이지않는다)
 그러므로 아래 두 값은 같지않다.
*/
SET SERVEROUTPUT ON
DECLARE
      name1 VARCHAR2(10)  := 'OJC';    -- 공백으로 채우지 않는다.
      name2 CHAR(10)      := 'OJC';    -- 나머지 7자리는 공백으로 채움
    BEGIN
      IF name1 = name2 THEN
        DBMS_OUTPUT.PUT_LINE(name1 || ' = ' || name2);
      ELSE
        DBMS_OUTPUT.PUT_LINE(name2 || ' != ' || name1);
     END IF;
   END;
   /

SQL> @ojc7
OJC        != OJC

[오라클학원,SQL학원,PLSQL학원추천◆탑크리에듀]#5. 함수 결과 캐싱(Function Result Caching)

#5. 함수 결과 캐싱(Function Result Caching) 

 오라클11g의 함수결과 캐싱(Function Result Caching)은 함수의 결과를 캐싱하는 기능으로 캐싱기능을 이용하여 함수를 호출하면 오라클은 같은 파라미터 입력 값으로 이미 실행되었는지 검사하고, 실행된적이 있다면 함수 BODY를 실행하지 않고 캐시 영역에서 결과치를 리턴한다. 만약 처음 실행한다면 함수를 실행하고 결과를 캐시에 저장한다. 

 만약 원본 데이터에 변경이 생기면 오라클 서버는 캐시를 없애고 함수의 요청이 있다면 다시 실행하고 캐시에 저장한다. 

SQL> select count(*) from myemp1; 

  COUNT(*) 
---------- 
  10000000 

SQL> CREATE OR REPLACE  FUNCTION get_sal 
 (p_deptno  IN  NUMBER) 
RETURN  NUMBER 
IS 
v_sal  NUMBER; 
BEGIN   
SELECT  sum(sal) 
INTO      v_sal 
FROM    myemp1 
WHERE deptno  =  p_deptno; 
RETURN v_sal; 
END get_sal ; 
/ 

함수가 생성되었습니다. 

SQL> set timing on 
SQL> select get_sal(0) from dual; 

GET_SAL(0) 
---------- 
1.0000E+12 

경  과: 00:00:10.68 

SQL> select get_sal(0) from dual; 

GET_SAL(0) 
---------- 
1.0000E+12 

경  과: 00:00:07.81 

이번에는 함수 결과를 캐싱 해보자. 

SQL> CREATE OR REPLACE  FUNCTION get_sal2 
 (p_deptno  IN  NUMBER) 
RETURN  NUMBER 
RESULT_CACHE RELIES_ON (myemp1) 
IS 
v_sal  NUMBER; 
BEGIN   
SELECT  sum(sal) 
INTO      v_sal 
FROM    myemp1 
WHERE deptno  =  p_deptno; 
RETURN v_sal; 
END get_sal2 ; 
/ 

SQL> select get_sal2(0) from dual; 

GET_SAL2(0) 
----------- 
 1.0000E+12 

경  과: 00:00:08.32 

-- 아래는 캐시에서 결과를 가져온다. 
SQL> select get_sal2(0) from dual; 

GET_SAL2(0) 
----------- 
 1.0000E+12 

경  과: 00:00:00.01 

-- 이번에는 원본데이터에 변화를 줘보자. 
SQL> insert into myemp1 (empno, ename, sal, deptno) values (11111111,'11111111길동',1000000, 0); 

SQL> commit; 

-- 원본데이터가 변경되었으므로 함수를 다시 실행하고 결과를 캐시에 보관한다. 
SQL> select get_sal2(0) from dual; 

GET_SAL2(0) 
----------- 
 5.8000E+12 

경  과: 00:00:14.09 

-- 다시 실행하니 캐시에서 가져와 빠르다. 
SQL> select get_sal2(0) from dual; 

GET_SAL2(0) 
----------- 
 5.8000E+12 

경  과: 00:00:00.17

[오라클학원,SQL학원,PLSQL학원추천◆탑크리에듀]#4. PLSQL 프로시저(Procedure)

#4. PLSQL 프로시저(Procedure) 

프러시저(Procedure) 

 자신을 호출한 곳으로 리턴 해주는 값은 없고 호출되어 실행만 된다. 
 실행환경과 Stored Program 사이에 값을 전달하기 위해 파라미터를 사용한다. 
 파라미터 종류 
IN : 호출하는 곳에서 함수 or 프로시저로 값을 전달 
OUT : 함수 or 프로시저에서 호출한 곳으로 값을 전달 
IN OUT : 호출하는 곳에서 함수 or 프로시저로 값을 전달하고 동시에 함수 or 프로시저에서 호출한 곳으로 값을 전달하는 변수. 
 프러시저 Header의 끝에는 IS[AS]가 와야하고 Is와 Begin사이에 Begin ~ End에서 사용할 변수를 선언한다. 

[형식] 
CREATE [OR REPLACE] PROCEDURE procedure_name [parameters] 
IS[/AS]  
Declaration_section  
BEGIN  
Execution_section 
EXCEPTION  
exception section  
END; 
/ 

SQL> edit ojc3 

CREATE OR REPLACE  PROCEDURE ojc3 
          (p_empno  IN  NUMBER,  p_new_sal  IN  NUMBER) 
IS 
BEGIN   
            UPDATE  emp 
            SET    sal    =  p_new_sal 
            WHERE  empno  =  p_empno; 
            COMMIT; 
END ojc3 ; 
/ 

SQL> @ojc3 

프로시저가 생성되었습니다. 

SQL> select empno, ename, sal from emp where empno = 7369; 

    EMPNO  ENAME      SAL 
---------- ----------  ---------- 
      7369  SMITH          800 


SQL> exec ojc3(7369, 4500) 

PL/SQL 처리가 정상적으로 완료되었습니다. 

SQL> select empno, ename, sal from emp where empno = 7369; 

    EMPNO  ENAME      SAL 
---------- ----------  ---------- 
      7369  SMITH        4500 


[Procedure에서 OUT 변수 사용 예제] 

SQL> edit ojc4 

CREATE OR REPLACE PROCEDURE ojc4(p_empno IN NUMBER, p_sal OUT NUMBER) 
    IS 
    BEGIN 
      SELECT sal INTO p_sal FROM emp 
      WHERE empno = p_empno; 
    END ojc4; 
    / 

SQL> @ojc4 

프로시저가 생성되었습니다. 

SQL> variable sal number 
SQL> exec ojc4(7369, :sal) 

PL/SQL 처리가 정상적으로 완료되었습니다. 

SQL> print sal 

      SAL 
---------- 
      4500