ArrayList, HashMap의 Call By Value, Call By Reference 참조변수 테스트



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import java.util.ArrayList;
import java.util.HashMap;
 
import sun.text.CompactShortArray.Iterator;
 
 
public class AddressTest {
    
    public static class CallByValue{
        public int a;
    }
 
    public static void CallByReference(CallByValue param){
        param.a = 100;
    }
    
    public static void main(String[] args) {
        
        // ---------------------------------- #case1----------------------------------------------
        
        ArrayList<Integer> myArrayList1=new ArrayList<Integer>();
        ArrayList<Integer> myArrayList2=new ArrayList<Integer>();
        
        myArrayList1.add(10);
        myArrayList1.add(20);
        myArrayList1.add(30);
        // myArrayList1 = 10,20,30
 
        myArrayList2 = myArrayList1;
        
        myArrayList2.add(40);
        myArrayList2.add(0,5);
        myArrayList1.add(50);
        // myArrayList2 = 5,10,20,30,40
        
        System.out.println("myArrayList1값: "+myArrayList1); // 5,10,20,30,40
        System.out.println("myArrayList2값: "+myArrayList2); // 5,10,20,30,40
        
        // ---------------------------------- #case2----------------------------------------------
        
        HashMap<Integer, String> myHashMap1 = new HashMap<Integer, String>();
        HashMap<Integer, String> myHashMap2 = new HashMap<Integer, String>();
 
        myHashMap1.put(3"사이다");
        myHashMap1.put(1"커피");
        myHashMap1.put(2"우유");
        System.out.println("myHashMap1값: "+myHashMap1); // myHashMap1값: {3=사이다, 2=우유, 1=커피}
        myHashMap2 = myHashMap1;
        
        myHashMap2.put(4,"콜라");
        myHashMap2.put(5,"보리차");
        
        System.out.println("myHashMap1값: "+myHashMap1); // myHashMap1값: {5=보리차, 4=콜라, 3=사이다, 2=우유, 1=커피}
        System.out.println("myHashMap2값: "+myHashMap2); // myHashMap2값: {5=보리차, 4=콜라, 3=사이다, 2=우유, 1=커피}
        System.out.println(myHashMap2.keySet()); // [5, 4, 3, 2, 1]
        
        java.util.Iterator<Integer> myIterator = myHashMap2.keySet().iterator();
        while(myIterator.hasNext()){
            Integer key = myIterator.next();
            System.out.println(key+myHashMap2.get(key));
        }
        
        // ---------------------------------- #case3----------------------------------------------
        
        int a = 1;
        int b;
        
        b = a;
        b = 10;
        
        System.out.println("a값: "+a); // a = 1
        System.out.println("b값: "+b); // b = 10
        
        
        // ---------------------------------- #case4----------------------------------------------
        
        String c = new String();
        String d = new String();
        
        c = "ccc" ; 
        d = c ;
        d = "ddd";
        
        System.out.println("c값: " + c); // c = ccc
        System.out.println("d값: " + d); // d = ddd
        
        // ---------------------------------- #case5----------------------------------------------
        
        CallByValue callbyValue1 = new CallByValue();    
        callbyValue1.a = 200;
        System.out.println("callbyValue1값: "+callbyValue1.a); // 200
        CallByReference(callbyValue1);
        System.out.println("callbyValue1값: "+callbyValue1.a); // 100
    }
 
}
cs


case 1을 보면 myArrayList1과 myArrayList2는 서로 다른 변수로 선언 되어 있고


myArrayList1의 값을 add 해주고 myArrayList2 = myArrayList1 로 myArrayList1의 주소를 참조하고 있다.


그리고 myArrayList2의 값을 add해주고 myArrayList1값과 myArrayList2값을 찍어주면


같은 값(5,10,20,30,40) 이 출력된다.



case 2도 HashMap을 사용했는데 myHashMap2 = myHashMap1 로 주소를 참조해


myHashMap1과 myHashMap2의 같은 값{5=보리차, 4=콜라, 3=사이다, 2=우유, 1=커피}이 출력된다.




case 3case 4 call by value 로 객체를 생성해 값을 집어넣거나 값을 직접적으로 넣어도 서로 다른 값이 나오게 된다.



case 5는 메소드를 타게하여 주소로 접근해 값을 변경시키고 있다.





Jackson JSON 라이브러리 mapper.readTree 사용하기


JsonNode myJsonNode = mapper.readTree(myJson); // String myJson값을 Json형태로 바꿔서


Iterator itr = myJsonNode2.getElements(); // Iterator를 사용해 요소를 객체로 저장한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.io.IOException;
import java.util.Iterator;
 
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.node.ObjectNode;
 
public class JacksonTest {
 
    public static void main(String[] args) throws JsonProcessingException, IOException {
     ObjectMapper mapper = new ObjectMapper();
     String myJson = "{\"a\":1990, \"b\":\"b is string\", \"c\": [{\"d1\":\"d1 is string\"}, {\"d2\":\"d2 is string\"}]}";
     
     myJson1(mapper, myJson);
     myJson2(mapper, myJson);
     
    }
    
    // 1. mapper.readTree 사용하기 
    private static void myJson1(ObjectMapper mapper, String myJson) throws JsonProcessingException, IOException {
        JsonNode myJsonNode = mapper.readTree(myJson);
        System.out.println("myJsonNode1:"+myJsonNode); 
        // myJsonNode1:{"a":1990,"b":"b is string","c":[{"d1":"d1 is string"},{"d2":"d2 is string"}]}
 
        if (myJsonNode.isObject()) {
            ObjectNode obj = (ObjectNode) myJsonNode;
            if (obj.has("c")) {
                 JsonNode valueC= obj.get("c").get(0).get("d1");
                 System.out.println("valueC Text값: "+valueC.getTextValue()); // valueC Text값: d1 is string
            }
        }
    }
    // 2. mapper.readTree와 Iterator 사용하기 
    private static void myJson2(ObjectMapper mapper, String myJson) throws JsonProcessingException, IOException {
        JsonNode myJsonNode2 = mapper.readTree(myJson);
        System.out.println("myJsonNode2:"+myJsonNode2); 
        // myJsonNode2:{"a":1990,"b":"b is string","c":[{"d1":"d1 is string"},{"d2":"d2 is string"}]}
 
        Iterator itr = myJsonNode2.getElements();
        
        while( itr.hasNext()) {
            JsonNode obj = (JsonNode)itr.next(); 
            System.out.println(obj);
        }
    }
}
cs



[출력 결과]


myJsonNode1:{"a":1990,"b":"b is string","c":[{"d1":"d1 is string"},{"d2":"d2 is string"}]}

valueC Text값: d1 is string

myJsonNode2:{"a":1990,"b":"b is string","c":[{"d1":"d1 is string"},{"d2":"d2 is string"}]}

1990

"b is string"

[{"d1":"d1 is string"},{"d2":"d2 is string"}]



작업 방법


1. 해쉬맵 형태 Entity > ArrayList로 변환 


2. ArrayList에서 필요한 값에 대한 키에 접근 > 적절한 분기 처리하여 필요한 값에 대한 데이터를 추출 


3. 추출한 데이터를 다시 해쉬맵형태의 Entity에 키, 밸류로 넣음


4. 해쉬맵 형태의 엔티티를 ArrayList에 추가 > ArrayList를 해쉬맵 형태의 엔티티에 넣음



해쉬맵 형태로 들어가있는 Entity에서 ArrayList로 형 변환하여(ArrayList myArrList1 = EntityUtil.ResultSetToList(rslt);) 

담겨있는 데이터는 총 2개이다.


이 ArrayList 파람값에 접근해 값을 추출하여 새로운 키값을 만들어 값을 넣어주고 싶다.


1
2
3
4
5
6
7
8
9
10
[
    {reply_yn=N, inquiry_seq=265194, faq_ty1_nm=배송, mall_faq_ty_nm=매장상품, proc_dt=0.0, title_txt=테스트3, cancel_yn=N, user_nm=이상현, reply_ready=N, ord_store_nm=null, inquiry_dt2=2017-09-06 15:45:04, store_id=0075, inquiry_dt=2017-09-06, oos_yn=N, my_mall_faq_ty=63300, ord_store_id=null, user_id=20901762, r_num=1, faq_ty2_nm=미배송/수량부족, inquiry_kind=G, rownum=1, inquiry_txt=1234, reply_sms_update_dt=null, mod_dt=2017-09-06, basicreply_team=null, faq_ty1=63310, rating_cd=Brand-New, modstaff=null, ord_ty=인터넷, ord_no=100012934, mod_dt2=2017-09-06 15:45:04, reply_sms_yn=N, store_nm=잠실점, inquiry_img=null}
    {reply_yn=N, inquiry_seq=265193, faq_ty1_nm=주문, mall_faq_ty_nm=공통/기타, proc_dt=0.0, title_txt=테스트1, cancel_yn=N, user_nm=이상현, reply_ready=N, ord_store_nm=null, inquiry_dt2=2017-09-06 15:44:25, store_id=0075, inquiry_dt=2017-09-06, oos_yn=N
        , mall_ord_info= [
                        {"mart_style_type":"19030","god_nm":"프리미엄 물티슈 70매 캡형 10팩","mart_style_name":"[택배상품]","god_cnt":"0","trade_date":"2017.08.31","store_nm":"잠실점","ord_st":"결제완료","ord_no":"100011806"}
                       ,{"mart_style_type":"19020","god_nm":"[레고\/씨티(CITY)] 소방트럭과 보트 - 7213_레고코리아정품_BASIC \/ 1","mart_style_name":"[택배상품]","god_cnt":"0","trade_date":"2017.08.30","store_nm":"잠실점","ord_st":"상품준비중","ord_no":"100011660"}
                       ,{"mart_style_type":"19030","god_nm":"[순둥이]PC-01\/프리미엄 무향 플레인 물티슈 70매 캡형 10팩_BASIC \/ 1","mart_style_name":"[택배상품]","god_cnt":"0","trade_date":"2017.08.28","store_nm":"잠실점","ord_st":"주문취소","ord_no":"100011329"}
                 ]
        , my_mall_faq_ty=64100, ord_store_id=null, user_id=20901762, r_num=2, faq_ty2_nm=픽업/퀵배송 주문문의, inquiry_kind=G, rownum=2, inquiry_txt=테스트22, reply_sms_update_dt=null, mod_dt=2017-09-06, basicreply_team=null, faq_ty1=64140, rating_cd=Brand-New, modstaff=null, ord_ty=인터넷, ord_no=100011660, mod_dt2=2017-09-06 15:44:25, reply_sms_yn=N, store_nm=잠실점, inquiry_img=null}
]
cs




데이터가 저장되어있는 ArrayList의 이름은 myArrList1 이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public Entity selectInquiryExcelList(UserConnection conn, Entity param) throws SQLException {
    ArrayList myArrList1 = EntityUtil.ResultSetToList(rslt); // ArrayList 저장됨.
    ArrayList  queryArrayResult = new ArrayList();
    
    String mall_ord_info;
    String myData;
    
    for (int i = 0; i < myArrList1.size(); i++) { // ArrayList 크기만큼 돌리고
        Entity myArrListInfoEntity = new Entity();
        myArrListInfoEntity = (Entity)myArrList1.get(i); // ArrayList[0~N]  
        myData = myArrListInfoEntity.getString("reply_yn"); //  myData = ArrayList[0~N].reply_yn value(Y or N)
        mall_ord_info = myArrListInfoEntity.getString("mall_ord_info");  // mall_ord_info 컬럼 접근해서
        if(myData == 'N'){
            if(mall_ord_info.length() > 0){ // mall_ord_info 컬럼 안 Array 크기만큼 반복
                if(mall_ord_info.contains("store_nm")){
                    int myint1 =  mall_ord_info.indexOf("store_nm\":\"");
                    myint1 = myint1 + 11;
                    int myint2 =  mall_ord_info.indexOf("\",\"ord_st");
                    String myStringValue1 = mall_ord_info.substring(myint1,myint2); // 주문점포명에 대한 정보 얻어냄
                    myArrListInfoEntity.put("my_ord_info_store", myStringValue1); // 뽑아낸 주문점포명에 대한 데이터를 Entity안에 다시 해쉬맵 형태의 Key, Value 형태로 넣어줌
                }                      
            }                    
        }
        queryArrayResult.add(myArrListInfoEntity); // add를 사용해 Entity 형태의 해쉬맵 데이터를 다시 ArrayList에 넣어줌.
        // 기존의 데이터에서 키와 밸류를 추가해 들어가게 된다.
    }
    _DATA.put("_DATA" , queryArrayResult);
    return _DATA
}
cs



ArrayList 크기만큼 반복하며 돌며 한 row안에 있는 값을 적절히 분기처리하여 indexOf와 substring을 사용해

값을 추출하고 추출한 데이터를 새로운 키값인 "my_ord_info_store" 의 Value로 넣어주고 있다.

해당 반복문이 종료되면 ArrayList 안에

my_ord_info_store 라는 Key로 추가되어 재정의된 ArrayList가 나오게 된다.


1
2
3
4
5
6
7
8
9
10
[
    {reply_yn=N, my_ord_info_store=잠실점, inquiry_seq=265194, faq_ty1_nm=배송, mall_faq_ty_nm=매장상품, proc_dt=0.0, title_txt=테스트3, cancel_yn=N, user_nm=이상현, reply_ready=N, ord_store_nm=null, inquiry_dt2=2017-09-06 15:45:04, store_id=0075, inquiry_dt=2017-09-06, oos_yn=N, my_mall_faq_ty=63300, ord_store_id=null, user_id=20901762, r_num=1, faq_ty2_nm=미배송/수량부족, inquiry_kind=G, rownum=1, inquiry_txt=1234, reply_sms_update_dt=null, mod_dt=2017-09-06, basicreply_team=null, faq_ty1=63310, rating_cd=Brand-New, modstaff=null, ord_ty=인터넷, ord_no=100012934, mod_dt2=2017-09-06 15:45:04, reply_sms_yn=N, store_nm=잠실점, inquiry_img=null}
    {reply_yn=N, my_ord_info_store=잠실점, inquiry_seq=265193, faq_ty1_nm=주문, mall_faq_ty_nm=공통/기타, proc_dt=0.0, title_txt=테스트1, cancel_yn=N, user_nm=이상현, reply_ready=N, ord_store_nm=null, inquiry_dt2=2017-09-06 15:44:25, store_id=0075, inquiry_dt=2017-09-06, oos_yn=N
        , mall_ord_info= [
                        {"mart_style_type":"19030","god_nm":"프리미엄 물티슈 70매 캡형 10팩","mart_style_name":"[택배상품]","god_cnt":"0","trade_date":"2017.08.31","store_nm":"잠실점","ord_st":"결제완료","ord_no":"100011806"}
                       ,{"mart_style_type":"19020","god_nm":"[레고\/씨티(CITY)] 소방트럭과 보트 - 7213_레고코리아정품_BASIC \/ 1","mart_style_name":"[택배상품]","god_cnt":"0","trade_date":"2017.08.30","store_nm":"잠실점","ord_st":"상품준비중","ord_no":"100011660"}
                       ,{"mart_style_type":"19030","god_nm":"[순둥이]PC-01\/프리미엄 무향 플레인 물티슈 70매 캡형 10팩_BASIC \/ 1","mart_style_name":"[택배상품]","god_cnt":"0","trade_date":"2017.08.28","store_nm":"잠실점","ord_st":"주문취소","ord_no":"100011329"}
                 ]
        , my_mall_faq_ty=64100, ord_store_id=null, user_id=20901762, r_num=2, faq_ty2_nm=픽업/퀵배송 주문문의, inquiry_kind=G, rownum=2, inquiry_txt=테스트22, reply_sms_update_dt=null, mod_dt=2017-09-06, basicreply_team=null, faq_ty1=64140, rating_cd=Brand-New, modstaff=null, ord_ty=인터넷, ord_no=100011660, mod_dt2=2017-09-06 15:44:25, reply_sms_yn=N, store_nm=잠실점, inquiry_img=null}
]
cs




Jquery each 함수 사용하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
_DATA = {_DATA=[{param_value1=N, param_value2=12345,
 param_value3=[{"param_value3_1": "1", "param_value3_2" : "2"},{"param_value3_1": "3", "param_value3_2" : "2"}]}
 
var myValue = "";
var myArray = new Array();
 
<c:forEach var="entity" items="${_DATA}">
var param_value3 =  "<c:out value="${entity.param_value3}" />";
param_value3 = param_value3.replace(/"/gi,'\"'); // json 파싱 위한 특수문자 변환
param_value3 = $.parseJSON(param_value3 ); // Json 파싱
 if($(param_value3).size() > 0){
    $.each(param_value3,function(key,val){ 
            if(val.param_value3_1 == "2"){
                return false // This mean is break
            }else {
                if((val.param_value3_2 == "2")){
                    myArray.push(val.param_value3_1); // Input value in array
                    myValue = Math.max.apply(null, myArray); // Max value in array
                    }  
                }             
    });
}
</c:forEach
cs


_DATA 안의 param값 안의 배열에 접근할때 each 함수를 사용하여 key를 통해 반복하여 해당 반복문을 실행할 수 있다.


return false는 each 함수 사용 시 break 역할을 한다.


return 의 경우 continue의 기능이다.


현재 배열에 값을 넣어 최대값을 뽑고 있다.






ORACLE WITH AS 사용방법 - 1 



1
2
3
4
5
6
7
8
9
10
11
-- [WITH 구문 사용방법]
 
WITH AA AS
 (SELECT ROWNUM, 'TEST1', SYSDATE
    FROM DUAL
  UNION ALL
  SELECT ROWNUM, 'TEST2', SYSDATE
    FROM DUAL
  UNION ALL
  SELECT ROWNUM, 'TEST3', SYSDATE FROM DUAL)
SELECT * FROM AA;
cs

출력 결과

 ROWNUM 'TEST1' SYSDATE

 1

 TEST1

 2017-07-25 오후 6:14:08

 1

 TEST2

 2017-07-25 오후 6:14:08

 1

 TEST3

 2017-07-25 오후 6:14:08




ORACLE WITH AS 사용방법 - 2 




1
2
3
4
5
6
7
8
9
10
11
12
13
 -- [WITH 구문(2개 SUB쿼리) 사용방법]
 
 WITH AA AS (SELECT ROWNUM AS SEQ
                             , 'TEST1' AS NAME
                             , SYSDATE 
                      FROM DUAL),
          BB AS (SELECT ROWNUM AS SEQ
                              , 'TEST2' AS NAME
                              , SYSDATE
                       FROM DUAL)  
         SELECT * 
           FROM AA, BB 
          WHERE AA.SEQ = BB.SEQ 
cs


출력 결과


 SEQ

 NAME

 SYSDATE

 SEQ_1

 NAME_1

 SYSDATE_1

 1

 TEST1

 2017-07-25 오후 6:16:53

 1

 TEST2

 2017-07-25 오후 6:16:53





ORACLE 데이터 컬럼 여러개로 나누기, 데이터 컬럼 줄내림(줄바꿈), 정규표현식 사용하기




1. ORACLE 정규표현식 사용해 하나의 한줄의 데이터컬럼을 여러개의 컬럼으로 나누기



1
2
3
4
5
6
7
8
9
10
-- 정규표현식 사용해 하나의 한줄의 데이터컬럼을 여러개의 컬럼으로 나누기
SELECT * 
  FROM (
        SELECT REGEXP_SUBSTR(HELLO,'[^~!]+',1,LEVEL)  AS MY_REGEXP
          FROM (
                    SELECT '안녕하세요~!반갑습니다.' AS HELLO FROM DUAL   
                   ) A
         CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(HELLO,'[^~!]+'))+1
           ) A
    WHERE A.MY_REGEXP IS NOT NULL
cs


출력 결과


 안녕하세요

 반갑습니다.




2. ORACLE REPLACE 함수, 개행문자 CHR(10) 사용해 한 컬럼의 데이터 값을 줄내리기(줄바꿈)




1
2
3
4
5
-- REPLACE 함수, 개행문자 CHR(10) 사용해 한 컬럼의 데이터 값을 줄내리기
SELECT REPLACE(A.HELLO,'~!',CHR(10))  AS MY_REGEXP
  FROM (
            SELECT '안녕하세요~!반갑습니다.' AS HELLO FROM DUAL   
        ) A
cs


출력 결과


안녕하세요

반갑습니다.



3. ORACLE REPLACE 함수 사용, <br> 태그 넣어 jsp에서 받아올때 한줄씩 내려서 받기



1
2
3
4
5
-- REPLACE 함수 사용, <br> 태그 넣어 jsp에서 받아올때 한줄씩 내려서 받기
SELECT REPLACE(A.HELLO,'~!','<br>')  AS MY_REGEXP
  FROM (
            SELECT '안녕하세요~!반갑습니다.' AS HELLO FROM DUAL   
        ) A
cs


출력 결과 


 안녕하세요<br>반갑습니다.




DECODE문은 두가지 유형으로 사용된다.


'조건', 'IF', TRUE, FALSE


'조건', 'IF1', TRUE, 'IF2', TRUE ,'IF3' TRUE



1
2
3
4
5
6
7
SELECT DECODE('조건2''조건1''결과1'
                                , '조건2', DECODE('조건2-1','조건2-2','결과2-1','결과2-2')
                                , '조건3''결과3')
   FROM DUAL
   
   -- 다음 DECODE문을 보면 IF1 TRUE1, IF2 TRUE2, IF3 TRUE3이 적용된것이고
   -- 조건2로 DECODE문을 보면 IF TRUE FALSE로 조건이 맞지 않아 FALSE로 접근한 것을 알 수 있다.
cs


실행결과


결과 2-2 가 나오는것을 확인할 수 있다.


DECODE문은 NVL과 NVL2의 문법형식을 합쳐놓은 것이라 생각하면 이해하기 쉽다.



1
2
3
SELECT NVL('컬럼값이NULL일때','TRUE')
         , NVL2('컬럼값이NULL일때','TRUE','FALSE')
  FROM DUAL
cs


CASE문과 비슷하지만 DECODE문은 더 복잡한 분기처리와 쿼리양을 줄일수 있다고 생각한다.  





무결성 제약조건 종류


NOT NULL : 해당 컬럼 값으로 NULL을 허용하지 않는다.

UNIQUE : 테이블 내에서 해당 컬럼 값은 항상 유일한 값을 갖는다.

PRIMARY KEY : NULL을 허용하지 않고 중복된 값을 허용하지 않는다. NOT NULL 조건과 UNIQUE 조건을 결합한 형태

FOREIGN KEY : 참조되는 테이블의 컬럼 값이 존재하면 허용한다.

CHECK : 저장 가능한 값의 범위나 조건을 지정하여 설정한 값만 허용한다.


1. NOT NULL



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- NOT NULL 제약조건
CREATE TABLE MY_EMP
       (
       EMPNO NUMBER(4NOT NULL
     , ENAME VARCHAR2(10)
     , JOB VARCHAR2(9)
     , DEPTNO NUMBER(2)
       );
       
-- 테이블 조회
SELECT * FROM MY_EMP;
 
-- INSERT 허용
INSERT INTO MY_EMP(EMPNO, ENAME, JOB, DEPTNO) VALUES (1NULL,'SALESMAN'10); 
-- INSERT 시 EMPNO NOT NULL 제약조건으로 허용불가
INSERT INTO MY_EMP(EMPNO, ENAME, JOB, DEPTNO) VALUES (NULLNULL,'SALESMAN'20); 
cs


2. UNIQUE 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- UNIQUE 제약조건
CREATE TABLE MY_EMP2
       (
       EMPNO NUMBER(4UNIQUE
     , ENAME VARCHAR2(10)
     , JOB VARCHAR2(9)
     , DEPTNO NUMBER(2)
       );
 
-- 테이블 조회
SELECT * FROM MY_EMP2;
 
-- INSERT 허용
INSERT INTO MY_EMP2(EMPNO, ENAME, JOB, DEPTNO) VALUES (1NULL,'SALESMAN'10); 
-- INSERT 시 EMPNO UNIQUE 제약조건으로 허용불가
INSERT INTO MY_EMP2(EMPNO, ENAME, JOB, DEPTNO) VALUES (1NULL,'SALESMAN'20); 
cs



3. PRIMARY KEY



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- PRIMARY KEY 제약조건
CREATE TABLE MY_EMP4
             (
             EMPNO NUMBER(4CONSTRAINT MY_EMP4_EMPNO_PK PRIMARY KEY
           , ENAMR VARCHAR2(10CONSTRAINT MY_EMP4_ENAME_NN NOT NULL
           , JOB VARCHAR(9)
           , DEPTNO NUMBER(2)
             ); 
             
-- 테이블 조회
SELECT * FROM MY_EMP4;
 
-- INSERT 허용
INSERT INTO MY_EMP4 VALUES(7499'ALLEN''SALESMAN'30);
-- INSERT 시 PRIMARY KEY 제약조건으로 허용불가
INSERT INTO MY_EMP4 VALUES (7499'JONES''MANAGER'20); 
cs



4. FOREIGN KEY



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- FOREIGN KEY 제약조건
CREATE TABLE MY_EMP5
             (
             EMPNO NUMBER(4CONSTRAINT MY_EMP5_EMPNO_PK PRIMARY KEY
           , ENAME VARCHAR2(10CONSTRAINT MY_EMP5_ENAME_NN NOT NULL
           , JOB VARCHAR(9)
           , DEPTNO NUMBER(2CONSTRAINT MY_EMP5_DEPTNO_FK REFERENCES DEPT(DEPTNO)
             ); 
                    
-- 테이블 조회
SELECT * FROM MY_EMP5;
                
-- INSERT 허용 
INSERT INTO MY_EMP5 VALUES(7499'ALLEN''SALESMAN'30);
-- INSERT 시 FOREIGN KEY 제약조건으로 허용불가
INSERT INTO MY_EMP5 VALUES(7566'JOENS''MANAGER'50); 
cs


+ Recent posts