본문 바로가기
인천일보아카데미/- 학습일지

[학습일지]JAVA교육일지 53일차

by w1z 2022. 6. 24.

1. 참조 자료형

2. 제어문(조건문)


1. 참조 자료형

[ 정의 ] 

- 테이블로부터 직접 자료형을 알아내는 방법

- 생산성 + 유지보수성

- 종류: %TYPE(단일), %ROWTYPE(전체)

 

[ %TYPE ]

- 사용하는 테이블의 특정 컬럼 자료형을 그대로 참조해서 변수에 적용시킨다.

- 컬럼 참조

  1) 자료형

  2) 길이

  3) NOT NULL

- 예제

--예제1
DECLARE
    VNAME VARCHAR2(20);
    VSSN TBLINSA.SSN%TYPE;
    VSUDANG TBLINSA.SUDANG%TYPE;
BEGIN
    SELECT NAME, SSN, SUDANG INTO VNAME, VSSN, VSUDANG FROM TBLINSA
        WHERE NAME = '홍길동';
    DBMS_OUTPUT.PUT_LINE(VNAME);
    DBMS_OUTPUT.PUT_LINE(VSSN);
    DBMS_OUTPUT.PUT_LINE(VSUDANG);
END;

--> 변수 VNAME은 TBLINSA테이블의 NAME컬럼 자료형에 맞게 VARCHAR2로 지정
--> 변수 VSSN은 TBLINSA테이블의 SSN컬럼 자료형에 맞는 %TYPE으로 지정
--> 변수 VSUDANG은 TBLINSA테이블의 SUDANG컬럼 자료형에 맞는 %TYPE으로 지정


--예제2
DECLARE
    VNAME TBLINSA.NAME%TYPE;
    VGENDER VARCHAR2(1);
BEGIN
    SELECT SUBSTR(SSN, 8, 1) INTO VGENDER FROM TBLINSA
        WHERE NAME = '홍길동';
    
    DBMS_OUTPUT.PUT_LINE(VGENDER)
END;

--> 변수 VGENDER는 TBLINSA테이블에 없는 컬럼을 직접 만드는것도 가능하다.
--> 변수 VGENDER를 통해 성별을 출력할 수 있다.

 

[ %ROWTYPE ]

- 행 참조(컬럼 전체)

- %TYPE의 집합

- 예제

DECLARE
    VROW TBLINSA%ROWTYPE; -- 테이블의 모든 컬럼의 집합 참조, 레코드 참조
BEGIN
    SELECT * INTO VROW FROM TBLINSA WHERE NAME = '홍길동';

    DBMS_OUTPUT.PUT_LINE(VROW.NAME);
    DBMS_OUTPUT.PUT_LINE(VROW.BUSEO);
    DBMS_OUTPUT.PUT_LINE(VROW.CITY);
END;

--> 변수 VROW는 TBLINSA 테이블의 모든 컬럼의 자료형을 전부 참조해서 지정
--> %ROWTYPE이 무조건 좋은건 아니다. 
--> 필요없는 컬럼까지 전부 복사하기 때문...

2. 제어문(조건문)

[ IF ]

1. IF
DECLARE
    VNUM NUMBER := 10;
BEGIN
    IF VNUM > 0 THEN
        DBMS.OUTPUT.PUT_LINE('양수');
    END IF;
END;

2. ELSE
DECLARE
    VNUM NUMBER := -10;
BEGIN
    IF VNUM > 0 THEN
        DBMS.OUTPUT.PUT_LINE('양수');
    ELSE 
        DBMS.OUTPUT.PUT_LINE('음수');
    END IF;
END;

3. ELSIF -----> 주의할것 자바의 ELSE IF 와 동일한 기능이지만, SQL에서는 ELSIF로 표기한다!!
DECLARE
    VNUM NUMBER := 0;
BEGIN
    IF VNUM > 0 THEN
        DBMS.OUTPUT.PUT_LINE('양수');
    ELSIF VNUM < 0 THEN
        DBMS.OUTPUT.PUT_LINE('음수');
    ELSE 
        DBMS.OUTPUT.PUT_LINE('0');
    END IF;
END;

 

[ CASE ]

- ANSI-SQL(CASE문)과는 다른 구문이다.

  1) ANSI-SQL의 CASE: 표현식 정도의 수준만 사용한다.

  2) PL/SQL의 CASE: 문장 단위 실행도 가능하다.

DECLARE
    VNAME TBLCOUNTRY.NAME%TYPE;
    VCONTINENT TBLCOUNTRY.CONTINENT%TYPE;
    VRESULT VARCHAR2(30);
BEGIN
    SELECT NAME, CONTINENT INTO VNAME, VCONTINENT FROM TBLCOUNTRY
        WHERE NAME = '대한민국';
    
    --방법1 IF문 이용
    IF VCONTINENT = 'AS' THEN
        VRESULT := '아시아';
    ELSIF VCONTINENT = 'EU' THEN
        VRESULT := '유럽';
    ELSIF VCONTINENT = 'AF' THEN
        VRESULT := '아프리카';
    ELSE
        VRESULT := '기타';
    END IF;
    
    DBMS_OUTPUT.PUT_LINE(VNAME || '-' || VRESULT);

    -- 방법2 CASE문 이용
    CASE VCONTINENT
        WHEN 'AS' THEN VRESULT := '아시아';
        WHEN 'EU' THEN VRESULT := '유럽';
        WHEN 'AF' THEN VRESULT := '아프리카';
        ELSE VRESULT := '기타';
    END CASE;
    
    DBMS_OUTPUT.PUT_LINE(VNAME || '-' || VRESULT);
END;


----> TBLCOUNTRY테이블의 NAME컬럼중 '대한민국'의 CONTINENT컬럼 내용에 따라 값이 출력된다.
----> 출력: 대한민국 - 아시아

MEMO>

# PL/SQL에서의 대입연산자(=)은 세미콜론(:)을 앞에 붙여야한다. ex) TEST := 10;

 

# 테이블에 속한 컬럼의 자료형 확인하는법

--->원하는 테이블 드래그 > SHITF + F4 > 해당 테이블에 속한 자료형을 보여준다.

 

# PL/SQL 쿼리짜는것이 아직 어려우면, BEGIN-END 구문안에 ANSI-SQL 먼저 작성한다.

 

# 데이터베이스 프로젝트를 현재 하고 있는데, 오늘 알게 된 사실은, DB에서 가장 중요한건 테이블의 갯수가 많은 것이 아닌,  각 테이블 마다 컬럼의 종류가 여러가지가 있고(볼륨 업), 그 하나하나 컬럼의 기능을 세밀화 및 디테일하게 작업 하는것이 중요하다는 것을 깨달았다.