728x90

 

[관련]내부로직순서 및 예시

https://rise-up.tistory.com/722

 

계층형 구조(Hierarchical Structure)

부모와 자식 간의 관계를 깊이로 구분하여 표현하는 것으로 상하 수직관계의 트리형태의 구조

보통 카테고리를 분류나 조직도에 많이 사용

 

출처: https://m.blog.naver.com/javaking75/220010288704?view=img_2

 

용어

노드(node) : 위 그림에서 원모양으로 표시된 항목. 각각의 품목이 하나의 노드가 되며 실제 테이블에서는 하나의 로우가 노드

부모(parent) : 부모노드라고도 하며, 트리구조에서 상위에 있는 노드를 의미

자식(child) : 자식노드라고도 하며, 위 그림에서 '모니터'는 컴퓨터의 자식노드이며, 컴퓨터는 모니터와 본체의 부모노드임

리프(leaf) : 리프노드하며, 더이상 하위에 연결된 노드가 없는 최하위 항목을 의미. 즉 자식노드가 없는 노드 (ex : 모니터, 프린터, 랜카드)

루트(root) : 계층형, 트리구조에서 최상위에 있는 노드(ex: 컴퓨터)

레벨(level) : 트리구조에서의 각각의 계층을 의미

루트인 컴퓨터가 1레벨, 순차적으로 그 하위에 있는 모니터, 본체, 프린터가 2레벨, 그 아래가 메인보드, 랜카드가 3레벨이자 리프(leaf)

 

 

 

수행순서

1. START WITH 절에 시작 조건을 찾습니다.

2. CONNECT BY 절에 연결조건을 찾습니다.

 

 

START WITH

어떤 레코드를 최상위로 잡을지 지정

계층 구조 전개의 시작 위치를 지정하는 구문

 

CONNECT BY

부모,자식 관계를 지정

다음에 전개될 자식 데이터를 지정하는 구문

자식 데이터는 CONNECT BY절에 주어진 조건을 만족해야 한다.(조인)

 

PRIOR

‘이전’이라는 의미

위의 start with에서 정한 계층구조 시작위치 구문에서 나온 row에서의 값과 PRIOR에 기준점으로 잡은 컬럼과 같은 값을 추출한다

CONNECT BY절에 사용되며, 현재 읽은 칼럼을 지정

PRIOR 자식 = 부모 형태를 사용하면,

계층구조에서 자식 데이터에서 부모 데이터(자식 → 부모) 방향으로 전개하는 순방향 전개

PRIOR 부모 = 자식 형태를 사용하면,

반대로 부모 데이터에서 자식 데이터(부모 → 자식) 방향으로 전개하는 역방향 전개

 

 

자료출처
https://www.youtube.com/watch?v=boNut__USIU&list=PLyQR2NzLKOCZU_jjLAdebyx9oE9dvvsrE&index=10

728x90
반응형
728x90

 

 

2중 조인 + 인라인뷰 서브쿼리 + RNUM 사용

테이블 조회 해보았다

RNUM의 별칭(alias)를 적용하기 위해서는 안쪽 셀렉트문에서 별칭이 선언되어야 밖의 쿼리에서 별칭이 적용될 수 있으니 유의!

 

SELECT * 
FROM BOARD B
    JOIN FOOD F ON(B.FOOD_NO = F.FOOD_NO)
    JOIN RESTAURANT R ON(B.RESTAURANT_NO = R.RESTAURANT_NO)
WHERE B.STATUS = 'Y' AND BOARD_TYPE = 1;



SELECT *
FROM (SELECT ROWNUM RNUM, DESCBOARD.*
      FROM (SELECT * 
            FROM BOARD B
                JOIN FOOD F ON(B.FOOD_NO = F.FOOD_NO)
                JOIN RESTAURANT R ON(B.RESTAURANT_NO = R.RESTAURANT_NO)
                WHERE B.STATUS = 'Y' AND BOARD_TYPE = 1) DESCBOARD)
WHERE RNUM >=2 AND RNUM
728x90
반응형
728x90

 

row 데이터 전체 조회 및 반환 코드

내부 쿼리문

 

package com.kh.test.model.TestDao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import com.kh.test.model.Test;

public class TestDao {

	
	public List<Test> selectList() {
		
		List<Test> list = null;
		Connection conn = null;
		Statement stmt = null;
		ResultSet rset = null;
		
		try {
			Class.forName("Oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.10.3:1521:xe","kh","kh");
			
			String query = "SELECT * FROM TEST";
			
			stmt = conn.createStatement();
			rset = stmt.executeQuery(query);
			
			if(rset.next()) {
				int seq = rset.getInt("SEQ");
				String writer = rset.getString("WRITER");				
				String title = rset.getString("TITLE");				
				String content = rset.getString("CONTENT");				
				Date regDate = rset.getDate("DATE");		
				
				list.add(new Test(seq, writer, title, content,regDate));
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();	
		} catch (SQLException e) {
			e.printStackTrace();

		} finally {
			try {
				rset.close();	
				stmt.close();   
				conn.close(); 	
			} catch (SQLException e) {
				e.printStackTrace();
			} 
		}
		return list;
	}
	
}

 

 

728x90
반응형
728x90

 

sql의 테이블 확인하고 

vo의 필드(전역변수) 세팅

필요한 값들을 필드에 넣기

 

package com.kh.test.model;

import java.sql.Date;

public class Test {
	
	public int seq;
	public String writer;
	public String title;
	public String content;
	public Date regDate;
	
	public Test() {}

	public Test(int seq, String writer, String title, String content, Date regDate) {
		super();
		this.seq = seq;
		this.writer = writer;
		this.title = title;
		this.content = content;
		this.regDate = regDate;
	}

	
	public int getSeq() {
		return seq;
	}

	public void setSeq(int seq) {
		this.seq = seq;
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public Date getRegDate() {
		return regDate;
	}

	public void setRegDate(Date regDate) {
		this.regDate = regDate;
	}
	
	

}
728x90
반응형
728x90

 

cmd로 들어가서 sqlplus 입력

sql에 진입

유저는 반드시 system권한을 가진 계정으로 해야한다

(아아디 비번을 틀리면 invalid username/pw; login denied 메세지가뜨면서 로그인 거부됨)

 

여기서 한번 더 conn/as sysdba로써 시스템 관리자로 들어간다

create user 사용할 아이디 indentified by 사용할 비번;

해서 계정 생성하고

grant connect,resource to id;

해서 권한 부여해준다

그리고 많이들 실수하는게 그냥 꺼버리는건데

commit까지 해줘야 완전히 저장된다

 

728x90
반응형
728x90

 

DML (Data Manipulation Language) :  데이터 조작어

INSERT, UPDATE, DELETE

 

1.INSERT 데이터 삽입

INSERT INTO 테이블명(데이터를 삽입할 컬럼명) VALUES(테이블의 컬럼 수에 맞게 값 삽입);
INSERT INTO 테이블명 VALUES(테이블의 컬럼 수에 맞게 값 삽입);
    - 테이블의 모든 컬럼에 값을 넣을 때는 컬럼명 생략가능

    - 컬럼 순서대로 데이터값이 들어가기에 순서명이 정확해야함

INSERT INTO MEM VALUES(1,'김철수',001,01012345678);
INSERT INTO MEM(EMPLPOYEE_ID,EMPLOYEE_NAME,EMPLOYEE_NUMBER,PHONE);

 

원하는 컬럼에 데이터값 넣기

INSERT INTO MEM(EMPLOYEE_ID) VALUES(2);
INSERT INTO MEM(EMPLOYEE_NAME) VALUES('박철수');
INSERT INTO MEM(EMPLOYEE_NUMBER,PHONE) VALUES('002','01012345679');

 

2.UPDATE 데이터 수정

 UPDATE 테이블명 SET 컬럼명 [WHERE]

UPDATE MEM SET EMPLOYEE 
UPDATE MEM SET EMPLOYEE = WHERE EMPLOYEE_ID = '002';

 

3.DELETE 데이터 삭제

DELETE FROM 테이블명 [WHERE] 컬럼명;

DELETE 제약조건 무시
기본적으로는 부모 참조 자식 테이블 있으면 삭제 불가

DELETE로 삭제한거는 롤백으로 복원 가능
TRUNCATE는 롤백으로 복원 불가능

DELETE FROM MEM;
DELETE FROM MEM WHERE EMPLOYEE_ID='001';

 

 

 

 

 

 

 

728x90
반응형
728x90

1.CMD 진입

2. sql진입 : sqlplus 명령어 입력 & 엔터

3. 계정로그인

4. 시스템계정 진입 : conn/as sysdba;

5.권한 삭제 : revoke connect,resource from 유저명'; 

6.계정 삭제 : drop user아이디 cascade;   

      - cascade를 빼도 삭제는 되지만 관련된 내용들까지 깨끗이 지우기 위해서는 필수

7.저장 : commit;

728x90
반응형
728x90

 

1.CMD 진입

2. sql진입 : sqlplus 명령어 입력 & 엔터

3. 계정로그인

4. 시스템계정 진입 : conn/as sysdba;

계정 생성 : create user 유저명 identified by 비번; 

계정 권한부여 : grant resource,connect to 아이디;

저장 : commit;

 

 

 

728x90
반응형
728x90

 

 

사용 프로그램

Oracle 11g

 

메세지

ORA-25154: column part of USING clause cannot have qualifier 25154. 00000 - "column part of USING clause cannot have qualifier"

*Cause: Columns that are used for a named-join (either a NATURAL join or a join with a USING clause) cannot have an explicit qualifier.

*Action: Remove the qualifier.

 

상황

ANSI 표준구문으로 사번, 사원 명, 직급코드, 직급명 조회할려던 중 발생

 

원인

ANSI 표준구문에서 USING 자체가 다른 테이블에 같은 컬럼명을 JOIN한다는 전제가 깔려있기에 SELECT절에 JOIN되는 각 컬럼 앞에 테이블 경로 지정해줄 필요가 없다

 

해결

식별자(quilifier) 삭제

 

-- 에러 해결 전
EMP_ID, EMP_NAME, E.JOB_CODE, J.JOB_NAME
FROM EMPLOYEE E
    JOIN JOB J USING(JOB_CODE);
    
 -- 에러 해결 후
 EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
    JOIN JOB USING(JOB_CODE);
728x90
반응형
728x90

메세지

ORA-08002: sequence SEQ_EMPID2.CURRVAL is not yet defined in this session

원인

아직 시퀸스명.NEXTVAL로 시퀸스를 실행시키지 않아서 에러.

해결

NEXTVAL에서 CURRVAL로 최초값을 받아오자.

 

--SEQ_EMPID에 대한 '현재 값' 조회
SELECT SEQ_EMPID.CURRVAL FROM DUAL;
-- ERROR : ORA-08002: sequence SEQ_EMPID2.CURRVAL is not yet defined in this session
-- 원인 : 아직 시퀸스명.NEXTVAL로 시퀸스를 실행시키지 않아서 에러. NEXTVAL에서 CURRVAL로 최초값을 받아오자.
SELECT SEQ_EMPID.NEXTVAL FROM DUAL; -- 300 // 305 // 310 누를 때마다 5씩 값 증가되서 출력됨. 최대치설정이310이라 멈춤
728x90
반응형

+ Recent posts