티스토리 툴바

[오라클] to_number 함수 오류 처리

Posted 2009/10/21 19:58 by 착한악마
뭐.. 따로 방법이 없더군요.
그냥 정규식을 써서 처리해 봤습니다.

select a, b,
    decode(REGEXP_REPLACE(trim(b), 
                 '^-?[0-9]+((\.[0-9]+)([Ee][+-][0-9]+)?)?', ''), null, '숫자', '문자') flag,
    decode(REGEXP_REPLACE(trim(b), 
                 '^-?[0-9]+((\.[0-9]+)([Ee][+-][0-9]+)?)?', ''), null, to_number(trim(b))) val
  from (select 1 a, '1234' b from dual union
        select 2 a, '-1.234E+04' b from dual union
        select 3 a, '1.234E+04' b from dual union
        select 3 a, '1a234E+04' b from dual union
        select 4 a, '(-1.234E+04)' b from dual)

설명은 필요 없겠죠? ^^
크리에이티브 커먼즈 라이선스
Creative Commons License

Write your message and submit

xpath 함수로 문자열 검색

Posted 2009/09/09 19:00 by 착한악마
프로그램을 하다 보면 데이터 그리드 같은 곳에 xpath를 적용시켜 내용을 보여 주는 경우가 있다
그때 특정 컬럼의 값을 검색하는 방법으로 어떤 방법들을 쓰시는지..
현재 trustForm이라는 것을 사용해 개발 작업 중인데, 조회된 리스트를 다시 검색하는 경우 여러 사람들이 쿼리를 다시 해오는 경우가 있다. 해서 xpath 함수로 처리해 보았다

datagrid1.nodeset = "/root/main/test"

이런식으로 바인딩을 할 경우가 있을때
/root/main/test/name 의 값이 'tester'를 검색 하기 위한 방법으로 xpath 함수를 사용해 보자

tmpStr = 'tester';
datagrid1.nodeset = "/root/main/test[contains(name, '" + tmpStr +"')=true()]";

이런 방법이 있을 수 있겠다.
다른 작업 없이 바로 검색어로 검색이 된 내용만 보일 것이다.
contains() 함수와 true() 함수로 처리.. ^^

헌데 이 방법에 약각의 문제가 있다.
대소문자를 구별한다는 문제...
만약 대소문자 구별 없이 검색을 하고 싶은 경우 한가지 처리를 더 해야 한다

tmpStr =  tmpStr.toUpperCase();
datagrid1.nodeset = "/root/main/test[contains(translate(name, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), '" + tmpStr +"')=true()]";

translate()로 대소문자 변환 후 검색.. ^^
크리에이티브 커먼즈 라이선스
Creative Commons License

Write your message and submit
전에 xml을 사용하여 sys_conect_by 보다 효율적으로 여러로우의 컬럼 값을 합하는 방법을 알려드린 적이 있다.
헌데 여기에 약간에 문제가 있는데 값의 중복과 널값 배제문제다.
GBN VAL
A 001
A 001
A 003
A 004
A 005
A 011
B 007
B 004
B 004
B 010
C 011
C
C 002
C 003

만약 위와 같은 데이터를 갖고 있는 테이블에서
SELECT gbn,
             substr(xmlagg(xmlelement(a,',' || val) order by val).extract('//text()'), 2) val
   FROM lis.testt
 GROUP BY gbn
위와 같은 쿼리를 돌리면 결과가

 GBN VAL 
 A  001,001,003,004,005,011
 B  004,004,007,010
 C  002,003,011,
위와 같이 나온다
이때 A,B의 경우 각각 001, 004가 중복으로 나오며 C의 경우는 널 값 때문에 마지막에 콤마가 하나 더 붙게 된다

extract('//text()')라는 구문을 쓸 수 있다는 것에 힌트를 얻어 xml에서 중복배제나 널값을 뺄 수 있는 함수가 있는지 찾아 보았으나 찾지 못했다
(혹시 아시는 분은 힌트 좀...ㅡㅜ)

위의 내용을 해결하기 위해는 몇가지 트릭을 써야 한다

extract('//text()')에서 extract('/a/text()') 라고 쓰게 되면 a 태그로 된 것들만 결과로 가져온다.

해서
select gbn,
          substr(xmlagg(
                          sys.XMLType.createXML(
                                     '<'||flag||'>,' || val||'</'||flag||'>'
                                     ) order by val).extract('/a1/text()'), 2) val
from (select gbn,
                  val,
                  nvl2(val, 'a' || row_number() over (partition by gbn, val order by val),
                               'a2')  as flag
        from lis.testt)
group by gbn

이런식으로 처리가 가능하다
결과를 보면
 GBN VAL 
 A  001,003,004,005,011
 B  004,007,010
 C  002,003,011


위의 내용을 설명하면 우선 생성되는 xml의 태그 값을 마음대로 지정할 수 있기 위해
xmlelement를 sys.XMLType.createXML로 바꾸었다

그리고 원하는 값만을 가져오기 위해 extract('/a1/text()')로 'a1'을 추가 하였고,
원하는 데이터 상태를 만들기 위해 프롬절 아래 서브쿼리를 썼다

중요한 부분은
nvl2(val, 'a' || row_number() over (partition by gbn, val order by val), 'a') flag
요부분인데

nvl2함수를 사용하여 값이 널일 때는 태그 값이 되는 flag에 'a'를 넘기고

row_number() over (partition by gbn, val order by val)
를 사용하여 중복된 값에 일련번호를 주고 숫자는 xml태그 값으로 사용될 수 없기에 앞에 'a'를 하나 붙여 주었다.

위와 같은 방법을 응용하여 여러가지 조건으로 xmlagg 내부에서 완성되는 xml에서 원하는 값을 뽑아 낼 수 있다.

주의 )  xmlagg 완성된 자료형은 xml형입니다. 당연히 CLAB 처럼 길이 제한이 없습니다.
          하지만 substr 같은 문자열 함수를 쓰는 즉시 varchar(4000)의 제한이 걸립니다
          만약 그 이상의 길이로 데이터를 받고 싶다면 앞에 콤마는 프로그램에서
          제거 하셔야 합니다.

ps. 두번째 글을 올리면서 혹시나 싶어 검색을 해보니 제 글이 출처도 제대로 표시 안된
      채로 오타가 있는 그대로 이리저리 떠돌고 있더군요..ㅡㅜ
      제 블로그에 글도 얼마 안되지만 시간내서 쓰는 사람의 정성을 생각해서 출처 표시는
      해주시면 감사하겠습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License

  1. LJH

    | 2010/01/22 17:00 | PERMALINK | EDIT | REPLY |

    감사합니다.저를 살려주셧습니다.

  2. LJH

    | 2010/01/22 17:01 | PERMALINK | EDIT | REPLY |

    자주찾아와서 공부해야겠습니다.
    오라클 공부중이니 초보자에 관련된것도 좀 올려주시면
    공부하는데 큰 도움이 될것같습니다 ^_________^

  3. Favicon of http://amnesis.tistory.com BlogIcon 착한악마

    | 2010/01/28 17:51 | PERMALINK | EDIT | REPLY |

    헉... ^^ 게을러서 자주 찾아오실 만큼 글을 올리지는 않습니다.. ^^
    도움이 되셨다니 다행이네요

  4. 신병탁

    | 2010/10/03 11:15 | PERMALINK | EDIT | REPLY |

    설명이 깔끔하시네요. 아쉬운 한가지는 좀 더 자료가 많았으면 하는 바램입니다

  5. Favicon of http://amnesis.tistory.com BlogIcon 착한악마

    | 2010/12/10 09:54 | PERMALINK | EDIT | REPLY |

    귀찮니즘 신봉자다 보니.. 게으른 사람은 블로깅 하기도 힘들더군요..ㅎㅎ ^^

Write your message and submit

VB 6.0에서 프린터에 RAW DATA 보내기

Posted 2009/04/28 22:55 by 착한악마
바코드 프린터를 사용할 경우나, 프린터에 직접 RAW 데이타를 보내 조작해야 할 경우가 있다
허나 VB에서는 RAW 데이타 전송을 지원하지 않는다

그래서 뒤져뒤져 MSDN에서 찾아 코딩을 해보았다
http://support.microsoft.com/kb/600847/ko
근디 이 시키들(^^;;)이 안 적어 놓은 주의 사항이 있다..ㅡㅜ

WritePrinter(lhPrinter, ByVal sWrittenData, Len(sWrittenData), lpcWritten)
요걸로 출력시 한글에 문제가 있어 가볍게 웃으며

WritePrinter(lhPrinter, ByVal sWrittenData, LenB(sWrittenData), lpcWritten)
요렇게 고쳐서 해결을 본걸로 생각했는데..

SATO CL408e 기종에서 종종 프린터가 먹통이 되는 상황이 발생하는 것이 었따~!

별의별 짓을 다해봐도 알 수 없는 오류...

거의 반나절 이상을 고생하다가.. 같은 유니코드 체계에 해결 방법이 있으리라 생각되서 중국쪽을 뒤져서 결국 찾아 냈다..

LenB(StrConv(sWrittenData, vbFromUnicode))

알고 보면 간단한...

WritePrinter 메소드에서 문자열의 길이를 계산 할때는
LenB(StrConv(sWrittenData, vbFromUnicode))

잊지 말자...ㅡㅜ

내 시간 돌리도~~~~~~~!!!!!

ps. 누군가 내 덕에 시간을 번다면.. 리플이라도 달아주세요...ㅡㅜ





크리에이티브 커먼즈 라이선스
Creative Commons License

Write your message and submit

네이버 우클릭 풀기 2탄 - 네이버 카페용

Posted 2008/09/30 02:32 by 착한악마
javascript:function r(d){d.oncontextmenu=null;d.onselectstart=null;d.ondragstart=null; d.onkeydown=null;d.onmousedown=null;d.body.oncontextmenu=null; d.body.onselectstart=null;d.body.ondragstart=null;d.body.onkeydown=null; d.body.onmousedown=null;}r(cafe_main.document);

즐겨 찾기에 지정해 놓으면 편하겠죠? ^^
크리에이티브 커먼즈 라이선스
Creative Commons License

Write your message and submit

MS-SQL 에서 테이블 구조 정보 빼오기

Posted 2007/10/11 22:08 by 착한악마
MS-SQL에서 테이블 구조 살펴보다가 귀찮아서 한번 만들어 보았습니다....

단순하게 만들었는데.. 쓸만한지 모르겠네요.. ㅎㅎ

테이블명, 컬럼명(속성), PK정보, FK정보 등을 보여 줍니다.


select (select count(*)
    from sysobjects
         where xtype = 'U'
           and name != 'dtproperties'
           and name <= a.name)  테이블번호,
    a.name 테이블명,
    b.colid 컬럼번호,
    b.name 컬럼명, c.name 컬럼속성,
       case when b.xtype = 108 then CAST(b.xprec as varchar(100)) + ',' + CAST(b.xscale as varchar(100)) else CAST(b.length as varchar(100)) end 속성값,
       case when b.isnullable = 1 then 'Y' else '' end null여부,
    ISNULL((select CAST(keyno as varchar(2)) from dbo.sysindexkeys where id = d.id and indid = d.indid and colid = b.colid), '') PK순서,
       ISNULL((select name from dbo.sysobjects where id = f.rkeyid), '') 참조테이블,
       ISNULL((select name from dbo.syscolumns where id = f.rkeyid and colid = f.rkey), '') 참조컬럼,
       ISNULL(CAST(f.keyno as varchar(2)), '') 참조컬럼순서
  from dbo.sysobjects a,
       dbo.syscolumns b,
    dbo.systypes c,
    dbo.sysindexes d,
    dbo.sysforeignkeys f
 where a.id = b.id
   and a.xtype = 'U'
   and b.xtype = c.xtype
   and b.id *= d.id
   and d.name like 'PK%'
   and b.id *= f.fkeyid
   and b.colid *= f.fkey
   and a.name != 'dtproperties'
   and ((c.xtype = '231' and c.status = '2') or c.xtype != '231')
order by a.name, b.colorder
크리에이티브 커먼즈 라이선스
Creative Commons License

Write your message and submit

B-Boy Show

Posted 2007/07/09 14:43 by 착한악마
사용자 삽입 이미지
크리에이티브 커먼즈 라이선스
Creative Commons License

  1. Favicon of http://salbeolgirl.tistory.com BlogIcon 살벌한뇬

    | 2007/10/11 23:47 | PERMALINK | EDIT | REPLY |

    어머나...

Write your message and submit

비오는 날

Posted 2007/06/04 19:22 by 착한악마
사용자 삽입 이미지
크리에이티브 커먼즈 라이선스
Creative Commons License

  1. 달의여신

    | 2007/11/14 20:19 | PERMALINK | EDIT | REPLY |

    앗! 어디서 많이 본 사람이 여기 있네 ㅋㅋㅋ

Write your message and submit

초대장 필요하신분~

Posted 2007/05/28 16:57 by 착한악마
Tistory에 블러그 개설하고 싶으신분

댓글 달아 주십시요~

초대장 보내드리겠습니다.. ^^

선착순 10명~

ps. 이메일 주소가 필요하니 정보보호를 위해 비밀 댓글로 부탁 드릴께요..^^
크리에이티브 커먼즈 라이선스
Creative Commons License

Tag : 초대장

  1. Favicon of http://volzh.tistory.com BlogIcon 얼사마

    | 2007/05/28 19:05 | PERMALINK | EDIT | REPLY |

    안녕하세요. 초대장 받고 싶어서 댓글 남깁니다. ^^;;;
    dwf@hanmail.net
    부탁드려요~

  2. | 2007/05/28 23:58 | PERMALINK | EDIT | REPLY |

    비밀댓글입니다

  3. | 2007/05/30 05:14 | PERMALINK | EDIT | REPLY |

    비밀댓글입니다

  4. | 2007/05/31 11:40 | PERMALINK | EDIT | REPLY |

    비밀댓글입니다

  5. | 2007/05/31 22:07 | PERMALINK | EDIT | REPLY |

    비밀댓글입니다

  6. | 2007/06/01 14:24 | PERMALINK | EDIT | REPLY |

    비밀댓글입니다

    • Favicon of http://amnesis.tistory.com BlogIcon 착한악마

      | 2007/06/04 09:20 | PERMALINK | EDIT |

      제가 좀 늦게 보내 이미 다른 분께 받으셨네요.
      죄송합니다. ^^;;

Write your message and submit

모니터 클리너!! ^^

Posted 2007/05/15 09:49 by 착한악마
출처는 모르겠습니다.
메신저에서 날라 와서...^^

워너브라더스 마크가 있는데.. 거기서 만들었나??
크리에이티브 커먼즈 라이선스
Creative Commons License

Write your message and submit