ResultSet 

- select의 조회결과를 자바에서 얻기 위해 cursor의 제어권을 저장한 객체

- 자바에서는 ResultSet을 써서 cursor가 위치한 행(record)의 컬럼값을 얻음 

-  !! 하는 일!!

1) cursor를 이동시키는 일

 * cursor : 조회 결과를 얻기 위해 움직이는 pointer

      > DB에서 테이블이 조회되면 inline view가 생성되는데, inline view 앞에 cursor가 존재

      >  cursor 이용하는 경우에는 previous() 쓰지 말자. 부하가 엄청 크다. 쿼리로 해결하자

  - 커서가 있는 위치에서 다음 레코드가 존재하는지? : rs.next()

     > 커서가 있는 위치에서 다음 레코드가 존재하면 true가 반환되고 커서의 위치가 아래로 이동함

     > 무조건 처음에 next()를 먼저 수행해야 커서가 컬럼의 값이 존재하는 레코드의 첫 행으로 내려갈 수 있음!

 

2) Oracle의 데이터형을 Java에 저장하기 위해 형변환을 수행

  - 오라클의 데이터형을 자바로 저장하기 위해 자바의 데이터형으로 변환하여 얻는 일

형식 Oracle Java ResultSet method
숫자 Number

정수 : byte, short, int, long getByte(), getShort(), getInt(), getLong()

실수 : float, double getFloat(), getDouble()
문자열 char / varchar2 String getString()
날짜 date Date getDate() 
// 반환형은 java.sql.Date (java.util.Date의 자식class)

   -  get method의 () 안에는 컬럼명 or 인덱스를 넣어서 값을 가져온다 

       > 인덱스는 1번부터 시작! cursor가 0번

      > 인덱스를 사용하면 가독성이 떨어지므로 되도록 컬럼명을 사용하여 코딩하자

   - Java API에서 ResultSet의 method 참고하여 골라 사용하자

 

 


# 오늘의 코딩 #

- Statement를 사용해보자!

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.sun.net.httpserver.Authenticator.Result;

/**
 * Statement 사용한 DBMS 연동
 * @author user
 */
public class UseStatement {

	/**
	 * CP_DEPT 테이블의 모든 레코드 조회
	 * @throws SQLException
	 */
	public void selectAllCpDept() throws SQLException {
		
		//1. 드라이버 로딩
		try {
			Class.forName("oracle.jdbc.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}//end catch
		
		String url = "jdbc:oracle:thin:@localhost:1521:orcl";
		String id = "scott";
		String pass = "tiger";
		
		Connection con = null; // DB연동 유지, transaction, 쿼리문 생성객체 얻기
		Statement stmt = null; // 쿼리문 실행
		ResultSet rs = null ; // 조회(Cursor의 제어권), 데이터형 변환
				
		try {
		//2. Connection 얻기
			con = DriverManager.getConnection(url, id, pass);
		//3. 쿼리문 생성객체 얻기
			stmt=con.createStatement();
		//4. 쿼리문 수행 후 결과 얻기
			String selectCpDept = "select deptno,dname,loc from cp_dept";
			rs = stmt.executeQuery(selectCpDept); 
            // DB조회 결과로 인라인뷰가 만들어지고 커서 제어권 가져옴
			
			int deptno = 0;
			String dname = "";
			String loc = "";
			// 조회결과에서 커서의 첫 위치는 컬럼명이 있는 곳이므로 무조건 한번은 내려야 값이있는 행에 위치할 수 있음
			while(rs.next()) { // 포인터가 존재하는 위치 아래에 레코드가 존재하는지?
				//컬럼명으로 얻기 => 가독성이 높음
				deptno = rs.getInt("deptno");
				dname = rs.getString("dname");
		    	loc = rs.getString("loc");
		
				System.out.println(deptno + " / " + dname + " / " + loc);
			}//end while
			
		} finally {
		//5. 연결 끊기
			if(rs != null) {rs.close();}
			if(stmt != null) {stmt.close();}
			if(con != null) {con.close();}
		}//end finally
		
	}//selectAllCpDept
	
	public static void main(String[] args) {
		UseStatement us = new UseStatement();

		try {
			us.selectAllCpDept();
		} catch (SQLException e) {
			e.printStackTrace();
		}//end catch
		
	}// main

}// class

 

# 출력 결과 #

무사히 출력완료!

 JDBC 작업 순서 

*하기 순서에 입각하여 코딩해야 함*

*()은 항목 당 사용하는 Class/Interface명

1) 드라이버로딩 (Class)

2) Connection 얻기 (Connection, DriverManager)

3) 쿼리문 생성객체 얻기 (Statement, PreparedStatement, CallableStatement)

4) 쿼리문 수행 후 결과 얻기 (Select인 경우 ResultSet)

5) 연결 끊기

 

 

** 상세 과정 ** 

1. 드라이버 로딩

- DB Vendor사에서 제공  -> Oracle에서는 ojdbc8.jar

- new를 사용하지 않고 클래스를 JVM에 instance로 생성할 수 있는 클래스

- Class라는 Class (java.lang package)

- ClassNotFoundException 예외가 발생

- 문법) Class.forName(“드라이버클래스”); 

             Class.forName(“oracle.jdbc.OracleDriver”) // 클래스파일은 대소문자 구분 필수!!

 

 

2. Connection 얻기

- Connection Interface는 autocommit이 기본 설정이므로, java는 쿼리 실행 후 자동 commit이 됨

- 로딩된 드라이버를 관리하는 클래스 : java.sql package의 DriverManager Class

- 로딩된 드라이버를 사용하여 Connection URL(DB URL), id, password를 입력하고 DB와 연결된 connection을 얻음

- SQLException 예외 발생

- 문법) String url = “jdbc:oracle:thin:@DBServer위치:DB port:SID”; // "jdbc:oracle:thin:@localhost:1521:orcl";

             String id = “아이디”; // scott

             String pass = “비밀번호”; // tiger

            Connection con = DriverManager.getConnection(url, id, pass);

① url

  - 연결할 DB의 포트 번호와 DB명 넣어야 함

  - @은 ip주소 표시하는 것, localhost(127.0.01.)는 loopback

  - oracle은 1521가 기본 포트고, SID는 컴퓨터마다 유일한 하나의 값을 가짐!

 ② ip/pw

  - 설정된 url에 id와 pw를 가지고 DB와 연동을 기다림

③ getConnection

  - DB는 port를 열고 접속을 기다림 (오라클 port 번호 : 1521 / name : orcl)

      > DB가 접속을 허가하면 인증 정보를 getConnection이 받는다

 

 

3. 쿼리문 생성객체 얻기

- 쿼리문 생성 객체 종류 : statement, preparedstatement, callablestatement

     > Statement, PreparedStatement  : 쿼리 실행 

     > CallableStatement : procedure 호출

- java.sql.Connection Interface로부터 얻음

  • Statement 
    - 얻기 : Statement stmt = con.createStatement();  
    - 객체는 쿼리문을 실행할 때마다 반복적으로 계속 생성하여 실행하는 객체 
         >  쿼리문 실행 : excuteXXX(String sql)
    - Statement 객체는 실행할 쿼리문을 알지 못함
    - 쿼리문이 반복적으로 실행될 때 효율이 떨어짐
    쿼리문에 값을 넣어 생성하기 때문에 쿼리문의 복잡도가 높음
    - PreparedStatement / CallableStatement의 부모
    - SQLInjection 발생 : injecton block code 작성 필요
  • PreparedStatement
    - 얻기 : PreparedStatement pstmt = con.prepareStatement(String sql)
         >  쿼리문 실행 : excute()
    - 객체는 쿼리문을 한 번만 생성하고 값만 넣어서 실행하는 객체
    - PreparedStatement 객체는 실행할 쿼리문을 알고 있음
    - 쿼리문에 bind변수를 설정하고 값을 나중에 입력함
          >  bind 변수 : 쿼리문 안에 ? 로 정의하는 변수,  추후에 값이 반드시 들어가야 함, PreparedStatment에서 많이 사용됨
    - 쿼리문을 한 번만 생성하고 값을 변경하여 실행하기 때문에 쿼리문이 반복적으로 실행되는 환경에서 효율이 좋음
         > Java는 대용량 서비스를 많이 제공하기 때문에 반복 쿼리가 많은 편이라 PreparedStatement가 자주 사용됨!
    쿼리문과 입력되는 값을 따로 작성하기 때문에 쿼리문의 복잡도가 낮아짐
    - Statement Interface의 하위 Interface이나, 부모의 method는 잘 쓰지 않음
    - SQLInjection 발생하지 않음 : injecton block code 불필요
  • CallableStatement
    - 얻기 : CallableStatement cstmt = con.prepareCall(String sql);
                  > 여기서의 sql은 호출할 procedure명

    - procedure를 호출하는 일 (직접 실행 - 쿼리문 없이 실행하는 것) // 쿼리는 간접 실행
    - PreparedStatement Interface의 하위 Interface
    - bind 변수로 입력하는 값을 할당할 수 있음
    - registerOutParameter() method를 사용하여 procedure의 OutParameter를 처리해야 함

    (OutParameter  : java method의 반환형같은 것! OurParameter 여러 개 설정 가능)

 

 

4. 쿼리문 수행 후 결과 얻기

- 쿼리를 작성하여 실행

- 쿼리문 분류에 따라 사용하는 실행 method 가 다르므로 주의

   (어떤 excute를 써도 실행은 되나, 올바른 결과가 아님)

  • DB를 변경하는 쿼리문
    create, drop, truncate, grant, revoke 
      - 처리 됐는지 안됐는지로 판단하므로, 반환형이 boolean인 Statement Interface의 execute() 사용
      -  stmt.excute()
    insert, update, delete
      - 몇 행이 추가/변경/삭제 되었는가가 중요하므로, 반환형이 int인 Statement Interface의 excuteUpdate() 사용
      - 단, insert는 subquery가 아니라면 성공 아님 예외라서 return값을 안 받아도 됨
              update와 delete : 0건 적용 (조건 잘못 넣었을때) or 적용완료 or 실패임
      - stmt.excuteUpdate() 
    commit, rollback
      - commit과 rollback은 Connection Interface에 method가 따로 존재하므로 그걸 씀
         > commit(), rollback()
  • DB를 변경하지 않는 쿼리문
    select

      - 결과가 조회되어야 함! 반환형이 ResultSet인 Statment Interface의 excuteQuery() 사용
      - ResultSet = stmt.excuteQuery()     //  ResultSet은 다음편에!

 

 

5. bind 변수에 값 설정 (PreparedStatment의 경우 해당)

- bind 변수는 쿼리문에 ?표로 기술하는 변수

- 장점) SQL문과 값이 분리된다

- PreparedStatement의 method 활용 (parameter index => bind index를 말함)

- bind 변수는 차례로 1번의 index부터 시작하며, setXXX()로 bind 변수에 값을 설정함

    > 숫자 : pstmt.setInt (bind변수의 인덱스, 값);

    > 문자열 : pstmt.setString (bind변수인덱스, 값);

- 주의)

 ① bind 변수에는 ‘ 를 사용하지 않음

 ② Java는 like 의 % 와 함께 사용되면 바인드 변수를 인식하지 못함

       해결방법) where 컬럼명 like ‘?%’ (X)

                        => %를 일반 문자열로 변경하고 ?와 붙여줌(‘와 || 사용)

                        => where 컬럼명 like ?||’%’ (O)

 ③ bind 변수는 값이 들어가는 부분에만 사용할 수 있음 & 테이블명/컬럼명을 직접 사용할 수 없음

      해결방법) 변수로 갖다 붙이자! "select * from ?" // 안됨=> "select * from " + 테이블명

       > 단,  테이블명이 값으로 들어갈 때에는 bind변수를 사용할 수 있음 (다른 변수에 할당해서 사용은 가능)

 

 

6. 연결 끊기 (반드시!!)

- rs.close(); // select query의 경우 생성되는 ResultSet 객체가 있으면 이거 먼저 끊음

- stmt.close(); // Statement 객체 먼저 끊고

- con.close();  // 이후 Connection 끊기

 

* 모든 계정이 백업과 복구를 수행할 수 있음

* DOS창에서 수행

 

 1. 백업 

- exp.exe 사용

   > set path로 경로 확인후 진행

   > exp -help하면 도움말 보기

- 계정의 테이블만 백업) exp userid=계정명/비번 tables=테이블명,,, file=경로/백업파일명.dmp

- 계정의 모든 객체 백업) exp userid=계정명/비번 full=y file=경로/백업파일명.dmp

                                               > table, index, sequence, function,,,, 가능

 

 

 2 . 복구 

- imp.exe 사용

  > 도움말 보기 : imp -help

- 백업한 계정으로 복구할 수 있음

- 계정 내에 같은 이름의 객체가 존재하면 복구되지 않음

- 복구파일은 테이블만 백업한 파일 or 모든 파일 백업한 파일 모두 가능

- 테이블만 복구) imp userid=계정명/비번 tables=테이블명 file=경로/복구할 파일명.dmp

- 모든 객체 복구) imp userid=계정명/비번 full=y file=경로/복구할 파일명.dmp

                                 > 백업파일명 = 복구할 파일명

 

 

 3. exists 

- 조회 결과가 있으면 true, 없으면 false를 반환하는 함수

- where 절에서 사용

- 문법)  select 컬럼명

               from 테이블명

               where exists (서브쿼리)

               => 서브 쿼리의 실행 결과가 존재하면 바깥 쿼리문을 수행함

 

 

 

'Development > Oracle' 카테고리의 다른 글

[Oracle] index  (0) 2021.10.04
[Oracle] 권한부여 & 회수 / synonym / view  (0) 2021.10.01
[Oracle] sequence  (0) 2021.09.30
[Oracle] alter  (0) 2021.09.29
[Oracle] 제약사항 (Constraint)  (0) 2021.09.28

 

 1. JDBC 

- Java에서 DBMS와 연동할 때 사용하는 저수준 API(Application Programming Interface)

- Driver를 사용하여 DBMS와 연동 (driver loading 방식)

    > Driver는 DB Vendor사(DBMS 제조사 – Oracle, IBM,,,)에서 제공함

- driver loading 방식의 장점 : driver만 제공된다면 모든 DBMS와 연동 가능

- java.sql 패키지에서 관련 인터페이스와 클래스를 제공

 

 

 2. driver 종류 

- driver는 4가지 type으로 구분

 

① type 1 (JDBC-ODBC Bridge Driver)

- Windows에서만 사용할 수 있는 방식

- DB를 OS에서 연결 설정하고, java에서 사용하는 방식

- 속도가 느림 (잘 안씀. MS office의 Access 정도)

- java에서 제공하는 유일한 드라이버

 

② type 2 (native driver)

  - Driver를 제작한 언어와 Java가 다른 언어로 개발된 Driver 방식

    (언어가 다른데 DB를 주고받을 때)

  - driver를 사용하기 위해 별도의 프로그램을 설치해야 함 (번거로움)

  - Middle ware(미들웨어 – 장비, 소프트웨어,,,)에서 주로 사용되는 driver

 

③ type 3(network protocol driver)

  - applet에서 DBMS와 연동하기 위한 driver

 

④ type 4 (native protocol driver)

  - JDBC에서 가장 많이 사용하는 Driver

  - Driver를 제작한 언어와 Java가 동일한 언어로 개발된 Driver 방식 (안전성/속도 장점)

 

 

 3. java.sql package 제공 interface, class 

* 클래스 *

- Class : 외부에 존재하는 클래스를 new를 사용하지 않고 사용

- DriverManager : Connection URL과 인증정보를 받아 URL에 설정된 DB와 연동하여 Connection을 반환하는 일

* 인터페이스 *

- Connection : DB와 연동관리 – close(), transaction 관리 – commit()/rollback(), 쿼리문 생성 객체 얻기

- Statement : 쿼리문 생성 객체 / 쿼리문을 실행할 때마다 생성하고 실행하는 인터페이스

                             (실행할때마다 쿼리문을 생성해서 속도가 느림)

- PreparedStatement : 쿼리문을 먼저 생성하고, 값을 나중에 넣어 실행하는 인터페이스

- CallableStatement : Prodedure를 실행할 때 사용하는 인터페이스

- ResultSet : select한 결과를 사용하기 위해 Cursor의 제어권을 받는 인터페이스

 

 

 

코딩은 다음에 계속!

 index 

- 많은 양의 레코드에서 필요한 값을 빠르게 검색하기 위해 사용 (검색속도 향상)

- 레코드 수가 적으면 index를 사용하지 않는 것이 더 빠름

- 자동 인덱스, 수동 인덱스를 제공

  • 자동 인덱스 : 테이블을 생성할 때 primary key, unque를 생성하면 자동으로 생성되는 인덱스
  • 수동 인덱스 : 개발자가 생성하는 인덱스

- unique index, non-unique index, bitmap index, composite index 4가지를 제공

- 실제 테이블과 생성된 index는 별개로 동작함

   (테이블에 DML이 발생하더라도, index에는 반영되지 않음)

   -> 시간이 지날수록 실제 데이터와 인덱스 간의 정보차가 발생

    => 인덱스를 주기적으로 rebuild 해야 함!

- 테이블 삭제 시 인덱스도 함께 삭제 됨

 

- 인덱스로 설정해야하는 컬럼의 선정기준

  • where절에서 자주 사용되는 컬럼
  • where절에서 사용되더라도 함수를 사용하지 않고 조회하는 컬럼
  • 자주 변경되지 않는 컬럼

- 인덱스는 전체 레코드 중 10~15% 정도의 결과가 조회될 때 가장 속도가 빠름

  (인덱스가 항상 빠른 것은 아님)

- 인덱스는 테이블의 주소에 대한 참조 (DBMS는 내용에 의한 참조)

     => Oracle에서는 record의 주소를 rowid 컬럼(유일함)으로 사용

- 인덱스 생성) create [인덱스종류] index on 테이블명 (컬럼명,,,);

     => 해당 테이블의 컬럼을 조회 조건으로 사용하여 검색

- 인덱스 삭제) drop 인덱스 인덱스명;

- 인덱스 갱신) alter index 인덱스명 rebuild;

   -> 실제 테이블과 인덱스의 데이터를 일치시키는 것!

 

* index 종류별 생성문법 

1) unique 인덱스

 - 컬럼의 값이 유일할 때 사용하는 인덱스

 - 컬럼의 값이 null이거나 유일해야 함

 - 테이블을 생성할 때 PK를 설정하거나 unique를 설정하면 자동생성되는 자동 인덱스

- 수동 생성도 가능

 - 문법) create unique index 인덱스명 on 테이블명 (컬럼명);

2) non-unique 인덱스

 - 컬럼의 값이 중복될 때 사용하는 인덱스

 - 문법) create index 인덱스명 on 테이블명 (컬럼명);

3) bitmap 인덱스

 - 컬럼의 값이 키는 아니지만 독특한 형태일 때 사용하는 인덱스

     Ex) LOT 번호

 - 문법) create bitmap index 인덱스명 on 테이블명(컬럼명);

4) composite 인덱스

 - 여러 개의 컬럼이 조합되어 사용되는 인덱스

 - 문법) create index 인덱스명 on 테이블명(컬럼명 ,,, )

 

* 인덱스를 사용한 검색

- index hint를 기술함 : 여러 줄 주석과 한 줄 주석 방식 사용

       /*+ */ : 여러 줄 주석방식

       --+  : 한 줄 주석 방식

- index hint를 사용하면 정렬의 효과를 얻을 수 있음

- select 쿼리에 가장 처음에 기술함 : selelct /*+ 인덱스힌트 */ 컬럼명,,,

  > 인덱스 힌트 : 인덱스 종류 (테이블명(alias) 인덱스명)

       Ex) index (emp PK_EMP)  : 순방향 정렬의 효과

              index_desc (emp PK_EMP)  : 역방향 정렬 // 단, record가 많다면 정렬 안 되고  where절을 사용했을 때만 정렬됨

 

* index 관련 data dictionary

- 테이블에 설정된 인덱스 조회 : user_indexes data dictionary

    > last_analyzed column은 마지막으로 rebuild된 시간을 보여줌

- index로 설정된 컬럼을 조회 : user_ind_columns data dictionary

 


# 오늘의 코딩 #

-  인덱스 생성 / 조회를 해보자

 

#인덱스 생성

--사원번호로 non-unique index 생성
create unique index empno_ind on test_emp(empno);

select *
from user_ind_columns
where table_name='TEST_EMP';

#출력결과#

=> 딕셔너리를 조회하면 생성한 인덱스를 확인할 수 있다!

 


#인덱스를 이용한 조회

--인덱스를 사용한 조회, select hint 부여
select  /*+ index (test_emp EMPNO_IND)*/ empno, name, sal, hiredate
from    test_emp
where   empno =7788;

#출력결과#

=> 특정 사원번호를 인덱스를 통해 조회 가능!!

'Development > Oracle' 카테고리의 다른 글

[Oracle] 백업/복구/exists 함수  (0) 2021.10.06
[Oracle] 권한부여 & 회수 / synonym / view  (0) 2021.10.01
[Oracle] sequence  (0) 2021.09.30
[Oracle] alter  (0) 2021.09.29
[Oracle] 제약사항 (Constraint)  (0) 2021.09.28

 

 권한부여 & 회수 

- 생성된 계정이 할 수 있는 일을 부여하는 것

   > 생성된 계정은 아무런 권한을 가지고 있지 않음

- 관리자 계정만 권한 부여, 권한 회수가 가능함

- grant로 주는 권한은 oracle에 재접속해야 반영됨

권한명 하는일
connect Oracle DBMS에 접속할 수 있는 권한
resource Oracle DBM 자원 사용 권한
 - table space를 사용할 수 있음 (table 생성 등)
dba 일반계정을 DBA계정으로 권한 부여
 - 일반 계정이 관리자의 역할을 수행할 수 있음
create view view 생성 권한
create synonym 시노님 생성 권한

 

* synonym

- 테이블에 별명을 부여하여 사용하는 객체

- create synonum 권한이 부여된 계정만 사용할 수 있음

- alias와는 다르게, synonym명과 원래 테이블명 둘다 사용 가능

- user_synonyms data dictionary에서 확인 가능

- synonym과 public synonym지원 (public synonym은 다른 계정에서도 사용 가능함)

- 권한 부여) grant [public] create synonym to 계정명;

- 권한 회수) revoke [public] create synonym from 계정명;

- 시노님 생성) create synonym 시노님명 for 테이블명;

- 시노님 삭제) drop synonym 시노님명;

 

* grant,revoke 사용 (DCL)

- 권한 부여) grant 권한,,, to 계정명;

- 권한 회수) revoke 권한,,, from 계정명;

- Oracle 12c 부터는 resource 권한만 부여되어서는 테이블을 생성할 수 없음

   >> resource 권한 이후 table space에 대한 사용권한을 부여해야 함

   > 문법) alter user 계정명 default tablespace 테이블 스페이스명 quota unlimited on users

- 계정 사용하는 기본 tablespace는 users01.dbf파일이고 users라는 이름으로 사용됨

 

* 권한 관련 data dictionary

- DBMS 자체의 사용권한 조회 : dba_role_privs

- SQL문의 사용권한 조회(synonym, view도 확인가능) : dba_sys_privs

- synonym 조회 : user_synonyms

 

 

 view 

- 실제 테이블로부터 도출된 가상테이블

- 권한이 부여된 계정만 view를 생성할 수 있음

- user_views data dictionary에서 확인 가능

- 장점) 실제 테이블을 숨겨놓고 가상 테이블을 사용하므로 보안성이 향상됨

- DML 작업이 가능

    > view에 작업한 내용이 실제 테이블에 반영되고 테이블에서 작업한 내용이 view에 반영됨

- view에 DML작업을 막고 싶다면 veiw를 생성할 때 가장 마지막에 with read only를 사용

 

- 단순 뷰(하나의 테이블로 도출된 view), 복합 뷰(여러 개의 테이블에서 도출된 view)로 생성할 수 있음

① 단순 뷰

- 하나의 테이블에서 도출된 뷰

- 함수나 연산자를 사용하지 않고 만들어진 뷰

- DML 수행(insert, updtae, select, delete)이 가능함

② 복합 뷰

- 여러 개의 테이블에서 도출된 뷰

- join, 함수, 연산식을 사용한 뷰

 > 함수/연산식 :
     (insert,update) 연산, 함수가 사용된 열은 추가 작업이 되지 않음 / 해당 컬럼을 제외한 일반 컬럼은 사용 가능
     (delete) 집계함수를 사용하여 view를 생성하면 delete 불가 /
                      단일함수, 연산자를 사용한 컬럼에 대해서는 view에 생성된 값과 같다면 삭제 가능

  > join : DML 중 select만 가능 (insert, update, delete 불가)

              : view를 생성하면 select이 단순해짐

         => 복잡한 join을 만들어두고, 필요한 것만 그때그때 select하자!

 

* view 권한부여/회수 : 관리자 계정만 가능

- 권한 부여) grant creat view to 계정명;

- 권한 회수) revoke create view from 계정명;

- view 생성) create view 뷰명 (컬럼명,,,) as (select ,,,);  -- create subquery와 문법 동일

                                                                                                          -- (컬럼명,,)은 생략 가능

- view 삭제) drop veiw 뷰명;  -- 테이블이 삭제되면 view도 삭제됨

'Development > Oracle' 카테고리의 다른 글

[Oracle] 백업/복구/exists 함수  (0) 2021.10.06
[Oracle] index  (0) 2021.10.04
[Oracle] sequence  (0) 2021.09.30
[Oracle] alter  (0) 2021.09.29
[Oracle] 제약사항 (Constraint)  (0) 2021.09.28

 sequence 

- 순차적으로 증가하는 번호를 관리하는 객체

- 레코드를 insert하는 순서대로 번호를 넣어야 할 때

- 오라클 버전에 따라 순차적인 번호를 사용하지 못할 수도 있음

    > 12c 이전에는 오라클이 종료되면 cache에 설정한 sequence 번호가 사라짐

        (8i, 9i, 10g,11g)

    > 12c 이후 부터는 insert를 실패한 경우에만 번호가 사라짐 (12c~19c)

- user_sequences data dictionary에서 생성된 시퀀스를 확인할 수 있음

 

- 시퀀스 생성) create sequence 시퀀스명

                           increment by   증가값

                           start with      시작값

                           maxvalue      끝값

                           cache         메모리에 올릴 번호 개수

                           반복여부; (cycle | nocycle)

  > 시퀀스 생성 옵션의 기재 순서는 없음

  > cache는 20이 기본, 반복여부는 nocycle(반복아님)이 기본

  > 반복이 nocycle인 경우에는 maxvalue이후에 nextval하면 error

  > 생성된 시퀀스는 사용자가 nextval로 값을 사용해야 메모리에 로드됨 (메모리에 생성된 시퀀스만 사용 가능)

 

- 값 얻기) 시퀀스명.nextval

  > 메모리에 시퀀스가 로드되지 않으면 메모리에 시퀀스를 로딩하고 다음 번호를 얻음

                   시퀀스명.currval

  > 메모리에 로드되어있는 시퀀스의 현재 번호를 얻음(메모리에 로딩은 할 수 없음)

  > 시퀀스 객체가 메모리에 로딩되어있지 않다면 error 발생 (currval을 먼저 쓰면 error)

 

- 시퀀스 삭제) drop sequence 시퀀스명;

 

- 시퀀스 사용 중 쿼리가 실패하면 해당 번호는 사라짐.

   따라서, 순차적인 번호가 모두 존재해야하는 경우에는 시퀀스 쓰지 말고 서브쿼리 쓰자!! 

 


# 오늘의 코딩 #

- 시퀀스를 사용해보자!

 

#시퀀스 생성 및 사용

---시퀀스 생성
-- 1 ~ 100 까지 1씩 증가하는 반복하지 않는 시퀀스를 생성하고
-- cp_test_emp 테이블에 시퀀스를 사용하여 아래와 같이 사원정보를 추가하자

-- 1. 김동동 2800
-- 2. 박나나 2900
-- 3. 이사랑 2801

--시퀀스 생성
create sequence test_sequence
increment by 1
start with 1
maxvalue 100
nocycle;

--값 추가
insert into cp_test_emp(EMPNO, NAME, SAL)
values (test_sequence.nextval, '김동동', 2800);

insert into cp_test_emp(EMPNO, NAME, SAL)
values (test_sequence.nextval, '박나나', 2900);

insert into cp_test_emp(EMPNO, NAME, SAL)
values (test_sequence.nextval, '이사랑', 2801);
commit;

select * from cp_test_emp;
select * from user_sequences where sequence_name='TEST_SEQUENCE';

#출력결과#

=> empno(시퀀스 사용 부분)이 insert한 순서대로 부여된 것 확인! 

=> user_sequences 딕셔너리에서 조회하면 만든 시퀀스를 조회할 수 있음

 


#시퀀스 삭제

--시퀀스 삭제
drop sequence test_sequence;

#출력결과#

=> 삭제완료!

'Development > Oracle' 카테고리의 다른 글

[Oracle] index  (0) 2021.10.04
[Oracle] 권한부여 & 회수 / synonym / view  (0) 2021.10.01
[Oracle] alter  (0) 2021.09.29
[Oracle] 제약사항 (Constraint)  (0) 2021.09.28
[Oracle] union / join / driving table  (0) 2021.09.26

 alter 

- DDL

- 테이블의 관리, 제약사항 관리, 계정관리를 할 수 있는 쿼리 (자주 쓰임!!!)

 

 

1. 테이블의 관리

- 컬럼 추가, 컬럼테이터형 변경, 컬럼 삭제, 컬럼명 변경, 테이블명 변경

- 문법) alter table 테이블명 작업…;

 

** 컬럼 관리의 경우 주의할 점 :

① 제약사항을 붙여서 추가/변경 등 할 수 있으나 레코드의 구성이 제약사항에 위배된다면 추가할 수 없음

② 컬럼 데이터형 변경이나 컬럼명의 경우 기존 데이터 값에 따라 될수도 안 될수도 있음

 

1) 컬럼 추가

 - 추가된 컬럼은 제일 마지막에 추가됨

 - 문법) alter table 테이블명 add 컬럼명 데이터형(크기) 컬럼단위 제약사항;

2) 컬럼 데이터형 변경

- 레코드가 존재하지 않으면 데이터 형 자체를 변경할 수 있음

- 레코드가 존재하면 동일 데이터형에서 크기만 변경할 수 있음

   > 크기를 줄이는 것은 기존 컬럼 값의 크기에 따라 될 수도 안 될수도 있음.

 - 문법) alter table 테이블명 modify 컬럼명 데이터형(크기) 컬럼단위 제약사항;

3) 컬럼 삭제

  - 컬럼에 설정된 제약사항도 같이 삭제됨

  - 법) alter table 테이블명 drop column 컬럼명;

4) 컬럼명 변경

  - 테이블의 다른 컬럼명과는 다르게 변경

  - 문법) alter table 테이블명 rename column 원본컬럼명 to 변경할 컬럼명;

5) 테이블명 변경

 - 문법) alter table 원본테이블명 rename to 변경할 테이블명;

 

 

2. 제약사항 관리

- 제약사항 추가, 삭제, 활성화, 비활성화

- 제약사항의 활성화(enable), 비활성화(disable) 상태는 user_constraints의 status 컬럼에서 확인 가능

 

1) 제약사항 추가

- 테이블단위 제약사항 문법으로 추가함

- 문법) alter table 테이블명 add constraint 제약사항명 제약사항종류 (적용컬럼);

2) 제약사항 삭제

  - PK를 지우면 pk 설정시 따라오는 not nul도 같이 지워짐

- 문법) alter table 테이블명 drop constraint 제약사항명;

3) 제약사항 활성화/비활성화

- 주의) 비활성화 후 활성화를 할 때, 컬럼 값의 상황에 따라 활성화가 되지 않을 수도 있음

- 문법) alter table 테이블명 상태 constraint 제약사항명;

 > 상태에 enable 기입 : 활성화 / 컬럼에 설정된 제약사항을 체크함

 > 상태에 disable 기입 : 비활성화 / 컬럼에 설정된 제약사항을 체크하지 않음
      (제약사항이 PK인데 비활성화 되어있으면 중복값도 추가 가능해짐)

 

 

3. 계정 관리

- 계정 잠그거나 열기, 계정의 비밀번호 변경

1) 계정의 비밀번호 변경

- 모든 계정이 가능 (관리자는 다른 계정의 비밀번호를 변경(=재설정)할 수 있음)

- 문법) alter user 계정명 identified by 비번;

2) 계정을 잠그거나 열기

- 관리자 계정만 가능 (관리자 계정으로 로그인 한 후 다른 계정을 잠그거나 열 수 있음)

- 연습해볼 때는 login을 관리자계정으로 하고 해보자 (id : system / pw : managerjang)

- 문법) alter user 계정명 account lock | unlock;

 

 

** dba_users data dictionary : 계정에 대해 조회할 수 있는 data dictionary

 

 


# 오늘의 코딩 #

- alter를 사용해보자

 

#컬럼명 변경하기

--table 생성
select * from emp;
create table test_emp as (select * from emp);

--alter로 컬럼명 변경 (ename -> name)
alter table test_emp rename column ename to name;

#출력 결과#

<기존 테이블>

<변경된 테이블>

=> 컬럼명 변경 완료!

 


#PK 제약사항 추가하기

-- alter로 empno에 PK 제약사항 추가
alter table test_emp add constraint pk_test_emp primary key (empno);

-- 제약사항 조회
select *
from   user_constraints
where table_name='TEST_EMP';

#출력 결과#

=> user_constraints 딕셔너리 조회 결과 

     PK가 잘 들어가 있당!

+ Recent posts