오라클에서 &등의 문자를 Insert하거나 Update하려고 하면 문제가 발생한다.
이 경우 간단하게 set define off명령을 통해 처리할 수 있다.

예를 들어 아래와 같은 sql은 수행되지 않는다.
UPDATE adm_amq_info
   SET amq_uri =
          'tcp://127.0.0.1:61616?AsyncConnect=true&initialReconnectDelay=100&maxReconnectDelay=1000'
 WHERE amq_typ = 'yt' AND amq_nm = 'message';

Insert하려는 문자열 속에 특수문자가 있기 때문이다. (마크된 특수 문자들...)
'tcp://127.0.0.1:61616?AsyncConnect=true&initialReconnectDelay=100&maxReconnectDelay=1000'

이러한 White Space가 포함된 SQL문을 수행하기위해서
Set Define명령을 통해 sql에 있는 특수문자를 일시적으로 무시하도록 하면 된다.
Set Define off
UPDATE adm_amq_info
   SET amq_uri =
          'tcp://172.21.3.81:61616?AsyncConnect=true&AsyncTimeout=3000&initialReconnectDelay=100&maxReconnectDelay=1000'
 WHERE amq_typ = 'yt' AND amq_nm = 'message';


실행하려는 sql문 앞에만 set define off를 써주면 되고,
그 줄에만 효력이 발생하므로 다시 set define on 등을 할 필요는 없다.

Google AdSense

'끄적끄적 > Programming' 카테고리의 다른 글

[XNA] FPS측정을 통한 BenchMark  (2) 2011.03.18
[.NET] Windows.Form 윈도 이벤트 발생 순서  (0) 2011.03.16
[XNA] XNA 흐름  (0) 2010.05.17
[Oracle] 순위함수 Rank()  (2) 2009.12.21
[.NET] LC.EXE 오류와 해결책  (11) 2009.06.08


1. Main함수 (Progarm.cs)
2. Game1 (Game1.cs)
3. Initialize함수 (Game1.cs)
4. LoadContent 함수 (Game1.cs)
5. Update (Game1.cs)
6. Draw (Game1.cs)
---종료시
7. UnloadContent (Game1.cs)

괄호속의 파일명은 Visual Studio에서 프로젝트만들기를 통해 생성된 것을 기준

1 -> 2 -> 3 -> 4 -> (5 -> 6 -> -종료시까지 무한반복-> 5 -> 6) -> 7

Google AdSense
참으로 오랜만의 포스팅이다 ^_~@

개발할 때 DB 데이터를 표현하게되면 항상 고민되는 것이...
범용적인 표준SQL을 쓰느냐,
Oracle이나 MS-SQL에 최적화된 쿼리를 쓰느냐이다.

처음에는 Oracle위에 올려서 개발을 했지만, 차후에 MS-SQL위에 올려서 써야할 때가 있다.
사용자가 Oracle이나 MS-SQL 중 한쪽을 죽어라 고집하면,
어쩔 수 없이 바꿔주는 수밖에 없지않는가 ㅡㅜ

왠만하면 표준 SQL만 쓰려고 하지만...
복잡한 통계작업이나 수치계산, String 조합 등의 작업을 할때는 어쩔 수 없이 DBMS의 전용 함수를 쓸 수 밖에 없다.

이번엔 Oracle의 순위함수를 쓰는 일이다.
(물론 MS_-SQL에도 동일한 함수가 있다)

아래와 같은 사원 평점 테이블이 있다고 치고,
인사 관계자가 이 평점값들을 토대로 사원 평가 순위를 매기는 업무를 한다고 가정해보자.
SELECT 부서, 성명, 평점
    FROM (
        SELECT '홍길동' 성명, '영업' 부서, 55 평점 FROM DUAL
            UNION ALL
        SELECT '일지매' 성명, '영업' 부서, 60 평점 FROM DUAL
            UNION ALL
        SELECT '마동탁' 성명, '영업' 부서, 96 평점 FROM DUAL
            UNION ALL
        SELECT '오해성' 성명, '영업' 부서, 87 평점 FROM DUAL
            UNION ALL
        SELECT '한비광' 성명, '물류' 부서, 62 평점 FROM DUAL
            UNION ALL
        SELECT '나루토' 성명, '물류' 부서, 62 평점 FROM DUAL
            UNION ALL
        SELECT '이세경' 성명, '물류' 부서, 92 평점 FROM DUAL
            UNION ALL
        SELECT '권유리' 성명, '물류' 부서, 81 평점 FROM DUAL
    )
====결과====


[평점순으로 순위를 매겨서 나열하기 #1]
여기서 평점이 제일 높은 사람을 찾는 것은 간단하다.
간단히 Order By만 넣으면 될 것이다.

SELECT 부서, 성명, 평점, ROWNUM 순위
FROM (

    SELECT 부서, 성명, 평점
        FROM (
            SELECT '홍길동' 성명, '영업' 부서, 55 평점 FROM DUAL
                UNION ALL
            SELECT '일지매' 성명, '영업' 부서, 60 평점 FROM DUAL
                UNION ALL
            SELECT '마동탁' 성명, '영업' 부서, 96 평점 FROM DUAL
                UNION ALL
            SELECT '오해성' 성명, '영업' 부서, 87 평점 FROM DUAL
                UNION ALL
            SELECT '한비광' 성명, '물류' 부서, 62 평점 FROM DUAL
                UNION ALL
            SELECT '나루토' 성명, '물류' 부서, 62 평점 FROM DUAL
                UNION ALL
            SELECT '이세경' 성명, '물류' 부서, 92 평점 FROM DUAL
                UNION ALL
            SELECT '권유리' 성명, '물류' 부서, 81 평점 FROM DUAL
        )
        ORDER BY 평점 DESC
)


====결과====


간단하지 아니한가?
그런데 동점자를 고려해서 순위를 표시하고,
경우에 따라서 부서별로 나눠서보고 부서별 순위를 표시한다고 했을때...
좀 복잡해 진다. GROUP BY가 들어가고 JOIN을 하고 난리가 난다.

이럴땐 아래와 같이 RANK()라는 함수로 간략하게 표현을 할 수가 있다.

[평점순으로 순위를 매겨서 나열하기 #2]
Order by로 Sort를 하고 다시 외부 Select문을 만드는 번거로움을 생략하기 위해
Rank()함수를 쓰면 아래와 같이 나타난다.
SELECT 부서, 성명, 평점
    ,RANK() OVER(ORDER BY 평점 DESC ) 순위
    FROM (
        SELECT '홍길동' 성명, '영업' 부서, 55 평점 FROM DUAL
            UNION ALL
        SELECT '일지매' 성명, '영업' 부서, 60 평점 FROM DUAL
            UNION ALL
        SELECT '마동탁' 성명, '영업' 부서, 96 평점 FROM DUAL
            UNION ALL
        SELECT '오해성' 성명, '영업' 부서, 87 평점 FROM DUAL
            UNION ALL
        SELECT '한비광' 성명, '물류' 부서, 62 평점 FROM DUAL
            UNION ALL
        SELECT '나루토' 성명, '물류' 부서, 62 평점 FROM DUAL
            UNION ALL
        SELECT '이세경' 성명, '물류' 부서, 92 평점 FROM DUAL
            UNION ALL
        SELECT '권유리' 성명, '물류' 부서, 81 평점 FROM DUAL
    )

====결과====

Order By를 따로 할것도 없이 Rank() Over()절에서 사용된 순위에 따라 표시되니 간편하기도 하다.
뭐, 어짜피 Where 조건을 통해 값을 뽑은후 Order by를 하는 것이기 때문에
전통적인 Order by절이나 Rank() Over()나 내부적으로는 비슷한 논리로 작동할 것이라 생각이 된다.

그런데 위의 결과를 보면 5위가 2명이라서 6위가 없다는 것을 알 수 있다.

[평점순으로 순위를 매겨서 나열하기 #3]
그럼 공동순위를 무시하고 6위를 표시하려면 어떻게 해야 할까?
그럴땐 RANK()가 아니라 DENSE_RANK()를 쓰면 된다.
영어 Dense의 뜻 그대로 빠진 숫자없이 촘촘한 랭킹이라고 이해하면 될려나 ^^;;
SELECT 부서, 성명, 평점
    ,DENSE_RANK() OVER(ORDER BY 평점 DESC ) 공통_순위
    FROM (
        SELECT '홍길동' 성명, '영업' 부서, 55 평점 FROM DUAL
            UNION ALL
        SELECT '일지매' 성명, '영업' 부서, 60 평점 FROM DUAL
            UNION ALL
        SELECT '마동탁' 성명, '영업' 부서, 96 평점 FROM DUAL
            UNION ALL
        SELECT '오해성' 성명, '영업' 부서, 87 평점 FROM DUAL
            UNION ALL
        SELECT '한비광' 성명, '물류' 부서, 62 평점 FROM DUAL
            UNION ALL
        SELECT '나루토' 성명, '물류' 부서, 62 평점 FROM DUAL
            UNION ALL
        SELECT '이세경' 성명, '물류' 부서, 92 평점 FROM DUAL
            UNION ALL
        SELECT '권유리' 성명, '물류' 부서, 81 평점 FROM DUAL
    )

====결과====


그런데 전체순위말고, 특정한 Group별로 순위를 매길려면 어떻게 해야할까요?
먼저 떠오르는 것은 Group By 절이다.
하지만, Rank()함수는 Group By를 대신하는 Partition이라는 옵션을 제공하고 있기에
간단히 나타낼 수 있다.

[평점순으로 순위를 매겨서 나열하기 #4]
부서를 기준으로 Partition을 나누어 주면 된다.
SELECT 부서, 성명, 평점
    RANK() OVER( PARTITION BY 부서 ORDER BY 평점 DESC ) 부서별순위
    FROM (
        SELECT '홍길동' 성명, '영업' 부서, 55 평점 FROM DUAL
            UNION ALL
        SELECT '일지매' 성명, '영업' 부서, 60 평점 FROM DUAL
            UNION ALL
        SELECT '마동탁' 성명, '영업' 부서, 96 평점 FROM DUAL
            UNION ALL
        SELECT '오해성' 성명, '영업' 부서, 87 평점 FROM DUAL
            UNION ALL
        SELECT '한비광' 성명, '물류' 부서, 62 평점 FROM DUAL
            UNION ALL
        SELECT '나루토' 성명, '물류' 부서, 62 평점 FROM DUAL
            UNION ALL
        SELECT '이세경' 성명, '물류' 부서, 92 평점 FROM DUAL
            UNION ALL
        SELECT '권유리' 성명, '물류' 부서, 81 평점 FROM DUAL
    )

====결과====


그럼 (성능은 나락으로 떨어질 것이 불 보듯 뻔하지만) 전체순위와 각 부서별 순위를 함께 표시하면 어떻게 될까?

[평점순으로 순위를 매겨서 나열하기 #5]
SELECT 부서, 성명, 평점
    ,DENSE_RANK() OVER(ORDER BY 평점 DESC ) 전체_순위
    ,DENSE_RANK() OVER( PARTITION BY 부서 ORDER BY 평점 DESC ) 부서별순위

    FROM (
        SELECT '홍길동' 성명, '영업' 부서, 55 평점 FROM DUAL
            UNION ALL
        SELECT '일지매' 성명, '영업' 부서, 60 평점 FROM DUAL
            UNION ALL
        SELECT '마동탁' 성명, '영업' 부서, 96 평점 FROM DUAL
            UNION ALL
        SELECT '오해성' 성명, '영업' 부서, 87 평점 FROM DUAL
            UNION ALL
        SELECT '한비광' 성명, '물류' 부서, 62 평점 FROM DUAL
            UNION ALL
        SELECT '나루토' 성명, '물류' 부서, 62 평점 FROM DUAL
            UNION ALL
        SELECT '이세경' 성명, '물류' 부서, 92 평점 FROM DUAL
            UNION ALL
        SELECT '권유리' 성명, '물류' 부서, 81 평점 FROM DUAL
    )

====결과====

당연하겠지만,
앞에서 선언한 Rank()의 값에 의해 1차 Sorting이 되고, 뒤의 Rank()값에 따라 2차 Sorting이 된다.

Oracle의 함수를 봤지만,
MS_-SQL에도 이와 유사한 동일한 함수가 생겼으니, 혹시 모른다면 컨버젼을 대비해서 함께 알아두는 것도 좋을 것 같다.


PS. 어쩌다 블로그글들을 보면 예전에 내가 썼던 글을 인용해서 만든 포스트가 보이기도 한다.
이미 오래전에 닫아버린 블로그지만, 그곳의 링크를 걸어두신 분도 있고... ^^
알량한 지식이나마 다른 개발자들이나 학생들과 공유를 했다는 사실에 뿌듯하다 ^^

PS2. 다만, 포스트 서두에 적혀있는 나의 이런저런 경험이나 상황마저 마치 자신의 것인양 옮겨담은 블로거도 간혹있네요.
그런건 좀 낮뜨거우니 좀 빼주세요 ㅡㅜ
Google AdSense

"LC.exe"이(가) -1코드에서 끝났습니다.
"LC.exe"이(가) 0524522 오류를 발생하였습니다.
.....
Visual Studio로 개발을 하면서
등등 LC.exe에 관한 오류가 뜬금없이 나타나서 당황한적이 있다.

첨엔 Visual Studio나 기타 프로그램들에 문제가 생긴 줄 알고
포맷하는 지경에 까지 이르렀었다.

그러나 문제는 의외로 간단했다.

소스제공자의 PC에서 사용하던
잡다한 개발툴들의 라이센스와 나의 라이센스가 일치하지 않아서 생기는 문제이다.

따라서 이전 라이센스 정보만 날려주면 되는 간단한 현상이다.

라이센스를 날리는 방법은 아래와 같이 간단하다
1. 프로젝트 폴더안에 있는 Properties 폴더로 들어간다.

2. 폴더안의 licenses.licx파일을 연다.

3. licenses.licx의 내용을 지운다.

참~ 쉽죠잉~~
Google AdSense




Microsoft사의 2007년 XNA 2.0을 발표했다.
'누구나' 쉽게 게임을 만들수 있는 수준은 아니지만, 기존에 비해 한결 편하게 게임을 개발할 수 있게 된 것 같다. 개발자라면 누구나 제대로된 게임을 만들고 보고 싶어하지 않을까? 나도 게임을 만들고 싶어서 DirectX를 공부하다가 번번히 '공부'수준에서 중도포기하곤 했다. 직업이 프로그램 개발이긴 하지만, 게임개발과는 확연히 다른 쪽의 개발이고, 게임이라는 것이 1주일에 두어시간 투자한다고 되는 것도 아니니 말이다.



XNA는 완전히 무료이다. 프레임웍도 무료이고 제작을 위한 IDE도 무료이다.
또한 Windows플랫폼과 XBOX 360 플랫폼을 동시에 지원하는 최초의 프레임웍이다.



아무튼 XNA프레임웍으로 인해 게임개발이 조금 더 간편해 졌다니 또다시 공부를 해볼까한다. 일단 개발 프레임웍과 IDE가 '공짜'라서 공부를 시작하기 위한 부담감이 적다.
Microsoft홈페이지로 가서 Visual C# 2005 Express랑 XNA Game Studio 2.0만 다운받아 설치하면 개발을 시작할 수 있다. 여기에 .Net Framework까지 설치를 하면 Windows용 응용프로그램도 개발할 수 있다. .Net Framework 역시 '공짜'다. 이유가 어찌되었든 개발자가 보기엔 Microsoft사가 좀 착해진 것 같다.

XNA 개발한다는 말은 DirectX & C++이 아닌,  XNA & C#로 개발한다는 말이되겠다.
XNA프레임워크이란 결국 C#으로 작성된 Managed DLL들 인데, 이들의 주된 기능은 DirectX DLL들을 호출해주는 것이다.

Microsoft사의 'Creator's Club'에 가입하면 XNA로 개발한 게임을 XBOX 360에서 직접 돌려 볼 수도 있는데, 연회비가 $99이고 XBOX 360도 없으므로 패스하기로 한다.^^

[http://creators.xna.com/Education/GettingStarted.aspx]
XNA Creator Club에서 XNA를 시작하기 위해 필요한 것들을 확인하고 내려받을 수 있다.

지금 내 PC에는
 - DirectX 9.0c(Republish버젼 아니어도 됨)
 - Visual C# 2005 Express
 - XNA Game Studio 2.0
가 설치되어 있다. 개발 준비 끝!!

Google AdSense

+ Recent posts