윈도우7 64bit ODBC를 사용하면서 32bit 응용프로그램에서 ODBC를 사용할 경우

"지정된 DSN은 드라이버와 응용프로그램 간 아키텍처 불일치를 포함합니다"

라는 오류 메시지를 발견하게 된다.

 

처리 방법
1. ODBC 32bit용을 설치한다.
2. C:\Windows\SysWOW64\odbcad32.exe를 실행한 후 ODBC 관리자에서 등록한다.


출처 : https://minwoohi.tistory.com/42

데이터 설계 및 표준화 작업할 때 논리 모델 작성 후 표준 용어 사전, 표준 도메인 사전에 따라  칼럼명, 데이터 타입을 엑셀에 입력한다. ERWIN에서 엑셀 파일을 통해 칼럼명 맵핑을 쉽게 할 수 있다.

ERWIN 파일 작성할 때 논리/물리 변환 가능한 타입으로 생성

속성명을 다음과 같이 작성한다.

속성명에 해당하는 칼럼명을 오른쪽 열에 입력

다른이름으로 저장해 CSV 파일 형식으로 저장. CSV 형식으로 변환할 수 없는 문자가 섞여있다는 식의 팝업 나타나면 확인 클릭해 생성.
▶ ERWIN 또한 한글 경로를 인식하지 못한다. 반드시 영어로 파일명 작성 후 저장

ERWIN - TOOLS -NAMES - Edit Naming Standards 클릭. 칼럼명 작명에 대한 규칙을 CSV 파일로 등록

GLOSSARY 탭에서 IMPORT 클릭 이후 생성한 CSV 파일 열기

다음과 같이 속성, 칼럼명을 가져오는 것 확인할 수 있다. 위 저장 버튼 클릭

Naming Standard Files 뜻하는 nsm 확장자로 파일 저장

생성한 파일을 등록시키는 절차.
Tools - Names - Model Naming Options 클릭

General 탭에 Use File 라디오버튼 체크 - Browse 클릭해 생성한 nsm 파일 등록

Name Mapping에 Attribute to Column 체크 후 OK

Logical을 Physical로 바꿔주면 다음과 같이 자동 매핑된 칼럼명이 ERD에 출력됨을 확인할 수 있다.
실무에서 수천개 이상의 속성을 사용하게 될 때 굉장히 유용할 것이다.


================================================================================================================



출처 : http://blog.naver.com/remebers/50095401683

보통 Logical 에서 한글명으로 작업을 하고 나면, Physical도 한글명으로 되어 있다.

하지만, 모델링 작업 한 것을 DBMS로 보내주려면 Physical을 영문명으로 변경해 줘야 한다.

 

ERwin에서는 NSM이라는 기능을 이용하여 영문명으로 변경해줄 수 있다.

 

1. 아래의 그림과 같이, ERwin 메뉴의 Tools > Names > Edit Naming Standards 를 클릭한다

 

 

 

2. 아래의 그림처럼 맨 밑의 Glossary 탭으로 이동한다.

    - Word/Words에는 한글명

    - Abbreviation 에는 영문 Full Name Or 약어

    - Alternate Abbreviation 에는 약어 Or 약어의 약어

  를 입력한다.

 

3. File > Save 클릭하면, *.nsm 으로 저장된다.

 

4. ERwin 에서는 낱단어 조합이 가능하다.

    - 예를들어, 부서가 dept이고, 코드가 code라고 정의 돼있으면, 부서코드라는 항목이 없더라도,

     부서와 코드가 조합하여, Column 명이 부서코드가 있으면 낱단어 조합이 되어 Deptcode 라고

     입력된다.

 

5. 낱단어 조합을 원치 않으면, Match whole words only에 체크하며 된다.

    - Export 누르면 엑셀형식인 CSV File인 *.csv 와, *.txt 형태로 export 할 수 있다.

    - import 는 csv 형식이나 txt로 작업한 문서를 nsm으로 import 할 수 있다.

 

 

6. 이렇게 만든 nsm 파일을 Tools > Names > Model Naming Options 에서 적용시켜 줄 수 있다.

 

 

7. General 탭에서 그림과 같이 Use File 로 선택하고, Browse를 클릭 한 다음, 저장 해 놓은 nsm 파일을 불러온다.

 

8. Name Mapping 탭으로 가서 그림과 같이 Use Gloss 부분에 Entity to Table, Attribute to Column에 체크한다.

 

9. 적용 하고 OK 누르면 Physical 영역에는 영문명으로 되어 있는 것을 확인 할 수 있다. 

 



10진수를 2진수로 변환

방법 1.

 

 

 SELECT REPLACE (MAX (SYS_CONNECT_BY_PATH (SIGN (BITAND (DECI, POWER (2, (TRUNC (LOG (2, DECI) + POWER (10, -20)) + 1 - LEVEL)))), ',')), ',') BIT
      FROM (SELECT 6 DECI FROM DUAL)
CONNECT BY POWER (2, LEVEL - 1) <= DECI


방법 2.

SELECT REPLACE (MAX (SYS_CONNECT_BY_PATH (BIT, ',')), ',') BIN
      FROM (    SELECT COUNT (*) OVER () - LEVEL + 1 LVL
                     , DECODE (TRUNC (DECI / POWER (2, LEVEL)), ROUND (DECI / POWER (2, LEVEL)), 0, 1) BIT
                  FROM (SELECT 7 DECI FROM DUAL)
            CONNECT BY POWER (2, LEVEL - 1) <= DECI)
START WITH LVL = 1
CONNECT BY PRIOR LVL = LVL - 1 




2진수를 10진수로 변환

SELECT SUM (SUBSTR (BIN, LEVEL, 1) * POWER (2, LENGTH (BIN) - LEVEL)) DECI
      FROM (SELECT 11101 BIN FROM DUAL)
CONNECT BY LEVEL <= LENGTH (BIN) 



======================================================================================================
======================================================================================================

10진수로 저장한 컬럼 1개의 값으로 체크박스 checked 설정

붉은색 : 컬럼값
파란색 : 체크박스 개수

첫번째 체크박스만 체크 : 1
두번째 체크박스만 체크 : 2
첫번째/두번째 체크박스만 체크 : 3
세번째 체크박스만 체크 : 4
첫번째/세번째 체크박스만 체크 : 5
두번째/세번째 체크박스만 체크 : 6
모든 체크박스 체크 : 7

SELECT REVERSE(LPAD(REPLACE (MAX (SYS_CONNECT_BY_PATH (SIGN (BITAND (DECI, POWER (2, (TRUNC (LOG (2, DECI) + POWER (10, -20)) + 1 - LEVEL)))), ',')), ','), 3, '0')) BIT
      FROM (SELECT 6 DECI FROM DUAL)
CONNECT BY POWER (2, LEVEL - 1) <= DECI 


======================================================================================================
======================================================================================================

Java에서 진수 변환

10진수를 2진수로 변환
Integer.toBinaryString(7)

10진수를 2진수로 변환시 공백 문자열로 채워서 (붉은색이 채워질 문자, 파란색이 자리수)
String.format("%010d", Integer.parseInt(Integer.toBinaryString(7)))

2진수를 10진수로 변환
Integer.valueOf("100", 2)



출처 : http://nday.tistory.com/entry/MySQL-51-UTF8에서-iOS5-이모티콘emoji-적용하기

참고 : http://stackoverflow.com/questions/13653712/java-sql-sqlexception-incorrect-string-value-xf0-x9f-x91-xbd-xf0-x9f
        http://www.fileformat.info/info/unicode/char/1f47d/index.htm
        http://www.fileformat.info/info/unicode/char/1f494/index.htm
        http://dev.mysql.com/doc/refman/5.6/en/charset-unicode-utf8mb4.html


1. 개요
이번 iOS가 iOS5로 업데이트되면서 이모티콘이 기본으로 추가되어 사용할 수 있게 되었습니다.
이모티콘을 추가하여 글을 작성하면 Incorrect string value (error code [1366]) 에러가 발생하는데요
원인은 현재 아임IN의 DB는 (MySQL 5.1 UTF-8(3Byte))로 되어 있으며, 추가된 이모티콘은 3Byte 영역을 벗어난 4Byte 영역에 포함되어 있기 때문입니다.
이러한 문제를 기존 프로세스 및 데이터에 영향을 주지 않고 빠르게 해결하기 위해 아래 제시한 방법 중 첫번째 방법을 적용하였습니다.
하지만 첫번째 방법은 새로운 이모티콘이 추가되면 소스코드에 추가된 이모티콘 코드를 추가해줘야 하는 이슈가 있습니다.
따라서 추후 MySQL 5.5 UTF8MB4(4Byte)로 변경하는게 맞다고 생각됩니다.

 

2. 해결방법
1) iOS5 에서 추가된 SMP영역의 UNICODE를 BMP 영역의 UNICODE로 변환.
- 장점 : Util 추가로 쉽게 적용할 수 있다.
- 단점 : Util을 추가해야 하며, 새로운 이모티콘이 추가될 경우 Util소스코드에 추가하는 작업이 필요하다.
- 참조
변환코드표(SoftBank 코드 사용) : http://unicode.org/~scherer/emoji4unicode/snapshot/utc.html

 

2) MySQL 5.1 UTF8(3Byte)을 MySQL 5.5 UTF8MB4(4Byte)로 변경.
- 장점 : 5.5로 변경 시 다른 추가 작업이 필요 없다.
- 단점 : 데이터가 많으면 이전 작업 시간이 많이 소요되며, MySQL 5.1과 5.5의 호환성 테스트가 필요하다.
- 참조
MySQL 5.1 UTF8(3Byte) : http://dev.mysql.com/doc/refman/5.1/en/charset-unicode.html
MySQL 5.5 UTF8MB4(4Byte) : http://dev.mysql.com/doc/refman/5.5/en/charset-unicode.html

 

- MySQL 버전에따른 Unicode 지원 범위 표.

Before MySQL 5.5 MySQL 5.5 and up
All Unicode 3.0 characters All Unicode 5.0 characters
No supplementary characters With supplementary characters
ucs2 character set, BMP only No change
utf8 character set for up to three bytes, BMP only No change
  New utf8mb4 character set for up to four bytes, BMP or supplemental
  New utf16 character set, BMP or supplemental
  New utf32 character set, BMP or supplemental

 

3) MySQL 5.1 유지하면서 해당 컬럼을 VARBINARY로 변환하고, SELECT 시 CAST(%컬럼명% AS CHAR(사이즈) CHARSET UTF8) 형태로 조회.
- 장점 : MySQL 버전 변경 없이 적용 가능하며, 새로운 이모티콘이 추가되어도 추가작업이 없다.
- 단점 : 조회 SQL구문에 수정이 필요하며, 기존 데이터를 VARBINARY로 변환 시 데이터가 변경될 수 있어 확인이 필요하다.
- 참조
MySQL 5.1 VARBINARY : http://dev.mysql.com/doc/refman/5.1/en/binary-varbinary.html

 

3. 예제 (iOS5 에서 추가된 SMP영역의 UNICODE를 BMP 영역의 UNICODE로 변환)

package com.paran.test.util;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * @author 1sec, NDay
 *
 * @see http://unicode.org/~scherer/emoji4unicode/snapshot/utc.html
 * @see http://java.sun.com/developer/technicalArticles/Intl/Supplementary
 * @see MySQL 5.1 UTF8(3Byte):
 *      http://dev.mysql.com/doc/refman/5.1/en/charset-unicode.html
 * @see MySQL 5.5 UTF8MB4(4Byte):
 *      http://dev.mysql.com/doc/refman/5.5/en/charset-unicode.html
 *
 */
public class EmojiUtil {

	private static final Log log = LogFactory.getLog(EmojiUtil.class);

	public static int UNICODE_4_0_EX_START = 0x10000;
	public static int UNICODE_4_0_EX_END = 0x10FFFF;

	/*
	 * NOTE
	 *
	 * BMP (Basic Multilingual Plane)
	 *
	 * SMP (Supplementary Multilingual Plane)
	 */
	private static int EMOJI_TYPE_BMP_2_CHAR = -1;
	private static int EMOJI_TYPE_SMP_2_CHAR = -2;

	private static Map emoji = new HashMap();
	private static Map emoji2 = new HashMap();
	private static Map emojiSMP2 = new HashMap();
	private static Map emojiBMP2 = new HashMap();

	/**
	 * SMP to BMP convert Map
	 * */
	static {
		emoji.put(0x1F300, 0xE443);
		emoji.put(0x1F302, 0xE43C);
		emoji.put(0x1F303, 0xE44B);
		emoji.put(0x1F304, 0xE04D);
		emoji.put(0x1F305, 0xE449);
		emoji.put(0x1F306, 0xE146);
		emoji.put(0x1F307, 0xE44A);
		emoji.put(0x1F308, 0xE44C);
		emoji.put(0x1F309, 0xE44B);
		emoji.put(0x1F30A, 0xE43E);
		emoji.put(0x1F30C, 0xE44B);
		emoji.put(0x1F314, 0xE04C);
		emoji.put(0x1F313, 0xE04C);
		emoji.put(0x1F319, 0xE04C);
		emoji.put(0x1F31B, 0xE04C);
		emoji.put(0x1F31F, 0xE335);
		emoji.put(0x1F550, 0xE024);
		emoji.put(0x1F551, 0xE025);
		emoji.put(0x1F552, 0xE026);
		emoji.put(0x1F553, 0xE027);
		emoji.put(0x1F554, 0xE028);
		emoji.put(0x1F555, 0xE029);
		emoji.put(0x1F556, 0xE02A);
		emoji.put(0x1F557, 0xE02B);
		emoji.put(0x1F558, 0xE02C);
		emoji.put(0x1F559, 0xE02D);
		emoji.put(0x1F55A, 0xE02E);
		emoji.put(0x1F55B, 0xE02F);
		emoji.put(0x1F340, 0xE110);
		emoji.put(0x1F337, 0xE304);
		emoji.put(0x1F331, 0xE110);
		emoji.put(0x1F341, 0xE118);
		emoji.put(0x1F338, 0xE030);
		emoji.put(0x1F339, 0xE032);
		emoji.put(0x1F342, 0xE119);
		emoji.put(0x1F343, 0xE447);
		emoji.put(0x1F33A, 0xE303);
		emoji.put(0x1F33B, 0xE305);
		emoji.put(0x1F334, 0xE307);
		emoji.put(0x1F335, 0xE308);
		emoji.put(0x1F33E, 0xE444);
		emoji.put(0x1F33C, 0xE305);
		emoji.put(0x1F33F, 0xE110);
		emoji.put(0x1F34E, 0xE345);
		emoji.put(0x1F34A, 0xE346);
		emoji.put(0x1F353, 0xE347);
		emoji.put(0x1F349, 0xE348);
		emoji.put(0x1F345, 0xE349);
		emoji.put(0x1F346, 0xE34A);
		emoji.put(0x1F34F, 0xE345);
		emoji.put(0x1F440, 0xE419);
		emoji.put(0x1F442, 0xE41B);
		emoji.put(0x1F443, 0xE41A);
		emoji.put(0x1F444, 0xE41C);
		emoji.put(0x1F445, 0xE409);
		emoji.put(0x1F484, 0xE31C);
		emoji.put(0x1F485, 0xE31D);
		emoji.put(0x1F486, 0xE31E);
		emoji.put(0x1F487, 0xE31F);
		emoji.put(0x1F488, 0xE320);
		emoji.put(0x1F466, 0xE001);
		emoji.put(0x1F467, 0xE002);
		emoji.put(0x1F468, 0xE004);
		emoji.put(0x1F469, 0xE005);
		emoji.put(0x1F46B, 0xE428);
		emoji.put(0x1F46E, 0xE152);
		emoji.put(0x1F46F, 0xE429);
		emoji.put(0x1F471, 0xE515);
		emoji.put(0x1F472, 0xE516);
		emoji.put(0x1F473, 0xE517);
		emoji.put(0x1F474, 0xE518);
		emoji.put(0x1F475, 0xE519);
		emoji.put(0x1F476, 0xE51A);
		emoji.put(0x1F477, 0xE51B);
		emoji.put(0x1F478, 0xE51C);
		emoji.put(0x1F47B, 0xE11B);
		emoji.put(0x1F47C, 0xE04E);
		emoji.put(0x1F47D, 0xE10C);
		emoji.put(0x1F47E, 0xE12B);
		emoji.put(0x1F47F, 0xE11A);
		emoji.put(0x1F480, 0xE11C);
		emoji.put(0x1F481, 0xE253);
		emoji.put(0x1F482, 0xE51E);
		emoji.put(0x1F483, 0xE51F);
		emoji.put(0x1F40D, 0xE52D);
		emoji.put(0x1F40E, 0xE134);
		emoji.put(0x1F414, 0xE52E);
		emoji.put(0x1F417, 0xE52F);
		emoji.put(0x1F42B, 0xE530);
		emoji.put(0x1F418, 0xE526);
		emoji.put(0x1F428, 0xE527);
		emoji.put(0x1F412, 0xE528);
		emoji.put(0x1F411, 0xE529);
		emoji.put(0x1F419, 0xE10A);
		emoji.put(0x1F41A, 0xE441);
		emoji.put(0x1F41B, 0xE525);
		emoji.put(0x1F420, 0xE522);
		emoji.put(0x1F421, 0xE019);
		emoji.put(0x1F424, 0xE523);
		emoji.put(0x1F425, 0xE523);
		emoji.put(0x1F426, 0xE521);
		emoji.put(0x1F423, 0xE523);
		emoji.put(0x1F427, 0xE055);
		emoji.put(0x1F429, 0xE052);
		emoji.put(0x1F41F, 0xE019);
		emoji.put(0x1F42C, 0xE520);
		emoji.put(0x1F42D, 0xE053);
		emoji.put(0x1F42F, 0xE050);
		emoji.put(0x1F431, 0xE04F);
		emoji.put(0x1F433, 0xE054);
		emoji.put(0x1F434, 0xE01A);
		emoji.put(0x1F435, 0xE109);
		emoji.put(0x1F436, 0xE052);
		emoji.put(0x1F437, 0xE10B);
		emoji.put(0x1F43B, 0xE051);
		emoji.put(0x1F439, 0xE524);
		emoji.put(0x1F43A, 0xE52A);
		emoji.put(0x1F42E, 0xE52B);
		emoji.put(0x1F430, 0xE52C);
		emoji.put(0x1F438, 0xE531);
		emoji.put(0x1F43E, 0xE536);
		emoji.put(0x1F43D, 0xE10B);
		emoji.put(0x1F620, 0xE059);
		emoji.put(0x1F629, 0xE403);
		emoji.put(0x1F632, 0xE410);
		emoji.put(0x1F61E, 0xE058);
		emoji.put(0x1F635, 0xE406);
		emoji.put(0x1F630, 0xE40F);
		emoji.put(0x1F612, 0xE40E);
		emoji.put(0x1F60D, 0xE106);
		emoji.put(0x1F624, 0xE404);
		emoji.put(0x1F61C, 0xE105);
		emoji.put(0x1F61D, 0xE409);
		emoji.put(0x1F60B, 0xE056);
		emoji.put(0x1F618, 0xE418);
		emoji.put(0x1F61A, 0xE417);
		emoji.put(0x1F637, 0xE40C);
		emoji.put(0x1F633, 0xE40D);
		emoji.put(0x1F603, 0xE057);
		emoji.put(0x1F606, 0xE40A);
		emoji.put(0x1F601, 0xE404);
		emoji.put(0x1F602, 0xE412);
		emoji.put(0x1F60A, 0xE056);
		emoji.put(0x1F604, 0xE415);
		emoji.put(0x1F622, 0xE413);
		emoji.put(0x1F62D, 0xE411);
		emoji.put(0x1F628, 0xE40B);
		emoji.put(0x1F623, 0xE406);
		emoji.put(0x1F621, 0xE416);
		emoji.put(0x1F60C, 0xE40A);
		emoji.put(0x1F616, 0xE407);
		emoji.put(0x1F614, 0xE403);
		emoji.put(0x1F631, 0xE107);
		emoji.put(0x1F62A, 0xE408);
		emoji.put(0x1F60F, 0xE402);
		emoji.put(0x1F613, 0xE108);
		emoji.put(0x1F625, 0xE401);
		emoji.put(0x1F62B, 0xE406);
		emoji.put(0x1F609, 0xE405);
		emoji.put(0x1F63A, 0xE057);
		emoji.put(0x1F638, 0xE404);
		emoji.put(0x1F639, 0xE412);
		emoji.put(0x1F63D, 0xE418);
		emoji.put(0x1F63B, 0xE106);
		emoji.put(0x1F63F, 0xE413);
		emoji.put(0x1F63E, 0xE416);
		emoji.put(0x1F63C, 0xE404);
		emoji.put(0x1F640, 0xE403);
		emoji.put(0x1F645, 0xE423);
		emoji.put(0x1F646, 0xE424);
		emoji.put(0x1F647, 0xE426);
		emoji.put(0x1F64B, 0xE012);
		emoji.put(0x1F64C, 0xE427);
		emoji.put(0x1F64D, 0xE403);
		emoji.put(0x1F64E, 0xE416);
		emoji.put(0x1F64F, 0xE41D);
		emoji.put(0x1F3E0, 0xE036);
		emoji.put(0x1F3E1, 0xE036);
		emoji.put(0x1F3E2, 0xE038);
		emoji.put(0x1F3E3, 0xE153);
		emoji.put(0x1F3E5, 0xE155);
		emoji.put(0x1F3E6, 0xE14D);
		emoji.put(0x1F3E7, 0xE154);
		emoji.put(0x1F3E8, 0xE158);
		emoji.put(0x1F3E9, 0xE501);
		emoji.put(0x1F3EA, 0xE156);
		emoji.put(0x1F3EB, 0xE157);
		emoji.put(0x1F3EC, 0xE504);
		emoji.put(0x1F3EF, 0xE505);
		emoji.put(0x1F3F0, 0xE506);
		emoji.put(0x1F3ED, 0xE508);
		emoji.put(0x1F3EE, 0xE30B);
		emoji.put(0x1F5FB, 0xE03B);
		emoji.put(0x1F5FC, 0xE509);
		emoji.put(0x1F5FD, 0xE51D);
		emoji.put(0x1F45E, 0xE007);
		emoji.put(0x1F45F, 0xE007);
		emoji.put(0x1F460, 0xE13E);
		emoji.put(0x1F461, 0xE31A);
		emoji.put(0x1F462, 0xE31B);
		emoji.put(0x1F463, 0xE536);
		emoji.put(0x1F455, 0xE006);
		emoji.put(0x1F451, 0xE10E);
		emoji.put(0x1F454, 0xE302);
		emoji.put(0x1F452, 0xE318);
		emoji.put(0x1F457, 0xE319);
		emoji.put(0x1F458, 0xE321);
		emoji.put(0x1F459, 0xE322);
		emoji.put(0x1F45A, 0xE006);
		emoji.put(0x1F45C, 0xE323);
		emoji.put(0x1F4B0, 0xE12F);
		emoji.put(0x1F4B1, 0xE149);
		emoji.put(0x1F4B9, 0xE14A);
		emoji.put(0x1F4B2, 0xE12F);
		emoji.put(0x1F4B5, 0xE12F);
		emoji.put(0x1F525, 0xE11D);
		emoji.put(0x1F528, 0xE116);
		emoji.put(0x1F52B, 0xE113);
		emoji.put(0x1F52E, 0xE23E);
		emoji.put(0x1F52F, 0xE23E);
		emoji.put(0x1F530, 0xE209);
		emoji.put(0x1F531, 0xE031);
		emoji.put(0x1F489, 0xE13B);
		emoji.put(0x1F48A, 0xE30F);
		emoji.put(0x1F170, 0xE532);
		emoji.put(0x1F171, 0xE533);
		emoji.put(0x1F18E, 0xE534);
		emoji.put(0x1F17E, 0xE535);
		emoji.put(0x1F380, 0xE314);
		emoji.put(0x1F381, 0xE112);
		emoji.put(0x1F382, 0xE34B);
		emoji.put(0x1F384, 0xE033);
		emoji.put(0x1F385, 0xE448);
		emoji.put(0x1F38C, 0xE143);
		emoji.put(0x1F386, 0xE117);
		emoji.put(0x1F388, 0xE310);
		emoji.put(0x1F389, 0xE312);
		emoji.put(0x1F38D, 0xE436);
		emoji.put(0x1F38E, 0xE438);
		emoji.put(0x1F393, 0xE439);
		emoji.put(0x1F392, 0xE43A);
		emoji.put(0x1F38F, 0xE43B);
		emoji.put(0x1F387, 0xE440);
		emoji.put(0x1F390, 0xE442);
		emoji.put(0x1F383, 0xE445);
		emoji.put(0x1F391, 0xE446);
		emoji.put(0x1F4DE, 0xE009);
		emoji.put(0x1F4F1, 0xE00A);
		emoji.put(0x1F4F2, 0xE104);
		emoji.put(0x1F4DD, 0xE301);
		emoji.put(0x1F4E0, 0xE00B);
		emoji.put(0x1F4E8, 0xE103);
		emoji.put(0x1F4E9, 0xE103);
		emoji.put(0x1F4EA, 0xE101);
		emoji.put(0x1F4EB, 0xE101);
		emoji.put(0x1F4EE, 0xE102);
		emoji.put(0x1F4E2, 0xE142);
		emoji.put(0x1F4E3, 0xE317);
		emoji.put(0x1F4E1, 0xE14B);
		emoji.put(0x1F4E6, 0xE112);
		emoji.put(0x1F4E7, 0xE103);
		emoji.put(0x1F4BA, 0xE11F);
		emoji.put(0x1F4BB, 0xE00C);
		emoji.put(0x1F4BC, 0xE11E);
		emoji.put(0x1F4BD, 0xE316);
		emoji.put(0x1F4BE, 0xE316);
		emoji.put(0x1F4BF, 0xE126);
		emoji.put(0x1F4C0, 0xE127);
		emoji.put(0x1F4C3, 0xE301);
		emoji.put(0x1F4C4, 0xE301);
		emoji.put(0x1F4D3, 0xE148);
		emoji.put(0x1F4D6, 0xE148);
		emoji.put(0x1F4D4, 0xE148);
		emoji.put(0x1F4D5, 0xE148);
		emoji.put(0x1F4D7, 0xE148);
		emoji.put(0x1F4D8, 0xE148);
		emoji.put(0x1F4D9, 0xE148);
		emoji.put(0x1F4DA, 0xE148);
		emoji.put(0x1F4CB, 0xE301);
		emoji.put(0x1F4CA, 0xE14A);
		emoji.put(0x1F4C8, 0xE14A);
		emoji.put(0x1F4C7, 0xE148);
		emoji.put(0x1F4D2, 0xE148);
		emoji.put(0x1F4D1, 0xE301);
		emoji.put(0x1F3BE, 0xE015);
		emoji.put(0x1F3BF, 0xE013);
		emoji.put(0x1F3C0, 0xE42A);
		emoji.put(0x1F3C1, 0xE132);
		emoji.put(0x1F3C3, 0xE115);
		emoji.put(0x1F3C4, 0xE017);
		emoji.put(0x1F3C6, 0xE131);
		emoji.put(0x1F3C8, 0xE42B);
		emoji.put(0x1F3CA, 0xE42D);
		emoji.put(0x1F683, 0xE01E);
		emoji.put(0x1F687, 0xE434);
		emoji.put(0x1F684, 0xE435);
		emoji.put(0x1F685, 0xE01F);
		emoji.put(0x1F697, 0xE01B);
		emoji.put(0x1F699, 0xE42E);
		emoji.put(0x1F68C, 0xE159);
		emoji.put(0x1F68F, 0xE150);
		emoji.put(0x1F6A2, 0xE202);
		emoji.put(0x1F689, 0xE039);
		emoji.put(0x1F680, 0xE10D);
		emoji.put(0x1F6A4, 0xE135);
		emoji.put(0x1F695, 0xE15A);
		emoji.put(0x1F69A, 0xE42F);
		emoji.put(0x1F692, 0xE430);
		emoji.put(0x1F691, 0xE431);
		emoji.put(0x1F693, 0xE432);
		emoji.put(0x1F17F, 0xE14F);
		emoji.put(0x1F6A5, 0xE14E);
		emoji.put(0x1F6A7, 0xE137);
		emoji.put(0x1F6A8, 0xE432);
		emoji.put(0x1F3A1, 0xE124);
		emoji.put(0x1F3A2, 0xE433);
		emoji.put(0x1F3A3, 0xE019);
		emoji.put(0x1F3A4, 0xE03C);
		emoji.put(0x1F3A5, 0xE03D);
		emoji.put(0x1F3A6, 0xE507);
		emoji.put(0x1F3A7, 0xE30A);
		emoji.put(0x1F3A8, 0xE502);
		emoji.put(0x1F3A9, 0xE503);
		emoji.put(0x1F3AB, 0xE125);
		emoji.put(0x1F3AC, 0xE324);
		emoji.put(0x1F3AD, 0xE503);
		emoji.put(0x1F004, 0xE12D);
		emoji.put(0x1F3AF, 0xE130);
		emoji.put(0x1F3B0, 0xE133);
		emoji.put(0x1F3B1, 0xE42C);
		emoji.put(0x1F3B5, 0xE03E);
		emoji.put(0x1F3B6, 0xE326);
		emoji.put(0x1F3B7, 0xE040);
		emoji.put(0x1F3B8, 0xE041);
		emoji.put(0x1F3BA, 0xE042);
		emoji.put(0x1F3BC, 0xE326);
		emoji.put(0x1F4F7, 0xE008);
		emoji.put(0x1F4F9, 0xE03D);
		emoji.put(0x1F4FA, 0xE12A);
		emoji.put(0x1F4FB, 0xE128);
		emoji.put(0x1F4FC, 0xE129);
		emoji.put(0x1F48B, 0xE003);
		emoji.put(0x1F48D, 0xE034);
		emoji.put(0x1F48E, 0xE035);
		emoji.put(0x1F48F, 0xE111);
		emoji.put(0x1F490, 0xE306);
		emoji.put(0x1F491, 0xE425);
		emoji.put(0x1F492, 0xE43D);
		emoji.put(0x1F51E, 0xE207);
		emoji.put(0x1F4F6, 0xE20B);
		emoji.put(0x1F4F3, 0xE250);
		emoji.put(0x1F4F4, 0xE251);
		emoji.put(0x1F354, 0xE120);
		emoji.put(0x1F359, 0xE342);
		emoji.put(0x1F370, 0xE046);
		emoji.put(0x1F35C, 0xE340);
		emoji.put(0x1F35E, 0xE339);
		emoji.put(0x1F373, 0xE147);
		emoji.put(0x1F366, 0xE33A);
		emoji.put(0x1F35F, 0xE33B);
		emoji.put(0x1F361, 0xE33C);
		emoji.put(0x1F358, 0xE33D);
		emoji.put(0x1F35A, 0xE33E);
		emoji.put(0x1F35D, 0xE33F);
		emoji.put(0x1F35B, 0xE341);
		emoji.put(0x1F362, 0xE343);
		emoji.put(0x1F363, 0xE344);
		emoji.put(0x1F371, 0xE34C);
		emoji.put(0x1F372, 0xE34D);
		emoji.put(0x1F367, 0xE43F);
		emoji.put(0x1F374, 0xE043);
		emoji.put(0x1F378, 0xE044);
		emoji.put(0x1F37A, 0xE047);
		emoji.put(0x1F375, 0xE338);
		emoji.put(0x1F376, 0xE30B);
		emoji.put(0x1F377, 0xE044);
		emoji.put(0x1F37B, 0xE30C);
		emoji.put(0x1F379, 0xE044);
		emoji.put(0x1F493, 0xE327);
		emoji.put(0x1F494, 0xE023);
		emoji.put(0x1F495, 0xE327);
		emoji.put(0x1F496, 0xE327);
		emoji.put(0x1F497, 0xE328);
		emoji.put(0x1F498, 0xE329);
		emoji.put(0x1F499, 0xE32A);
		emoji.put(0x1F49A, 0xE32B);
		emoji.put(0x1F49B, 0xE32C);
		emoji.put(0x1F49C, 0xE32D);
		emoji.put(0x1F49D, 0xE437);
		emoji.put(0x1F49E, 0xE327);
		emoji.put(0x1F49F, 0xE204);
		emoji.put(0x1F6AC, 0xE30E);
		emoji.put(0x1F6AD, 0xE208);
		emoji.put(0x1F6B2, 0xE136);
		emoji.put(0x1F6B6, 0xE201);
		emoji.put(0x1F6B9, 0xE138);
		emoji.put(0x1F6BA, 0xE139);
		emoji.put(0x1F6C0, 0xE13F);
		emoji.put(0x1F6BB, 0xE151);
		emoji.put(0x1F6BD, 0xE140);
		emoji.put(0x1F6BE, 0xE309);
		emoji.put(0x1F6BC, 0xE13A);
		emoji.put(0x1F192, 0xE214);
		emoji.put(0x1F194, 0xE229);
		emoji.put(0x1F195, 0xE212);
		emoji.put(0x1F197, 0xE24D);
		emoji.put(0x1F199, 0xE213);
		emoji.put(0x1F19A, 0xE12E);
		emoji.put(0x1F201, 0xE203);
		emoji.put(0x1F202, 0xE228);
		emoji.put(0x1F233, 0xE22B);
		emoji.put(0x1F235, 0xE22A);
		emoji.put(0x1F236, 0xE215);
		emoji.put(0x1F21A, 0xE216);
		emoji.put(0x1F237, 0xE217);
		emoji.put(0x1F238, 0xE218);
		emoji.put(0x1F239, 0xE227);
		emoji.put(0x1F22F, 0xE22C);
		emoji.put(0x1F23A, 0xE22D);
		emoji.put(0x1F250, 0xE226);
		emoji.put(0x1F4A1, 0xE10F);
		emoji.put(0x1F4A2, 0xE334);
		emoji.put(0x1F4A3, 0xE311);
		emoji.put(0x1F4A4, 0xE13C);
		emoji.put(0x1F4A6, 0xE331);
		emoji.put(0x1F4A7, 0xE331);
		emoji.put(0x1F4A8, 0xE330);
		emoji.put(0x1F4A9, 0xE05A);
		emoji.put(0x1F4AA, 0xE14C);
		emoji.put(0x1F4AB, 0xE407);
		emoji.put(0x1F534, 0xE219);
		emoji.put(0x1F535, 0xE21A);
		emoji.put(0x1F532, 0xE21A);
		emoji.put(0x1F533, 0xE21B);
		emoji.put(0x1F536, 0xE21B);
		emoji.put(0x1F537, 0xE21B);
		emoji.put(0x1F538, 0xE21B);
		emoji.put(0x1F539, 0xE21B);
		emoji.put(0x1F50A, 0xE141);
		emoji.put(0x1F50D, 0xE114);
		emoji.put(0x1F50E, 0xE114);
		emoji.put(0x1F512, 0xE144);
		emoji.put(0x1F513, 0xE145);
		emoji.put(0x1F50F, 0xE144);
		emoji.put(0x1F510, 0xE144);
		emoji.put(0x1F511, 0xE03F);
		emoji.put(0x1F514, 0xE325);
		emoji.put(0x1F519, 0xE235);
		emoji.put(0x1F51D, 0xE24C);
		emoji.put(0x1F44A, 0xE00D);
		emoji.put(0x1F44D, 0xE00E);
		emoji.put(0x1F446, 0xE22E);
		emoji.put(0x1F447, 0xE22F);
		emoji.put(0x1F448, 0xE230);
		emoji.put(0x1F449, 0xE231);
		emoji.put(0x1F44B, 0xE41E);
		emoji.put(0x1F44F, 0xE41F);
		emoji.put(0x1F44C, 0xE420);
		emoji.put(0x1F44E, 0xE421);
		emoji.put(0x1F450, 0xE422);

		// SMILING FACE WITH OPEN MOUTH AND COLD SWEAT
		emoji.put(0x1F605, EMOJI_TYPE_BMP_2_CHAR);
		// LOVE LETTER
		emoji.put(0x1F48C, EMOJI_TYPE_BMP_2_CHAR);

		// NATIONAL FLAG
		emoji.put(0x1F1E8, EMOJI_TYPE_SMP_2_CHAR);
		emoji.put(0x1F1E9, EMOJI_TYPE_SMP_2_CHAR);
		emoji.put(0x1F1EA, EMOJI_TYPE_SMP_2_CHAR);
		emoji.put(0x1F1EB, EMOJI_TYPE_SMP_2_CHAR);
		emoji.put(0x1F1EC, EMOJI_TYPE_SMP_2_CHAR);
		emoji.put(0x1F1EE, EMOJI_TYPE_SMP_2_CHAR);
		emoji.put(0x1F1EF, EMOJI_TYPE_SMP_2_CHAR);
		emoji.put(0x1F1F0, EMOJI_TYPE_SMP_2_CHAR);
		emoji.put(0x1F1F7, EMOJI_TYPE_SMP_2_CHAR);
		emoji.put(0x1F1FA, EMOJI_TYPE_SMP_2_CHAR);

		// NATIONAL FLAG
		emojiSMP2.put(0x1F1E8 + "" + 0x1F1F3, 0xE513);
		emojiSMP2.put(0x1F1E9 + "" + 0x1F1EA, 0xE50E);
		emojiSMP2.put(0x1F1EA + "" + 0x1F1F8, 0xE511);
		emojiSMP2.put(0x1F1EB + "" + 0x1F1F7, 0xE50D);
		emojiSMP2.put(0x1F1EC + "" + 0x1F1E7, 0xE510);
		emojiSMP2.put(0x1F1EE + "" + 0x1F1F9, 0xE50F);
		emojiSMP2.put(0x1F1EF + "" + 0x1F1F5, 0xE50B);
		emojiSMP2.put(0x1F1F0 + "" + 0x1F1F7, 0xE514);
		emojiSMP2.put(0x1F1F7 + "" + 0x1F1FA, 0xE512);
		emojiSMP2.put(0x1F1FA + "" + 0x1F1F8, 0xE50C);

		emojiBMP2.put(0x1F605, new Integer[] { 0xE415, 0xE331 });
		emojiBMP2.put(0x1F48C, new Integer[] { 0xE103, 0xE328 });

		// no use icon key
		// emoji3.put(0x1F1E8, );
		// emoji3.put(0x1F1E9, );
		// emoji3.put(0x1F1EA, );
		// emoji3.put(0x1F1EB, );
		// emoji3.put(0x1F1EC, );
		// emoji3.put(0x1F1EE, );
		// emoji3.put(0x1F1EF, );
		// emoji3.put(0x1F1F0, );
		// emoji3.put(0x1F1F7, );
		// emoji3.put(0x1F1FA, );

		// emoji3.put(0x0023, );
		// emoji3.put(0x0031, );
		// emoji3.put(0x0032, );
		// emoji3.put(0x0033, );
		// emoji3.put(0x0034, );
		// emoji3.put(0x0035, );
		// emoji3.put(0x0036, );
		// emoji3.put(0x0037, );
		// emoji3.put(0x0038, );
		// emoji3.put(0x0039, );
		// emoji3.put(0x0030, );
	}

	public static String toHexString(int org, int padding) {
		StringBuffer buff = new StringBuffer();
		buff.append(Integer.toHexString(org).toUpperCase());
		for (int i = buff.length(); i BMP converted string
	 * */
	public static String convertSMP2BMP(String org) {
		StringBuffer buff = new StringBuffer();

		if (org != null) {
			StringBuffer logData = null;

			if (log.isDebugEnabled()) {
				logData = new StringBuffer();
			}

			int key = 0, val = 0;
			int key2 = 0, val2 = 0;
			Integer val3[] = null;

			for (int i = 0, size = org.length(); i = UNICODE_4_0_EX_START)
						&& (key = UNICODE_4_0_EX_START)
							&& (key2 <= UNICODE_4_0_EX_END)) {
						i++;
					}

					if (log.isDebugEnabled()) {
						logData.append(", key2=").append(toHexString(key2))
								.append(", val=").append(toHexString(val2));
					}

					buff.append((char) val2);
				}
				else if (val == EMOJI_TYPE_BMP_2_CHAR) {
					// BMP 중 예외 이모티콘, 2개의 문자조합.
					if ((val3 = emojiBMP2.get(key)) != null) {
						for (int j = 0, size2 = val3.length; j < size2; j++) {
							if (log.isDebugEnabled()) {
								logData.append(", val").append(j).append("=")
										.append(toHexString(val3[j]));
							}

							buff.append((char) ((int) val3[j]));
						}
					}
				}
				else {
					if (log.isDebugEnabled()) {
						logData.append(", val=").append(toHexString(val));
					}

					buff.append((char) val);
				}

				if (log.isDebugEnabled()) {
					log.debug(logData);
				}
			}
		}

		return buff.toString();
	}

	public static void main(String[] args) throws Exception {
		// test code
		String tmp = "1230\u5b66\ud83d\ude30\ud83d\ude25\ud83d\ude31\ud83d\ude05\ud83c\udde8\ud83c\uddf3";

		System.out.println("TRACE, EmojiUtil.main(), [" + convertSMP2BMP(tmp)
				+ "]");
	}
}



 

참고 : http://intomysql.blogspot.kr/2011/01/join-update-multiple-table-update.html
         http://intomysql.blogspot.kr/2011/01/join-delete-multiple-table-delete.html


1. JOIN으로 여러 테이블 한번에 DELETE (DELETE와 FROM 절 사이에 삭제할 테이블 명시)

DELETE A, B, C
   FROM USER A
   LEFT JOIN USER_PHOTO B
               ON A.USER_ID = B.USER_ID
   LEFT JOIN USER_TOPIC C
              ON A.USER_ID = C.USER_ID
 WHERE A.USER_ID = 'test'

 
1-1. JOIN으로 여러 테이블 한번에 DELETE (FROM과 USING 절 사이에 삭제할 테이블 명시)
     - A, B 테이블만 삭제되고 C 테이블은 JOIN에만 참여

DELETE FROM A, B
  USING USER A INNER JOIN USER_PHOTO B INNER JOIN USER_TOPIC C
 WHERE A.USER_ID = B.USER_ID
     AND A.USER_ID = C.USER_ID
    AND A.USER_ID = 'test'





2. JOIN 으로 테이블 UPDATE
     - 두 테이블이 USER_ID로 JOIN 후 B테이블의 SOURCE_COL 값이 A테이블 TARGET_COL로 업데이트 된다.

UPDATE USER A, USER_PHOTO B
      SET A.TARGET_COL = B.SOURCE_COL
 WHERE A.USER_ID = B.USER_ID



 2-1. JOIN 으로 여러 테이블 한번에 UPDATE
    - 두 테이블이 USER_ID로 JOIN 후 B테이블의 SOURCE_COL 값이 A테이블 TARGET_COL로 업데이트 되고 A테이블의 SOURCE_COL 값이 B테이블 TARGET_COL로 업데이트 된다.

UPDATE USER A, USER_PHOTO B
      SET A.TARGET_COL = B.SOURCE_COL
          , B.TARGET_COL = A.SOURCE_COL
 WHERE A.USER_ID = B.USER_ID



 2-2. JOIN 으로 여러 테이블 한번에 UPDATE
   - 두 테이블이 USER_ID로 JOIN 후 B테이블의 SOURCE_COL 값이 A테이블 TARGET_COL로 업데이트 되고 A테이블의 SOURCE_COL 값이 B테이블 TARGET_COL로 업데이트 된다.

UPDATE USER A JOIN USER_PHOTO B
      ON A.USER_ID = B.USER_ID
      SET A.TARGET_COL = B.SOURCE_COL
          , B.TARGET_COL = A.SOURCE_COL
 WHERE A.USER_ID = 'TEST'



 

http://code.google.com/p/sqlyog/downloads/list


간만에 MySQL을 사용할 일이 있어 SQLyog를 다운받으러 Webyog 사이트를 뒤져보는데 다운로드 페이지에 무료 버전이 보이지 않는 것이다!! 그리고 처음 보는 30일 평가판이 보였다.


Google Code SQLyog Community Edition (http://code.google.com/p/sqlyog/downloads/list)


SQLyog는 Trial이 아닌 Community Edition이 무료버전이었다. 
사이트 검색을 해보니 Community Edition은 Webyog에서 호스팅하지 않는다는 답변이 있다.


1. ROWNUM 구현하기

 SELECT @RNUM := @RNUM + 1 AS RNUM
            , A.*
    FROM 테이블 A
           , (SELECT @RNUM := 0) B



2. ROW_NUMBER(PARTITION BY ...) 구현하기

참고 : http://www.explodybits.com/2011/11/mysql-row-number/

ROW_NUMBER(PARTITION BY 컬럼1 ORDER BY 컬럼2)

SELECT @ROW_NUM := IF(@PREV_VALUE = A.컬럼1, @ROW_NUM + 1, 1) AS ROW_NUMBER
          , @PREV_VALUE := A.컬럼1
          , A.*
  FROM 테이블 A
         , (SELECT @ROW_NUM := 1) X
         , (SELECT @PREV_VALUE := '') Y
 ORDER BY A.컬럼2

-- 참고 샘플
SELECT  @row_num := IF(@prev_value=o.Customer,@row_num+1,1) AS RowNumber
       ,o.Customer
       ,o.OrderDate
       ,o.Amount
       ,@prev_value := o.Customer
  FROM Orders o,
      (SELECT @row_num := 1) x,
      (SELECT @prev_value := '') y
  ORDER BY o.Customer, o.OrderDate DESC



 



 

시스템 테이블 사용 (MASTER.DBO.SPT_VALUES)

SELECT CONVERT(VARCHAR, DATEADD(D, NUMBER, '20120115'), 112) DATE
FROM MASTER..SPT_VALUES
WHERE TYPE = 'P'
AND NUMBER <= DATEDIFF(D, '20130115', '20130122')

 

RECURSIVE 를 사용

WITH A AS (
 SELECT LVL = 1
   , CAST('20130115' AS DATETIME) DT
 UNION ALL
 SELECT LVL + 1
   , DATEADD(D, 1, DT)
   FROM A
  WHERE DT < CAST('20130122' AS DATETIME)
)
SELECT LVL
  , DT
  , YEAR = DATEPART(YEAR, DT)
  , MONTH = DATEPART(MONTH, DT)
  , DAY = DATEPART(DAY, DT)
  , WEEK_OF_YEAR = DATEPART(WK, DT)
  , WEEK_OF_MONTH = DATEPART(WK, DT) - DATEPART(WK, LEFT(CONVERT(VARCHAR, DT, 112), 6) + '01') + 1
  , DAY = DATEPART(DW, DT)
  , 요일 = DATENAME(W, DT)
  , 분기 = DATEPART(Q, DT)
  , 반기 = CASE WHEN DATEPART(MONTH, DT) BETWEEN 1 AND 6 THEN '상반기' ELSE '하반기' END
  FROM A
OPTION (MAXRECURSION 0) 

 

휴일테이블의 휴일과 토/일요일 일자만 조회

 휴일테이블
INSERT INTO PIS_HOLIDAY (HOLI_DATE, HOLI_DESC) VALUES ('99990101', '신정');
INSERT INTO PIS_HOLIDAY (HOLI_DATE, HOLI_DESC) VALUES ('9999016', '테스트');
INSERT INTO PIS_HOLIDAY (HOLI_DATE, HOLI_DESC) VALUES ('20130117', '창립기념일');

WITH A AS (
 SELECT CAST('20130115' AS DATETIME) DT
 UNION ALL
 SELECT DATEADD(D, 1, DT)
   FROM A
  WHERE DT < CAST('20130122' AS DATETIME)
), B AS (
 SELECT CAST('20130115' AS DATETIME) DT
   , LVL = 1
 UNION ALL
 SELECT DATEADD(YEAR, 1, DT)
   , LVL + 1
   FROM B
  WHERE LVL <= DATEDIFF(YEAR, '20130115', '20130122')
), C AS (
 SELECT HOLI_DATE
   , HOLI_DESC
      FROM (
   SELECT SUBSTRING(CONVERT(VARCHAR, B.DT, 112), 1, 4) + SUBSTRING(A.HOLI_DATE, 5, 4) HOLI_DATE
     , A.HOLI_DESC
     FROM PIS_HOLIDAY A
     , B
    WHERE A.HOLI_DATE LIKE '9999%'
   ) A
  WHERE HOLI_DATE BETWEEN '20130115' AND '20130122'
)
SELECT HOLI_DATE
  , MAX(CASE WHEN GUBUN = 1 THEN HOLI_DESC ELSE DATENAME(W, HOLI_DATE) END) HOLI_DESC
  FROM (
 SELECT 1 GUBUN
   , HOLI_DATE
   , HOLI_DESC
   FROM PIS_HOLIDAY
     WHERE HOLI_DATE BETWEEN '20130115' AND '20130122'
 UNION ALL
 SELECT 1
   , HOLI_DATE
   , HOLI_DESC
   FROM C
 UNION ALL
 SELECT 2
   , CONVERT(VARCHAR, DT, 112)
   , NULL
   FROM A
  WHERE DATEPART(DW, DT) IN (1, 7)
  ) A
 GROUP BY HOLI_DATE
OPTION (MAXRECURSION 0) 

 

 

 

프로시저 생성

ALTER PROCEDURE [dbo].[SP_LEGACY_INS]
--ALTER PROCEDURE [dbo].[SP_LEGACY_INS]
    @LOG_SYSTEM VARCHAR(10),
    @LOG_MODE VARCHAR(2),
    @LOG_USER VARCHAR(20),
    @LOG_NAME VARCHAR(40),
    @LOG_PRG VARCHAR(40),
    @LOG_PRG_NAME VARCHAR(100),
    @LOG_FIELD VARCHAR(2),
    @LOG_IP VARCHAR(30),
    @LOG_DATA VARCHAR(100),
    @O_CODE INT OUTPUT,
    @O_MSG VARCHAR(255) OUTPUT
AS
BEGIN

    SET @O_CODE = 0
    SET @O_MSG = '정상 처리 되었습니다.'
   
    IF @LOG_SYSTEM IS NULL OR @LOG_SYSTEM = ''
        BEGIN
            SET @O_CODE = -101
            SET @O_MSG = '시스템명은 필수 입력항목입니다.'
        END
    ELSE IF @LOG_MODE IS NULL OR @LOG_MODE = ''
        BEGIN
            SET @O_CODE = -102
            SET @O_MSG = '접근모드는 필수 입력항목입니다.'
        END
    ELSE IF @LOG_USER IS NULL OR @LOG_USER = ''
        BEGIN
            SET @O_CODE = -103
            SET @O_MSG = '접근사용자ID는 필수 입력항목입니다.'
        END
    ELSE IF @LOG_NAME IS NULL OR @LOG_NAME = ''
        BEGIN
            SET @O_CODE = -104
            SET @O_MSG = '접근사용자명은 필수 입력항목입니다.'
        END
    ELSE IF @LOG_PRG IS NULL OR @LOG_PRG = ''
        BEGIN
            SET @O_CODE = -105
            SET @O_MSG = '접근프로그램ID는 필수 입력항목입니다.'
        END   
    ELSE IF @LOG_PRG_NAME IS NULL OR @LOG_PRG_NAME = ''
        BEGIN
            SET @O_CODE = -106
            SET @O_MSG = '접근프로그램명은 필수 입력항목입니다.'
        END
    ELSE IF @LOG_FIELD IS NULL OR @LOG_FIELD = ''
        BEGIN
            SET @O_CODE = -107
            SET @O_MSG = '접근개인정보는 필수 입력항목입니다.'
        END
    ELSE IF @LOG_IP IS NULL OR @LOG_IP = ''
        BEGIN
            SET @O_CODE = -108
            SET @O_MSG = '접근IP는 필수 입력항목입니다.'
        END

    ELSE
        BEGIN
            /*
            BEGIN TRY
                SELECT CONVERT(DATETIME, @LOG_DATE)
            END TRY

            BEGIN CATCH
                SET @O_CODE = -202
                SET @O_MSG = '로그 일자(YYYYMMDD)를 다시 확인해 주세요.'
            END CATCH

            BEGIN TRY
                SELECT CONVERT(DATETIME, @LOG_TIME)
            END TRY

            BEGIN CATCH
                SET @O_CODE = -203
                SET @O_MSG = '로그 시간(HH24:MI:SS)를 다시 확인해 주세요.'
            END CATCH
            */
           
            INSERT INTO PIS_LEGACY (LOG_SYSTEM, LOG_DATE, LOG_TIME, LOG_MODE, LOG_USER, LOG_NAME, LOG_PRG, LOG_PRG_NAME, LOG_FIELD, LOG_IP, LOG_DATA)
            VALUES
            (@LOG_SYSTEM, CONVERT(VARCHAR, GETDATE(), 112), CONVERT(VARCHAR, GETDATE(), 108), @LOG_MODE, @LOG_USER, @LOG_NAME, @LOG_PRG, @LOG_PRG_NAME, @LOG_FIELD, @LOG_IP, @LOG_DATA)
        END
END 


프로시저 실행

DECLARE
@O_CODE1 INT,
@O_MSG1 VARCHAR(255)
BEGIN
    EXEC SP_LEGACY_INS 'PIS', 'C', 'kdn100', '홍길동', 'PID10', 'VPN - 신청', '1', '127.0.0.1', '123456-1234567', @O_CODE1 OUTPUT, @O_MSG1 OUTPUT
    SELECT @O_CODE1, @O_MSG1
END 


자바에서 프로시저 실행

import java.io.File;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Types;
import java.util.Properties;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ProcedureTest {

    private final static Logger log = LoggerFactory.getLogger(ProcedureTest.class);
    private Connection conn;
    
    private void conn() throws Exception {
        String filePath = getClass().getResource("db.properties").getPath();
        File file = new File(filePath);
        if(file.exists()) {
            Properties prop = new Properties();
            prop.load(LegacyBatchBackup.class.getResourceAsStream("db.properties"));
            Class.forName(prop.getProperty("ewppis.mssql.driver"));
            String url = prop.getProperty("ewppis.mssql.url") + ";user=" + prop.getProperty("ewppis.mssql.user") + ";password=" + prop.getProperty("ewppis.mssql.password") + ";";
            conn = DriverManager.getConnection(url);
        } else {
            log.error("DB 접속정보가 없습니다.");
        }
    }
    
    @Test
    public void test1() throws Exception {
        
        CallableStatement cstmt = null;
        try {
            conn();
            String sql = "{CALL SP_LEGACY_INS(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}";
            cstmt = conn.prepareCall(sql);
            cstmt.setString(1, "PIS");
            cstmt.setString(2, "C");
            cstmt.setString(3, "admin");
            cstmt.setString(4, "이순신");
            cstmt.setString(5, "PID10");
            cstmt.setString(6, "VPN - 신청");
            cstmt.setString(7, "1");
            cstmt.setString(8, "127.0.0.1");
            cstmt.setString(9, "123456-1234567");
            cstmt.registerOutParameter(10, Types.INTEGER);
            cstmt.registerOutParameter(11, Types.VARCHAR);
            cstmt.executeUpdate();
            
            log.debug("return : {}", cstmt.getString(10));
            log.debug("return : {}", cstmt.getString(11));
            
        } catch (Exception e) {
            
        } finally {
            if(cstmt != null) cstmt.close();
            if(conn != null) conn.close();
        }
    }
}


Detect language » Korean


SYS_CONNHECT_BY_PATH 에 ESC (ASCII 27) 문자를 구분자로 처리할 경우


ORA-30003: illegal parameter in SYS_CONNECT_BY_PATH function

이런 에러가 발생한다.


특수문자를 사용할 경우 아래처럼 처리할 수 있다.


Sample

SELECT CHR(27) FROM DUAL -- ASCII 코드로 문자 확인

SELECT RAWTOHEX ('') FROM DUAL  -- HEX 코드 확인

SELECT UNISTR('\001B') FROM DUAL  -- HEX 코드를 유니코드로 변환


WITH TB1 AS (
SELECT 1 COL1, NULL COL2 FROM DUAL
UNION ALL
SELECT 2, 1 FROM DUAL
UNION ALL
SELECT 3, 1 FROM DUAL
UNION ALL
SELECT 4, 2 FROM DUAL
UNION ALL
SELECT 5, 2 FROM DUAL
UNION ALL
SELECT 6, 3 FROM DUAL
)
SELECT PATH1
          , TRANSLATE(PATH1, '_', '_') PATH2
          , TRANSLATE(PATH1, '_' || CHR(27), '_') PATH3
          , REPLACE(PATH2, CHR(27), ' > ') PATH4
          , PATH3 PATH5
          , REPLACE(PATH3, CHR(10), ' > ') PATH6
          , REGEXP_SUBSTR(PATH1, '[^]+', 1, 1) CODE1
          , REGEXP_SUBSTR(PATH1, '[^'||CHR(27)||']+', 1, 2) CODE2
          , REGEXP_SUBSTR(PATH1, '[^'||CHR(27)||']+', 1, 3) CODE3
FROM (
        SELECT SYS_CONNECT_BY_PATH(COL1, '') PATH1
                  , SUBSTR(SYS_CONNECT_BY_PATH(COL1, ''), 2) PATH2
                  , SUBSTR(SYS_CONNECT_BY_PATH(COL1, '
'), 2) PATH3
          FROM TB1
         START WITH COL2 IS NULL
         CONNECT BY PRIOR COL1 = COL2
         ORDER SIBLINGS BY COL1)


 

XML 에서 ESC 문자 출력

참고 : http://www.dpawson.co.uk/xsl/sect2/N3353.html
HTML ISO-8859-1 참고 : http://blog.naver.com/tyboss/70152845514

<character code="27"/>

 
Java 에서 ESC 문자 출력

char esc = '\u001B';
char esc2 = 27;


 

+ Recent posts