저는 전에 데이터를 SELECT해와서 데이터가 0개면 INSERT하고, 있는 놈이면 해당 값을 업데이트 하는 식으로 했었는데요. 우연히 MERGE INTO라는 것을 알게 되었네요.

ORACLE에서만 되는 듯 하네요-_-; 9i이상에서만 된다고 하네요.

MERGE INTO의 목적은 어떤 테이블이나 뷰테이블을 해당 목표테이블과 합체(MERGE)하기 위한 목적인데요. 이걸 이용해서 데이터가 들어왔을 때 있는 데이터면 UPDATE하고, 없는 데이터면 INSERT하는 형태로도 쓰일 수 있습니다.

http://radiocom.kunsan.ac.kr/lecture/oracle/sql/merge.html
위에는 MERGE INTO를 잘 설명한 사이트네요.

여기서 조금 응용하면 원하는 대로 구현할 수 있습니다-_-;

MERGE INTO 테이블명  별칭
USING 대상테이블/뷰  별칭
ON 조인조건
WHEN MATCHED THEN
  UPDATE SET
   컬럼1=값1
   컬럼2=값2
WHEN NOT MATCHED THEN
  INSERT (컬럼1,컬럼2,...)
       VALUES(값1,값2,...);

MERGE INTO다음에 나오는 테이블명은 실제로 데이터가 들어가거나 업데이트 되는 테이블이구요.
USING 다음에 나오는 테이블명은 실제 데이터를 가져오거나 할 테이블이구요.
ON은 WHERE과 같은 조건문이죠.
WHEN MATCHED THEN은 매치되는게 있으면 UPDATE하라는 얘기구요.
WHEN NOT MATCHED THEN은 매치되는게 없으면 INSERT하게 되죠.

응용해봅시다.
[code]
           MERGE INTO INSERTTABLE
           USING DUAL
           ON (ID = 1)
           WHEN MATCHED THEN
           UPDATE SET
           DATA = 'idoori'
           WHEN NOT MATCHED THEN
           INSERT (ID, DATA)
           VALUES (1, 'mudchobo')
[/code]
INSERTTABLE이라는 곳에 USING은 DUAL이라고 했는데 DUAL은 dual은 1개의 레코드 만을 갖는 dummy 테이블이라고 합니다. select 1 from dual해버리면, 1이 나오죠. 대상테이블은 필요없으니 dual로 설정합니다.
ON에서 ID = 1은 ID가 1인게 만약 있으면, DATA부분을 idoori로 업데이트하고, 없으면 mudchobo로 넣게 되는겁니다.

아놔 별거 없는데 막 늘어썼네-_-;
 
Posted by 머드초보
,
 
사실 VARCHAR2타입에서 최대값을 뽑는거 자체가 바보같은 짓이지만-_-;
VARCHAR2타입은 말그대로 CHAR타입입니다. 그래서 문자열만 들어가야합니다.
근데, 이건뭐 설계를 다 VARCHAR으로 때려박아서 SEQ부분을 VARCHAR로 해놨더군요.
그래서 시퀀스하게 숫자를 관리하겠다고 얘기를 하더군요.

SEQ칼럼이 999가 최대값이면 INSERT할 때마다 1씩 증가해서 다음에 인서트를 할 때 1000가 되게 하라-_-;
이건 Number타입으로 AutoIncrement로 할 수 있고, Number타입이면 그냥 max함수써서 하면되는데-_-;

어쨌든, VARCHAR타입을 숫자로 바꿔줘야합니다.
TO_NUMBER라는 함수가 있습니다.

"ID",CHARNUMBER,GROUPID
2,10000,1
1,9999,1
3,10001,1
요런 데이터가 있다고 칩시다.
그럼,
select max(to_number(charnumber)) from chartonumber group by groupid
요렇게 때려주시면, MAX값을 추출합니다.

저게 보니까 ASCII 순서대로 하는건지는 잘 모르겠지만, 'MUDCHOBO'라는 문자를 넣어버리면, 쿼리가 안날려집니다-_-; ORA-01722: 수치가 부적합합니다 라는 에러가 뜨네요.

자.....이제 DB설계자를 막 욕합시다-_-;

 
Posted by 머드초보
,
 

심심해서 오라클을 설치해봤습니다-_-;

이거 상당히 좋네요. 잘 되어있어요 ^^ 인터넷에서 익스프레션에디션은 10g밖에 없네요.
10g를 설치했어요. 처음으로 해봤어요-_-;

설치하고 보니까 웹에서 db조작하는 프로그램(Application Express)이 8080포트를 쓰더라구요-_-;
톰캣도 디폴트로 8080을 쓰는데-_-; 같이 못 띄웁니다 ^^

둘중 하나 바꿔야하는데 오라클을 바꿔봅시다-_-;

시작->프로그램->ORACLE어쩌구->SQL명령줄 실행 을 클릭합니다.

[code]
SQL> connect
사용자명 입력: system
암호 입력:
연결되었습니다.
SQL>EXEC DBMS_XDB.SETHTTPPORT(원하는포트번호);
[/code]

SQL에서 그냥 저렇게 처주면 되더군요. 그리고 홈페이지 뜨게하는 URL파일을 수정하는데요.

C:\oraclexe\app\oracle\product\10.2.0\server\Database_homepage.url 이 있는데요.
이거 열어서 바뀐포트로 수정해주세요.
[code]
[InternetShortcut]
URL=http://127.0.0.1:바뀐포트/apex
[/code]

그리고 SQLPLUS에서 전체테이블을 검색하려면
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = '해당DBID';

해주면 되더군요-_-;

 
Posted by 머드초보
,