5주차

김예지·2022년 7월 22일
0

1일차

default : 값이 입력이 되지 않았을 때 기본값으로 입력될 값을 지정 (NOT NULL(NOT NULL은 제약조건 가장 마지막에 기재한다 ) 앞에 기재) NOT NULL 가능

select salary * 12 as 연봉 from employ;

select name, job, DEPTID from employ where job = '세일즈';

select from employ where hiredate = '01/12/03';
=> 사원 =

select name, job, hiredate, DEPTID from employ where deptid = 200;

select name, salary from employ where salary >=3000 and salary <=5000;
=> SELECT NAME, SALARY FROM EMPLOY WHERE SALARY BETWEEN 3000 AND 5000

select empid, mgrid, name, deptid from employ where MGRID in (6311,6361,6351);

select * from employ where job in('사무직', '경리');

select * from employ where salary >=3000 and job = '부장';

select * from employ where NOT JOB IN('세일즈', '사무직');

select from employ where 2500 < salary or salary < 1500;
=>select
from employ where NOT salary BETWEEN 1500 AND 2500;
select * from employ where (job = '경리' or job = '부장') and salary >3000;

select * from employ where TO_CHAR(hiredate, 'yyyy') > '2000';

select NAME from employ where name like'%철%';
//이름에 '철' 이라는 문자를 포함하는 경우의 사원을 검색하시오

select from employ where bonus is null;
보너스가 NULL이 아닌 사원을 검색하시오 (is NOT NULL)
=>select
from employ where bonus is NOT NULL;

select from employ where hiredate BETWEEN '99/01/01' and '99/12/31';
=>select
from employ where TO_CHAR(hiredate, 'YYYY') = '1999';

update employ
set salary = salary * 0.1
where salary >=3000;

delete from employ
where TO_CHAR(hiredate,'yyyy') > '2001';

DCL (Data Control Language: 데이터 제어어)
GRANT 권한부여 (계정관련, 시스템 관련)
REVOKE 권한회수 (계정관련, 시스템 관련)
=> CONNECT; 접근관련 권한 DB에 접근하거나 USTR접근
=> RESOURCE; 테이블 뷰 생성 공간사용, 권한
=> DBA; 데이터 베이스 관계자 권한

계정생성/수정/삭제 형식
생성 : CREATE USER 계정명 IDENTIFIED BY 비밀번호;
비밀번호 수정 : ALTER USER 계정명 IDENTIFIED BY 변경 할 비밀번호;
삭제 : DROP USER 계정명CASCADE; (삭제하기전 접속해제가 꼭 되어있어야 한다)

계정별 권한 부여/회수
GRANT 부여 할 권한1,부여 할 권한1, ... TO 계정명;
REVOKE 부여한 권한1, 부여한 권한2, ... FROM 계정명;
RESOURCE , CONNET 자기 계정안에서만 가능한 권한
=> 접근할 계정이 DBA권한이 부여가 되어 있다면, 그 계정에서 해당 테이블에 대해 권한을 부여해주어야 한다

  • 권한부여 형식 (특정계정에 특정 권한만 부여)
    1) GRANT DELECN ON 테이블명 TO 계정명;
    예) GRANT SELECT ON ACLASS TO SCOTT; (TEST계정에서 입력)
    2) GRANT SELECT ANY TABLE TO 계정명;
    => 모든 테이블 가능
    테이블 하나당 권한 모두 부여
    GRANT ALL ON 테이블명 TO 계정명; (ALL ANY는 같이 사용 불가능)
    권한회수
    REVOKE 부여한 권한1, 부여한 권한2, ... ON 테이블명 FROM 계정명;

  • 롤(역할) 생성
    CREATE ROLE 롤이름;
    롤 권한 부여
    GRANT 부여할 권한, 부여할 권한2, .. TO 롤이름;
    REVOKE 부여한 권한, 부여한 권한2, .. FROM 롤이름;
    삭제
    DROP ROLE 롤이름;

RESOURCE : 테이블 생성 테이블 공간을 만들어준다

스키마(SCHEMA) : 계정의 구조

시퀀스 : 값을 자동으로 증감 시키는 자동 생성기 역할 (PIRAMY KEY에 자주 사용)
=> 테이블에 종속적이지 않다
CREATE SEQUENCE 시퀀스명 [START WITH 시작할 값] 1 [INCREMENT BY 증감할 값] +1
[MAXVALUE 최대증가할 값 | NOMAXVALUE] 9999 [MINVALUE 최소값 | NOMINVALUE] 1
[CYCLE | NOCYCLE] 최대값까지 증발시 에러 [CACHE | NOCACHE]; NOCACHE디폴트 20바이트
수정 : ALTER 뒤는 똑같음 (시작값은 수정 할 수 없음)
제거 : DROP SEQUENCE 시퀀스명;

시퀀스 사용 방법

  • NEXTVAL : 다음 시퀀스값을 가져오다
    => 시퀀스명.NEXTVAL (INSERT문 PRIMARY KEY 값 자리에 많이 사용) EX) SELECT 시퀀스명.NEXTVAL FROM DUAL;
    호출시 무조건 1씩 증가 여러군데에 사용시 값이 전에 사용한 값으로시작됨
  • CURRVAL : 현재 시퀀스값을 가져오기
    => 시퀀스명.CURRVAL

시퀀스 명명 규칙
[테이블명]_컬럼명_SEQ

2일차

슈도(pseudo)컬럼 : NEXTVAL, CURRVAL
-NEXTVAL, CURRVAL 사용가능
-서브쿼리가 아닌 SELECT문
-INSERT문
SELECT 절 (값 1단위로 들어오면 안되고 서브쿼리의 SELECT절 단위로 들어와야 함)
VALUES 절 (값 1단위로 들어올 떄에는 시퀀스명.NEXTVAL로)
-UPDATE문 SET절 (값 2단위로 들어올 대에는 시퀀스명.NEXTVAL로)

사용 불가능
-VIEW의 SELECT절
-DISTINCT, GROUP BY, HAVING, ORDER BY절이 있는 SELECT문
-WHERE 조건절
-INSERT문의 VALUES절에 값 1개 단위로 서브쿼리문으로 존재할 때
예) INSERT INTO DEPT01 (DEPTNO, DNAME, LOC, DNO) VALUES
(10,'A','A',(SELECT SEQ_NO.nextval FROM DEPT D));

인덱스(INDEX) 형식
인덱스는 컬럼추가/변경/삭제 작어이 안된다. 인덱스이름만 변경가능함
CREATE INDEX 인덱스명 ON 테이블명(컬럼명1, 컬럼명2)

  • 인덱스를 해야하는 조건
    -테이블의 행 수가 많을 때
    -검색해서 나오는 결과가 2~15%미만인 경우 지정
    -검색조건에 많이 사용되는 컬럼으로 지정한다
    -기본키: PRIMARY KEY, UNIQUE 로 생성된 컬럼은 자동으로 인덱스가 생생된다
    -수정이나 삭제/ 변경작업이 거의 없는 컬럼으로 지정한다

수정(이름변경)
ALTER INDEX 인덱스명 RENAME TO 변경할이름;
삭제/제거
DROP INDEX 인덱스명;

리빌드 : 인덱스가 깨졌거나, 속도가 저하되거나 할 때 재설정처리하는 방법
ALTER INDEX 인덱스명 REBUILD;

SELECT D.* FROM DEPT D(DEPT 축약);

시노님(SYNONYM : 동의어 - 테이블 객체에 대한 다른 객체명 부여)
-DBA권한이 부여된 계정만 생성 가능
-비공개동의어(PRIVATE SYNONYM) , 공개 동의어(PUBLIC SYSNONYM)이 있다
비공개동의어(PRIVATE SYNONYM) : 만든 계정에서만 접근 가능하며, 다른 계정은 권한을 부여 받아야 접근할 수 있다
생성혁식 :
CREATE OR REPLACE [PRIVATE - 디폴트값(생략가능) | PUBLEC]SYSNONYM [스키마명.] 시노님명 FOR [스키마명.]원본객체명;

예) CREATE OR REPLACE PUBLIC SYNONYM EMP_SN FOR EMP;

-객체명에는 테이블명, 뷰명, 프로시저명, 함수명, 패키지명, 시퀀스명 등이 올 수 있다
-시노님은 별도의 수정구문이 없으므로 삭제 후 재생성을 해야한다
PUBLIC 권한 부여시 예)
GRANT SELECT ON DEPT01_SN TO PUBLIC;
시노님 조회
예)SELECT * FROM 시노님명 WHERE TABLE_OWNER = 해당계정명;
PUBLIC가 붙었을 경우 삭제 할 때
=> DROP SYNONYM 시노님명;

연산자 조인
형식 : SELECT | 컬럼들 FROM 테이블명1 별칭, 테이블명2 별칭; <= 카타시안 조인
SELECT
| 컬럼들 FROM 테이블1 [별칭] CROSS JOIN 테이블2 [별칭]; <= ANSI 조인 : CROSE JOIN (둘 다 조건이 아무것도 없이 테이블 두 개 이상을 연결해 놓는 조인)

  • 테이블 행/열로 이루어짐
    총 행의 갯수 : 테이블1의 총 행수 * 테이블 총2 개수 (카리널리티)
    총 열의 갯수 : 테이블1의 통 열 갯수 + 테이블2의 총 열의 갯수 (차수 DEGREE)
    테이블 = 릴레이션
    사용시 중복컬럼이 있다면 테이블.컬럼(OR 테이블 별칭.컬럼) 식으로 사용

동등조인(CQUI JOIN)
형식 : SELECT * | FROM 테이블명 [별칭], 테이블명2 [별칭] WHERE 테이블의 별칭이나 테이블명1.컬럼명 = 테이블2의 별칭이나 테이블명.컬럼명; (연결된 테이블의 전체 개수-1)
-NULL값은 동일 값으로 처리를 하지 않는다

ANSI 조인 형식
(INNER JOIN)
형식 : SELECT * | 컬럼들 FROM 테이블면1 [별칭][INNER] JOIN 테이블명1 [별칭] ON 테이블명1의 별칭이나 테이블명1.컬럼명 = 테이블명2의 별칭이나 테이블2명.컬럼명
ON WHERE 테이블의 별칭이나 테이블명1.컬럼명 = 테이블2의 별칭이나 테이블명.컬럼명;
-조인한 테이블의 두 조건을 충족하는 조건절을 기술 WHERE 기타조건들;
동등조인(CQUI JOIN) ANSI 조인은 두 테이블의 조건만 추출하는 조인방식 (교집합)
컬럼명이 동일할 시 USING (컬럼명) 예) USING (DEPTNO) / (해당컬럼만 검색은 불가능)

별칭을 줄 때 SELECT절의 순서를 잘 기억해야 한다

연산자 외부조인 형식 (왼쪽기준)
SELECT * | 컬럼 FROM 테이블1 [별칭], 테이블2 [별칭] WHERE 테이블1별칭.컬럼명 = 테이블2별칭.컬럼명(+);
한 쪽에만 (+)를 붙일 수 있다

외부조인(LEFT OUTER JOIN)
SELECT * | 컬럼명 FROM 테이블1 [별칭] LEFT [OUTER] JOIN 테이블2 [별칭] ON 별칭1.컬럼명 = 별칭2.컬럼명;

외부조인(RIGHT OUTER JOIN)
SELECT * | 컬럼명 FROM 테이블1 [별칭] RIGHT [OUTER] JOIN 테이블2 [별칭] ON 별칭1.컬럼명 = 별칭2.컬럼명;

외부조인(FULL OUTER JOIN)
SELECT * | 컬럼명 FROM 테이블1 [별칭] FULL [OUTER] JOIN 테이블2 [별칭] ON 별칭1.컬럼명 = 별칭2.컬럼명;

3일차

세미조인 => 서브쿼리에 의해서 데이터가 정해지는 조인
EXISTS(TRUE,FALSE 로 반환) WHERE 1=0 (FALSE) WHERE 1=1 (REUE)
IN(범위(값으로)반환)
SELECT FROM DEPT B
WHERE EXISTS(SELECT
FROM EMP E WHERE E.DEPTNO = B.DEPTNO);
-- 공통된 값이 있는지 확인하고 있다면 TRUE를 반환해서 출력한다

SELECT * FROM DEPT B
WHERE B.DEPTNO IN(SELECT DISTINCT DEPTNO FROM EMP WHERE SAL >=3000);
-- SAL에 지정한 값에 해당하는 DEPTNO와 비교해서 TRUE면 출력
자기의 데이터로 조인을 할 경우 셀프 조인이라 부른다

NOT EXISTS 가능 =>EXISTS의 반대값(FALSE)을 출력

-서브 쿼리는 하나의 쿼리문 안에 포함된 또 하나의 SELECT 문장
-서브 쿼리를 포함하고 있는 쿼리를 메인 쿼리, 포함된 또 하나의 쿼리를 서브 쿼리라 한다
-서브 쿼리는 비교 연산자의 오른쪽에 기술해야 하고 반드시 괄호로 묶어야 한다
(예외 INSERT ALL INTO 문의 SELECT절)
-서브 쿼리는 메인 쿼리가 실행되기 이전에 한번만 실행이 된다
-서브 쿼리안에 값이 2개이상이면 IN을 사용

단일 행 서브 쿼리(SINGLE ROW)

  • 오직 하나의ROW(줄) 만을 반환
  • 단일 행 비교 연산자(=, >, >=,<,<=,<>(NOT))를 사용

EX)SELECT EMPNO, ENAME FROM EMP WHERE SAL = (SELECT MAX(SAL) FROM EMP WHERE DEPTNO = 10);
--DEPTNO 10번중에 SAL이 가장 높은 사원의 EMPNO, ENAME을 출력
EX)--BLAKE와 같은 부서에서 근무하는 사람들의 이름과 입사일을 출력
SELECT ENAME , HIREDATE FROM EMP WHERE DEPTNO IN(SELECT DEPTNO FROM EMP WHERE ENAME = 'BLAKE')
AND ENAME<>'BLAKE'; -- BLAKE는 제외
(서브 쿼리 안에 값이 2개이상이기 때문에 IN을 사용한다)

ALL 사용법

  • 컬럼명 < ALL(100,200,300) --최소값보다 작다. (소스)
  • 컬럼명 > ALL(100,200,300) --최대값보다 크다. (대대)

1)SELECT ENAME, SAL FROM EMP
WHERE SAL > (SELECT MAX(SAL) FROM EMP WHERE DEPTNO = 30);
2)SELECT ENAME, SAL FROM EMP
WHERE SAL < (SELECT MIN(SAL) FROM EMP WHERE DEPTNO = 30);
ALL 1)SELECT ENAME, SAL FROM EMP
WHERE SAL > ALL(SELECT SAL FROM EMP WHERE DEPTNO = 30);
ALL 2)SELECT ENAME, SAL FROM EMP
WHERE SAL < ALL(SELECT SAL FROM EMP WHERE DEPTNO = 30);

ANY 사용법

  • 컬럼명 < ANY(100,200,300) --최대값보다 작다 (소대)
  • 컬럼명 > ANY(100,200,300) --최소값보다 크다 (대소)

1)SELECT ENAME , SAL FROM EMP
WHERE SAL > (SELECT MIN(SAL) FROM EMP WHERE DEPTNO = 30);
2)SELECT ENAME, SAL FROM EMP
WHERE SAL < (SELECT MAX(SAL) FROM EMP WHERE DEPTNO = 30);
ANY 1)SELECT ENAME , SAL FROM EMP
WHERE SAL > ANY(SELECT SAL FROM EMP WHERE DEPTNO = 30);
ANY 2)SELECT ENAME, SAL FROM EMP
WHERE SAL < ANY(SELECT SAL FROM EMP WHERE DEPTNO = 30);

UPDATE DEPT01
SET (DNAME,LOC) = (SELECT DNAME, LOC FROM DEPT WHERE DEPTNO = 30 )
WHERE DEPTNO = 30;
컬럼을 묶어서 서브 쿼리로 한 번에 값을 대입할 수 있음 (서브 쿼리만 가능, 순서 동일)

view (뷰 - 가상테이블) DML작업은 안된다
형식
CREATE VIEW 뷰명 AS 가져올 테이블쿼리(SELECT문);
삭제
DROP VIEW 뷰명;

  • 단순뷰는 원본 테이블과 연결되어 있어 데이터 변경이 가능하다(뷰의 값을 변경하면 원본 테이블의 값도 같이 변경된다)

뷰 성격에 따른 가능 범위
-단순뷰(SIMPLE VIEW) : VIEW를 생성할 서브 쿼리에 조인 조건이 1개의 테이블로 만들어지는 간단한VIEW 하나의 TABLE에서 뽑아오며 함수를 사용 안 한다
DML(INSERT, UPDSTE,DELETE)사용 가능
-복합뷰(COMPLEX VIEW) : 여러 개의 테이블이 JOIN 되어 생성되는 것 하나이상의 TABLE에서 뽑아오며 함수(GROUP BY HAVING등과 같은 함수)를 사용한다
DML(INSERT, UPDSTE,DELETE)사용 불가능
-인라인뷰(INLINE VIEW) : 여러 번 사용 할 필요 없이 1회만 필요한 VIEW일 경우 SQL문자의 FROM절에 VIEW의 서브 쿼리 부분을 바로 적어주면 되며 이런 일회용 VIEW 를 말함

ORA-28001 에러
(THE PASSWORD HAS EXPIRED
비밀번호가 만기되었습니다)
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
=> 락 걸리는 기간 해제
형식
ALTER USER 계정명 ACCOUNT UNLOCK;
ALTER USER 계정명 IDENTIFIED BY 새비밀번호;
=> 락걸려있는 계정에 잠금 해제
잠금해제후에는 반드시 비밀번호 새로 지정

집합 연산자
집합연산자 : UNOIN, UNION ALL - 합집합, INTERSECT - 교집합, MINUS - 차집합
집합연산자의 제한 조건:

  • 두 테이블의 컬럼 갯수와 자료형, 나열순서가 같아야 한다
  • ORDER BY 절은 모든 쿼리문을 다 기술한 뒤 맨 마지막에 한 번만 기술가능하다
  • LOB(BLOB, CLOB, BFILE)자료형, LONG 자료형에는 사용할 수 없다
  1. UNION : 합집합
    두 개의 테이블의 데이터를 모두 포함한 경과를 반환함
    중복을 허용하지 않는다 중복값은 1개만 표현함
  2. UNION ALL : 합집합
    UNION과 거의 다 동일하지만 중복을 허용하여 모두 출력한다

4일차

페이징처리 할 때 많이 사용하는 rownum

ROWNUM (컬럼)
단순 SELECT절 단순 WHERE절
-ROWNUM < 숫자값 OR ROWNUM <= 숫자값 OR ROWNUM =1 만 가능

  • 여러개의 조건이 불가능하다 하나의 조건만 가능
    /서브쿼리 WHERE 서브쿼리SELECT절 가능(별칭이 필요하다)
  • 여러개의 조건이 가능하다 단 별칭으로
    ex) SELECT FROM
    (SELECT ROWNUM RN, C2.
    FROM customers C2 WHERE CUST_GENDER = 'M' AND CUST_MARITAL_STATUS = 'married')
    WHERE RN BETWEEN 10 AND 13;

익스포트 하는 방법
EXP HR/1111@XE FILE=C:\HR.DMP[FULL=Y(선택)]
임포트 하는 방법
권리자 권한으로 CMD창 열고 아래 쿼리문 실행
IMP USERID=임포트할계정명/임포트할계정의비밀번호 FILE=임포트할DMP파일의 경로 포함한 확장자명까지 FROMUSER=DMP파일의 원본계정명 TOUSER=임포트할 계정명
이렇게 실행이 안될때는 DMP파일을 C드라이브 바로 밑에 저장위치를 변경하여 옮긴 후 아래의 실행문으로 실행해야한다

MERGE
형식) MERGE INTO (DML이 적용될 테이블명 또는 서브쿼리) 별칭 (테이블명만 올시에는 괄호생략)
USING (데이터를 가져올 테이블 쿼리문) 별칭
ON (적용될 테이블 별칭.컬럼명 = 가져올 테이블 별칭.컬럼명)
WHEN MATCHED THEN
(UPDATE 적용될 테이블 별칭.컬럼명 = 가져올 테이블 별칭.컬럼명, ...
OR DELETE WHERE 조건);
WHEN NOT MATCHED THEN
INSERT(적용될 테이블별칭.컬럼명, ....) VALUES(가져올 테이블의 별칭.컬럼명, ...)

PL/SQL(절차적) (Oracle's Precedural Language extension to SQL)
SET SERVEROUTPUT ON 세미콜론 제외 (실행)
형식
declare(생략가능) 선언부(declare section) 변수(자동초기화값(null)이 있음)나 상수(초기화값 필수)를 선언
begin(생략불가능) 실행부(executable secuion) sql문(DDL X) 제어문,반복문 커서 출력문(DBMS_OUTPUT.PUT_LINE())
*출력문안에서 문자열 결합은 || 사용
exception(생략가능) 예외 처리부(exception section)
end;
/ 실행

  • DBMS 출력창에서 확인

스칼라 변수 : SQL 자료형과 비슷하게 선언하는 변수를 말함
VARCHAR2(4TB까지 가능), NUMBER, %TYPE=> 테이블 컬럼의 자료형 %ROWTYPE=>테이블의 레코드 참고 자료형
BOOLEAN=> TURE FALSE NULL
변수의 값 삽입할 때
종류 : 숫자(NUMBER) 문자 (CHAR, VARCHAR2) 날짜(DATE, TIMESTAMP) ,BOOLEAN 등

변수명 := 값;
변수명 앞에 'V' 상수명 앞에 'C' (권장사항)

출력문안에서 문자열 결합은 || 사용

SELECT '안녕 PL/SQL' INTO VAR -- 값 한 줄만 받을 수 있음
FROM DUAL;

연산자 및 우선순위
1. ** => 제곱연산자
2. +, - => 부호 연산자
3. 곱셈기호, / => 곱셈, 나눗셈(몫)
4. +, -, ||, => 덧셈, 뺄셈, 문자열 연결연산자
5. =, >, >=, <, <=, <>, !=, IS NULL, LIKE, BETWEEN, IN => 비교연산자

논리연산자
6. NOT : 부정연산자
7. AND : 논리곱연산자 (둘다 참일 때만 참)
8. OR : 논리합연산자 (하나라도 참이면 참)
NULL + TRUE = NULL(AND) TRUE(OR)
NULL + FALSE = FALSE(AND) NULL(OR)

CONSTANT 상수명 뒤에 기재
INTEGER : 자바 INT
POSITIVE : 0포함하지 않음 양수만 가능
SIGNTYPE : -1, 0, 1, NULL만가능
NATURALN : 0을 포함한 양수 , NULL 불가능

예시) DECLARE
--테이블의 컬럼의 데이터타입과 일치시켜 주는 것이 좋다, 에러 예방
--스칼라 변수 선언
VEMPNO NUMBER(4);
VENAME VARCHAR2(10);
VDEPTNO NUMBER(2);
VDNAME VARCHAR(14);
BEGIN
--테이블 안의 데이터를 받아노는 경우 SELECT 절 안에 INTO를 이용한다
--SELECT절 컬럼의 데이터타입, 개수, 순서와
--INTO절의 변수의 데이터타입, 개수, 순서가 일치해야 한다
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME
--변수 대소문자 구분 안 함
INTO VEMPNO, VENAME, VDEPTNO, VDNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND E.ENAME = 'SMITH';

DBMS_OUTPUT.PUT_LINE('사번/ 이름/ 부서번호/ 부서명');
DBMS_OUTPUT.PUT_LINE('-----------------------------');
DBMS_OUTPUT.PUT_LINE(VEMPNO || ' / ' || VENAME || ' / ' || VDEPTNO || ' / ' || VDNAME);
END;

레퍼런스
-레퍼런스 변수 : DB 테이블의 특정 컬럼으로 변수 타입을 지정할 때 사용

  • 테이블에서 컬럼의 자료형이 변경되더라도, PL/SQL에서의 변수선언부분을 수정할 필요가 없다는 장점이 있다
    -형식
    테이블이름.필드명%TYPE : 컬럼 타입 선언, 컬럼 ( 열, 칸, 필드, 항목, 속성) 단위
    테이블이름%ROWTYPE : 레코드 타입 선언, 레코드( 행, 줄, 로우) 단위

IF문 형식
IF(조건1 CONDITION1) THEN
실행문1(STATEMENT1);
ELSIF 조건2 THEN
실행문2;
ELSE
실행문3;
END IF; (블럭이 필수가 아니기 때문에 끝맺음을 해주어야 함)

ROUND(DBMS_RANDOM.VALUE(10,30), -1) => 소수로 반환함

예시) DECLARE
-- %ROWTYPE 속성으로 로우를 저장할 수 있는 레퍼런스 변수 선언
VEMP EMP%ROWTYPE;
ANNSAL NUMBER(7,2);
BEGIN
--여러 줄을 받는 쿼리문인 경우 에러,ROW값 1개만 받을 수 있다
SELECT INTO VEMP FROM EMP WHERE ENAME='SMITH';
--변수를 테이블의 %ROWTYPE으로 하였기에
--각 컬럼명으로 접근시에는 변수명.컬럼명으로 접근할 수 있다
IF(VEMP.COMM IS NULL) THEN
ANNSAL := VEMP.SAL
12;
ELSE
ANNSAL := VEMP.SAL * 12 + VEMP.COMM;
END IF;
--소수점 둘째 자리수에서 반올림 됨
DBMS_OUTPUT.PUT_LINE('사번 / 이름 / 연봉');
DBMS_OUTPUT.PUT_LINE('-------------------');
DBMS_OUTPUT.PUT_LINE(VEMP.EMPNO || ' / ' || VEMP.ENAME || ' / ' || ANNSAL);
END;
/

5일차

CASE문
출력문 안에 존재 시 : NULL값은 WHEN절에 올 수 없다 제대로 된 결과를 받을 수 없다
CASE WHEN 조건|결과값 THEN '참일때값' WHEN 조건|결과값 THEN '참일때 값' ELSE '그외의 값' END
CADE 조건 WHEM 결과값1 THEN '결과값 1일 때 값' WHEN 결과값2 THEN '결과값 2일 때 값' ELSE '그외의 값' END

BEGIN안에 멤버로 존재 시:
CASE 조건 WHEN 결과값1 THEN
결과값1일때 실행문이나 출력문;
WHEN 결과값2 THEN
결과값2일때 실행문이나 출력문;
ELSE
그외의 값일 때 실행문이나 출력문;
END CASE; --반드시 END CASE를 주어야 한다

예시) DECLARE
V_TOTAL NUMBER := 14;
V_MAX NUMBER := 10;
V_ORDER BOOLEAN;
BEGIN
V_ORDER := NVL(V_TOTAL, 1) > V_MAX;
--DBMS_OUTPUT.PUT_LINE(V_ORDER);
DBMS_OUTPUT.PUT_LINE('BAL = ' || CASE WHEN V_ORDER THEN 'TRUE' ELSE 'FALSE' END); TRUE FALSE 분별
END;
/

CHR(13) 라인에 처음으로 돌아간다
CHR(10) 밑으로 한 줄 옮긴다

반복문
형식:
1) LOOP 실행문;
IF 조건문 THEN EXIT; --BREAK의 기능을 함 END LOOP로 감
END IF;
END LOOP;
2) LOOP 실행문;
EXIT WHEN 조건문; -- BREAK의 기능을 함 END LOOP로 감
END LOOP;

FOR LOOP문
형식 : 시작값 .. 종료값까지 1씩 증가
FOR 인덱스 IN REVERSE 시작값 .. 종료값 LOOP 실행문 또는 출력문;
END LOOP;

CONTINUE 사용 가능

begin
FOR N IN 1 .. 5 LOOP -- N은 변수가 아닌 인덱스임 1 2 3 4 5
END LOOP;
END;
/

begin
FOR N IN REVERSE 1 .. 5 LOOP -- 5 4 3 2 1
DBMS_OUTPUT.PUT_LINE(N);
END LOOP;
END;
/

BEGIN
FOR K IN 1 .. 10 LOOP
EXIT WHEN MOD(K,2) = 0; -- MOD = 값을 나누고 나머지를 반환
DBMS_OUTPUT.PUT_LINE(K);
END LOOP;
END;
/

WHILE LOOP
형식 : WHILE 조건 LOOP
실행문 또는 출력문;
END LOOP;

--GOTO 분기문
DECLARE
VNUM NUMBER := 2;
BEGIN
<> -- 라벨을 붙일 수 있다. 라벨기호를 ANGLE BREACKETS이라 한다
FOR I IN 1 .. 9 LOOP
DBMS_OUTPUT.PUT_LINE(VNUM || '' || I || ' = ' || VNUMI);
IF VNUM < 9 AND I = 9 THEN
VNUM := VNUM + 1;
DBMS_OUTPUT.PUT_LINE(' ');
GOTO GUBAN;
ELSIF VNUM = 9 AND I = 0 THEN
EXIT;
END IF;
END LOOP;
END;
/

WHILE LOOP
형식 : WHILE 조건 LOOP
실행문 또는 출력문;
END LOOP;

커서 (cursor)
sql문을 처리한 결과를 담고 있는 영역(메모리영역)을 가리키는 일종의 포인터처리 결과가 여러 개의 행으로 구해지는 select 문을 처리할 때 이용
커서의 사이클 : 열기(open) - 패치(fetch) - 닫기(close)
fetch문은 결과셋(결과테이블)에서 로우(행) 단위로 데이터를 읽어들인다
fetch후에 cursor는 결과셋에서 다음 행으로 이동한다

커서의 상태 : 책 내용 변경하라 할 것
-- %FOUND : 커서 영역에 FETCH 되지 않은 자료가 있다면 TRUE
-- %NOTFOUND : 커서 영역의 데이터가 모두 FETCH 되었다면 TREU
-- %ISOPEN : /형식: 커서가 OPEN 된 상태이면 TRUE
/
형식: 묵시적커서는 OPEN 상태 인식이 안된다 따라서 늘 FALSE
-- %ROWCOUNT : 커서가 얻어 온 레코드의 개수
-- 커서명%ROWCOUNT : 커서명의 ROW수를 반환하는 속성
-- SQL%ROWCOUNT : 커서명이 없을 경우 바로 전에 실행된 SQL 문의 ROW수 반환하는 커서의 속성임

형식 :
DECLARE
CURSOR 커서이름 [(매개변수, ...)] IS SELECT 쿼리문;
BEGIN
OPEN 커서이름 [(매개변수, ...)];
FETCH 커서이름 INTO 변수이름;
CLOSE 커서이름;
END;
/

CURSOR와 FOR LOOP

  • 반복할 때 마다 CURSOR를 OPEN한 후, 행(레코드)을 인출(FETCH) 한다
  • 모든 행이 처리되면 자동으로 CURSOR가 CLOSE가 된다
  • REVERSE 처리를 할 수 없다
    형식
    FOR 레코드 IN 커서명[(매개변수, ...)]
    LOOP 실행문 END LOOP;
profile
나만의 방식을 찾아가는 신입신입 개발자

0개의 댓글