노무현 전 대통령 서거 소식을 듣고 문득 궁금해진 것이 있었다.


"<조선> <중앙> <동아> 편집국 분위기는 어땠을까? 그 회사 간부들, 기자들은 순간 어떤 생각을 하고 있었을까?"


우선 인터넷을 접속해 봤다. 참여정부 내내 십자포화를 쏟아부었지만 '조중동'도 어차피 사람이 만드는 신문, 우선 인터넷에서는 망자에 대한 예의를 갖추는 모양새다. <조선> <동아>는 사이트 제호 옆에 국화 한 송이를 배치했고 "노무현 전 대통령의 서거를 애도합니다"라는 문구를 붙였다. <중앙일보> 사이트인 조인스닷컴은 제호에 별다른 변화를 주지 않았다.


고인에게 '할 말' 다하는 조중동, '일관성' 지키기?


이번에는 노 전 대통령 서거 다음날인 24일치 신문을 봤다. 노 전 대통령의 명복을 빈다고 하고는 있지만 한편으로 '할 말'은 다 하고 있다. 고인 서거 상황을 맞았다고 낯빛 하나 안 바꾸고 그동안 부정해 왔던 것들을 어쩔 수 없이 순간 긍정해 버리는 것도 고인에게 몹쓸  짓, 그래 차라리 '일관성'이 나아보인다.  


  
지난 5월 1일 '조선만평'. 청와대 경호처에서 지원한 방탄 버스를 타고 대검찰청으로 향하고 있는 노무현 전 대통령을 전두환 전 대통령과 단순비교하고 있다. 전 전 대통령이 '저 양반은 호강하네'라고 말하고 있다.
ⓒ 조선일보 갈무리
신경무
  
지난 5월 13일 '조선만평'. 노무현 전 대통령이 정상문 비서관이 세고 있는 돈을 쳐다보며 침을 흘리고 있다.
ⓒ 조선일보 갈무리
신경무

<조선일보>는 24일 사설에서 "노 전 대통령 시절부터 홍위병에 가까운 세력들이 시민단체를 가장해 대통령에 비판적인 목소리를 내는 언론에 대한 전방위 공격을 퍼부었고 언론의 대통령 권력에 대한 감시도 기대하기 힘들만큼 악화됐다"면서 "그 결과 대한민국 대통령 권력은 감시 견제 비판으로부터 해방되면서 결국은 권력 자체의 비리의 무게로 붕괴되기까지 위태위태한 모습을 연출했다"고 주장했다.


'노무현 전 대통령이 비판언론의 감시 견제 비판으로부터 해방되었고, 대통령 권력에 대한 감시도 기대하기 힘들만큼 악화됐다'는 주장은 참여정부 지지 여부를 떠나 동의하는 이가 많지 않을 것이다. 더욱이 <조선일보>는 이명박 정부 들어 숱한 언론인들이 체포되고 심지어 구속당하는 일까지 생기는 등 '언론탄압' 주장이 거센 마당인 데도 이에 대해선 전혀 지면 할애를 하지 않아왔다. '신영철 사건' 등을 통해서는 스스로 비판의 칼날을 무디게 하거나 거둬들이고 있지 않은가?


<중앙일보>는 24일 <중앙선데이>를 통해 "'검찰 책임론'을 몰아붙이거나, 책임지는 사람이 있어야 한다고 주장하는 건 갈등을 부추기는 것"이라며 "정당했던 언론의 비판을 감정적으로 매도하는 것은 피해야 한다"고 주장했다.


'영욕 너머로 떠난 노무현 전 대통령'이란 사설을 내보낸 <동아일보>는 "노 전 대통령의 죽음이 애석한 일이긴 하지만 그를 죽음으로 몰고 간 직접적인 원인은 어디까지나 권력 비리"라면서 "일부 세력은 마치 그의 죽음에 이명박 정부와 검찰이 책임이 있는 양 선동하고 나섰다. 우리 국민은 그런 억지에 결코 흔들리지 않을 만큼 성숙하다고 믿는다"고 밝혔다.


<동아>는 "검찰의 무리한 수사가 비극을 불렀다는 주장도 설득력이 떨어진다", "노 전 대통령은 수사과정에서 전직 대통령으로서 배려와 예우를 받을 만큼 받았다", "전직 대통령이라고 해서 비리 혐의가 있어도 묻어두는 것은 법치주의 국가에서 있을 수 없는 일"이라는 주장을 폈다.


  
검찰의 노 전 대통령 망신주기 사례의 전형인 '고가 시계'를 만평의 주제로 삼아 다시금 공격하고 있다. 만평에서 나타난 노 전 대통령의 표정과 말풍선 멘트가 극히 비현실적이다.
ⓒ 조선일보 갈무리
신경무

  
지난 5월 7일 '조선만평'. 노무현 전 대통령이 검사의 옷깃을 잡고 말을 쏟아뱉고 있다. 전 대통령은 커녕 시정잡배 혹은 깡패처럼 표현했다.
ⓒ 조선일보 갈무리
신경무

하지만 <동아>도 법조팀에 여러 명의 출입기자들이 있을테니 잘 알 것이다. 검찰과 언론의 핑퐁게임으로 각종 피의사실이 연일 시시콜콜 독자들의 아침밥상에 올라왔는데도 노 전 대통령이 배려와 예우를 받을만큼 받은 것일까? '검찰의 무리한 수사' 주장은 일고의 가치도 없는 것일까? "정당했던 언론의 비판"이라는 <중앙일보>의 주장 역시 낯뜨겁긴 마찬가지다.


신경무 만평, 사흘에 한 번 꼴로 '노무현 풍자'


생각이 이쯤 이르자, 순간 또 스쳐 지나가는 인물이 있었다. 신경무 <조선일보> 화백.


신경무 화백은 노 전 대통령의 재임 동안 그야말로 언론의 자유, 표현의 자유를 마음껏 누린 언론인이라고 해도 과언이 아니다. '독했던' <조선>의 사설, 칼럼 못잖게 신 화백은 참여정부 집권 내내 노무현 대통령을 비난했다.


"노무현 전 대통령 서거 소식을 듣고 신경무 화백은 과연 어떤 생각을 했을까?"


  
신경무 화백의 노무현 대통령 표현 변천사. 후보자 시절(맨 왼쪽) 그런대로 캐리커쳐의 모습을 보이다가 2004년을 거쳐 2005년에는 일자눈섭과 깍두기 머리로 노 대통령의 이미지는 고정됐다.
ⓒ 조선일보 갈무리
신경무
신 화백이 얼마나 노 대통령에 '집착'했던지, 이를 연구한 학자와 연구 결과까지 있을 정도다. 신병률 경성대 신문방송학과 교수는 지난 5월 16일 "신경무 화백의 '조선만평'이 노 전 대통령을 어떤 소재와 방식으로 재임기간(2003년 2월 25일∼2008년 2월 24일)에 풍자했는지 분석한 결과"를 내놓으면서 이렇게 말했다.

"'조선만평'의 노무현 전 대통령에 대한 프레임을 한 마디로 압축한다면 그것은 아마도 '무자격' 프레임이 될 것이다. 능력과 성격 등 모든 부분을 통틀어 '무능한 이미지'가 관통하고 있다"


신 교수에 따르면 신 화백은 3일에 한 번 꼴(1401개 가운데 467개, 약 33%)로 노 전 대통령을 소재로 다룬 만평을 그렸다. 노 전 대통령이 풍자의 직접 대상이 된 경우는 467개 가운데 399개였고, 이외에 부정적 인물이나 집단을 비판할 때 조연으로 노 전 대통령을 '끼워파는' 사례도 적지 않았다. 대통령 측근들, 총리를 포함한 장관들, 검찰, 이명박 당시 대선후보, 김정일 등이 풍자의 주된 대상인데도 노 전 대통령을 등장시켜 싸잡아 비판한 만평이 전체의 14.6%(467개 가운데 68개)였다.

       

신 교수의 조사결과 신 화백이 노 전 대통령을 긍정적으로 묘사한 경우는 예상대로 '없었다'. 노 전 대통령은 97.9%(457개)에 이르는 '조선만평'에서 부정적 모습으로 묘사됐다. 나머지 10개는 중립적이거나 모호하게 묘사됐다는 게 신 교수의 주장이다.


대상을 표현하는 방식이야 작가의 재량이겠지만 신 화백이 노 전 대통령을 표현했던 방식은 알려졌다시피 '일자 눈썹'과 이른바 '깍두기 머리'였다. 매우 부정적인 형상화였으며 심지어 레임덕을 상징하는 오리 모자를 씌우기도 했다.


  
신경무 화백은 2006년 9월경부터 노무현 전 대통령의 머리에 '레임덕'을 상징하는 오리 모자를 씌운채 만평에 등장시킨다.
ⓒ 조선일보 갈무리
신경무
  
2006년 11월 10일 '조선만평'. '레임덕'을 상징하는 오리모자를 쓴 노무현 전 대통령이 부시 전 미국 대통령을 위로하고 있다.
ⓒ 조선일보 갈무리
조선일보

  
ⓒ 조선일보 갈무리
신경무

이 뿐인가. 만평의 60%에 이르는 271건이 노 대통령이 화를 내거나 당혹해 하거나 비굴한 표정을 짓거나 혹은 발길질 주먹질 몽둥이질 등 폭력을 행사하는 모습으로 그려졌다.


신 교수는 "대통령의 행위를 정책적 관점에서 해석하고 비판하는 노력은 필요하지만 개인적 행위로 축소해 묘사하는 것은 풍자를 위해서 어쩔 수 없는 측면이 있다 하더라도 언론의 사회적 책임 면에서 꼭 바람직하다고 보기는 어렵다"고 지적했었다.


신 화백의 노 대통령 공격 프레임은 퇴임후에도 이어졌으며 특히 노 전 대통령이 소환조사 이후인 5월에는 특히나 많았다. 


하지만 신 화백은 그동안 '저주'에 가까와 보일 정도로 밉게 그리던 노 전 대통령이 허망하게 세상을 떠나자 25일 검은 먹컷에 국화 한 송이를 만평에 그려 그에게 바쳤다.


신 화백은 여백을 검은 색으로 채워나가면서, 그리고 저 국화 한 송이 이파리들을 하나하나 뽑아 그려가며 과연 무슨 생각을 했을까. 그동안 그려오던 모습과는 전혀 다른, 영정 속 노 전 대통령의 웃는 낯을 보며 순간 그에겐 무슨 생각이 스쳐갔을까.


  
5월 25일 '조선만평'. 신경무 화백이 노무현 전 대통령에게 국화 한 송이를 바쳤다. 그는 고인의 서거 소식을 듣고 어떤 생각을 했을까?
ⓒ 조선일보 갈무리
신경무

블로그 이미지

요다할아범

,
[한겨레] 노무현 전 대통령을 보내며 정기용/건축가

“기자회견 하겠다” 간청하자 “참아라”

지붕 낮은 집을 원한 대통령


5월 23일 토요일 하루 종일 찌푸린 하늘아래 가랑비가 흩뿌렸다. 가슴이 에린다. 끊임없이 눈물이 고인다. 부엉이바위는 계속 내 눈 앞에 나타나 시야를 흐리게 한다. 믿을 수 없는 것을 믿어야하고, 지금 떠나서는 안 되는 분을 떠나보내는 사람들의 심경을 어떻게 다 말로 표현할 수 있겠는가? 그래도 꼭 그렇게 해야 한다면 오늘 나는 고백해야만 한다. 그동안 가슴속에 꾹꾹 참아왔던 이야기들을 털어놓아야만 하겠다.

마지막 가시는 길을 위해 나는 두 가지를 밝힌다. 한가지는 세상 사람들이 텔레비전 카메라를 통해서 바라보는 봉하마을 사저에 관한 것이고, 또 다른 하나는 대통령이라기보다는 귀향한 한 농촌인으로서 ‘농부 노무현’이 꿈꾸던 소박한 세계를 알리는 것이다. 오늘의 이 비통함과 가슴 저리는 심경 속에서 우리가 갖춰야 되는 최소한의 예의는 고인에게 끈질기게 따라다녔던 왜곡된 사실들을 바로잡아 주는 것이다. 봉하마을의 사저는 내가 설계했기 때문에 내가 제일 잘 안다. 노 전 대통령의 자택은 흙과 나무로 만든 집이다. 그런데 항간에서는 ‘봉하아방궁’이라는 말로 날조해서 사저를 비하했다. 도저히 참을 수 없는 나는 대통령에게 내가 나서서 기자회견을 해야겠다고 간청했다. 그러나 대통령은 그래봐야 아무소용이 없으니 참으라고 하셨다.

노 전 대통령을 처음 만났을 때, 그는 귀향 이유로 “아름다운 자연으로 귀의하는 것이 아니라 농촌에서 농사도 짓고 마을에 자원봉사도 하고, 자연도 돌보는 일을 하고 싶다”고 하셨다. 그래서 나는 옛날 우리 조상들이 안채와 사랑채를 나누어 살았듯이, 한 방에서 다른 방으로 이동할 때는 신을 신고 밖으로 나와서 이동하는 방식을 권유했다. 대통령은 흔쾌히 동의하셨다.

그렇다. 노무현 대통령은 이 나라에서 권위주의를 물리치고 민주주의를 확장한 분으로 평가하기도 한다. 그러나 무엇보다도 세상 사람들이 잘 모르고 있는 것은 사람들에 대한 배려이다. 건축가는 안다. 건축주가 누구이며 집을 통해 무엇을 실현하려는지.

노무현 대통령은 결국 “지붕 낮은 집”을 베이스캠프로 삼아 봉하마을 주민들의 농촌소득 증대사업을 유기농법으로 전환시키고, 봉화산과 화포천 일대의 자연환경을 보존하고 치유하며, 궁극적으로는 청소년을 위한 생태교육의 장을 만들고자 하셨다. 재임 시절 풀지 못한 숙제 중 하나인 농촌 문제를 스스로 몸을 던져 부닥치려는 대통령의 의지는 퇴임 뒤 일년 내내 쉴 새 없이 지속되었다. 마을 뒷산 기슭에 ‘장군차’도 심을 예정이었고, 마을 마당 앞뜰에는 특산물매장도 꾸리고 ‘노무현표’ 쌀도 팔 계획이었다. 특히 마을장터 지하 쪽에 작은 기념도서관 건립도 꿈꾸고 계셨다. 민주화운동 시절 당신이 가까이했던 민주주의에 관한 책들, 당시 젊은이들의 양식이었던 모든 책들을 모아 작지만 전문적인 ‘민주주의 전문도서관’을 구상하고 계셨다. 농사도 짓고, 자연과 생태를 살리고, 나아가서는 봉화산자락 부엉이바위 밑에 작은 동물농장을 만들어 청소년들과 함께 하려는 생각들이 바로 인간 노무현 대통령이 꿈꾸던 소박한 꿈들이었다. 그리고 틈틈이 폭넓은 독서에 빠져 통치시절을 정리하며 집필 작업에 임하셨다. 독서와 토론은 노무현 대통령이 봉하마을에서 즐기던 값진 삶의 한 부분이었다.

그러나 이 모든 것을 뒤로하고 대통령은 결국 우리 곁을 떠나셨다. 그것은 내 탓이다. ‘산은 멀리 바라보고 가까운 산은 등져야한다’는 조상들의 말을 거역하고 집을 앉힌 내 탓이다. 봉화산 사자바위와 대통령이 그토록 사랑하던 부엉이바위 가까이에 지붕 낮은 집을 설계한 내 탓이다.

다시 한번 깊이 생각해보자. 그가 목숨을 던져 우리들에게 남긴 질문들을. 한국 현대사 속에 심연처럼 가로놓인 질곡, 멍에, 허위의식, 인간의 탈을 쓴 야수성들. 이 모든 것을 안고 간 노 전 대통령의 죽음을 나는 순교라고 밖에 달리 부를 말이 없다. 나는 부엉이바위 밑에 만들 동물농장 그림을 보여주기로 한 약속을 못 지킨 채, 지금 봉하마을로 내려간다. 대통령은 지금도 바로 거기에 계시므로.

정기용/건축가
블로그 이미지

요다할아범

,
먼저 SYS 계정에 아래의 패키지 생성

CREATE OR REPLACE PACKAGE SYS.DBMS_CRYPTO AS

    ---------------------------------------------------------------------------
    --
    -- PACKAGE NOTES
    --
    -- DBMS_CRYPTO contains basic cryptographic functions and
    -- procedures.  To use correctly and securely, a general level of
    -- security expertise is assumed.
    --
    -- VARCHAR2 datatype is not supported.  Cryptographic operations
    -- on this type should be prefaced with conversions to a uniform
    -- character set (AL32UTF8) and conversion to RAW type.
    --
    -- Prior to encryption, hashing or keyed hashing, CLOB datatype is
    -- converted to AL32UTF8.  This allows cryptographic data to be
    -- transferred and understood between databases with different
    -- character sets, across character set changes and between
    -- separate processes (for example, Java programs).
    --
    ---------------------------------------------------------------------------


    -------------------------- ALGORITHM CONSTANTS ----------------------------
    -- The following constants refer to various types of cryptographic
    -- functions available from this package.  Some of the constants
    -- represent modifiers to these algorithms.
    ---------------------------------------------------------------------------

    -- Hash Functions
    HASH_MD4           CONSTANT PLS_INTEGER            :=     1;
    HASH_MD5           CONSTANT PLS_INTEGER            :=     2;
    HASH_SH1           CONSTANT PLS_INTEGER            :=     3;

    -- MAC Functions
    HMAC_MD5           CONSTANT PLS_INTEGER            :=     1;
    HMAC_SH1           CONSTANT PLS_INTEGER            :=     2;

    -- Block Cipher Algorithms
    ENCRYPT_DES        CONSTANT PLS_INTEGER            :=     1;  -- 0x0001
    ENCRYPT_3DES_2KEY  CONSTANT PLS_INTEGER            :=     2;  -- 0x0002
    ENCRYPT_3DES       CONSTANT PLS_INTEGER            :=     3;  -- 0x0003
    ENCRYPT_AES        CONSTANT PLS_INTEGER            :=     4;  -- 0x0004
    ENCRYPT_PBE_MD5DES CONSTANT PLS_INTEGER            :=     5;  -- 0x0005
    ENCRYPT_AES128     CONSTANT PLS_INTEGER            :=     6;  -- 0x0006
    ENCRYPT_AES192     CONSTANT PLS_INTEGER            :=     7;  -- 0x0007
    ENCRYPT_AES256     CONSTANT PLS_INTEGER            :=     8;  -- 0x0008

    -- Block Cipher Chaining Modifiers
    CHAIN_CBC          CONSTANT PLS_INTEGER            :=   256;  -- 0x0100
    CHAIN_CFB          CONSTANT PLS_INTEGER            :=   512;  -- 0x0200
    CHAIN_ECB          CONSTANT PLS_INTEGER            :=   768;  -- 0x0300
    CHAIN_OFB          CONSTANT PLS_INTEGER            :=  1024;  -- 0x0400

    -- Block Cipher Padding Modifiers
    PAD_PKCS5          CONSTANT PLS_INTEGER            :=  4096;  -- 0x1000
    PAD_NONE           CONSTANT PLS_INTEGER            :=  8192;  -- 0x2000
    PAD_ZERO           CONSTANT PLS_INTEGER            := 12288;  -- 0x3000
    PAD_ORCL           CONSTANT PLS_INTEGER            := 16384;  -- 0x4000

    -- Stream Cipher Algorithms
    ENCRYPT_RC4        CONSTANT PLS_INTEGER            :=   129;  -- 0x0081


    -- Convenience Constants for Block Ciphers
    DES_CBC_PKCS5      CONSTANT PLS_INTEGER            := ENCRYPT_DES
                                                          + CHAIN_CBC
                                                          + PAD_PKCS5;

    DES3_CBC_PKCS5     CONSTANT PLS_INTEGER            := ENCRYPT_3DES
                                                          + CHAIN_CBC
                                                          + PAD_PKCS5;

    AES_CBC_PKCS5      CONSTANT PLS_INTEGER            := ENCRYPT_AES
                                                          + CHAIN_CBC
                                                          + PAD_PKCS5;


    ----------------------------- EXCEPTIONS ----------------------------------
    -- Invalid Cipher Suite
    CipherSuiteInvalid EXCEPTION;
    PRAGMA EXCEPTION_INIT(CipherSuiteInvalid, -28827);

    -- Null Cipher Suite
    CipherSuiteNull EXCEPTION;
    PRAGMA EXCEPTION_INIT(CipherSuiteNull,    -28829);

    -- Key Null
    KeyNull EXCEPTION;
    PRAGMA EXCEPTION_INIT(KeyNull,            -28239);

    -- Key Bad Size
    KeyBadSize EXCEPTION;
    PRAGMA EXCEPTION_INIT(KeyBadSize,         -28234);

    -- Double Encryption
    DoubleEncryption EXCEPTION;
    PRAGMA EXCEPTION_INIT(DoubleEncryption,   -28233);


    ---------------------- FUNCTIONS AND PROCEDURES ------------------------

    ------------------------------------------------------------------------
    --
    -- NAME:  Encrypt
    --
    -- DESCRIPTION:
    --
    --   Encrypt plain text data using stream or block cipher with user
    --   supplied key and optional iv.
    --
    -- PARAMETERS
    --
    --   plaintext   - Plaintext data to be encrypted
    --   crypto_type - Stream or block cipher type plus modifiers
    --   key         - Key to be used for encryption
    --   iv          - Optional IV for block ciphers.  Default all zeros.
    --
    -- USAGE NOTES:
    --
    --   Block ciphers may be modified with chaining type (CBC most
    --   common) and padding type (PKCS5 recommended).  Of the four
    --   common data formats, three have been provided: RAW, BLOB,
    --   CLOB. For VARCHAR2 encryption, callers should first convert
    --   to AL32UTF8 character set and then encrypt.
    --
    --     Encrypt(UTL_RAW.CAST_TO_RAW(CONVERT(src,'AL32UTF8')),typ,key);
    --
    --   As return type for encrypt is RAW, callers should consider
    --   encoding it with RAWTOHEX or UTL_ENCODE.BASE64_ENCODE to make
    --   it suitable for VARCHAR2 storage.  These functions expand
    --   data size by 2 and 4/3, respectively.
    --
    --   To improve readability, callers should define their own
    --   package level constants to represent the ciphersuites used
    --   for encryption and decryption.
    --
    --   For example:
    --
    --   DES_CBC_PKCS5 CONSTANT PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_DES
    --                                       + DBMS_CRYPTO.CHAIN_CBC
    --                                       + DBMS_CRYPTO.PAD_PKCS5;
    --
    --
    -- STREAM CIPHERS (RC4) ARE NOT RECOMMENDED FOR STORED DATA ENCRYPTION.
    --
    --
    ------------------------------------------------------------------------

    FUNCTION  Encrypt (src IN            RAW,
                       typ IN            PLS_INTEGER,
                       key IN            RAW,
                       iv  IN            RAW          DEFAULT NULL)
      RETURN RAW;

    PROCEDURE Encrypt (dst IN OUT NOCOPY BLOB,
                       src IN            BLOB,
                       typ IN            PLS_INTEGER,
                       key IN            RAW,
                       iv  IN            RAW          DEFAULT NULL);

    PROCEDURE Encrypt (dst IN OUT NOCOPY BLOB,
                       src IN            CLOB         CHARACTER SET ANY_CS,
                       typ IN            PLS_INTEGER,
                       key IN            RAW,
                       iv  IN            RAW          DEFAULT NULL);


    ------------------------------------------------------------------------
    --
    -- NAME:  Decrypt
    --
    -- DESCRIPTION:
    --
    --   Decrypt crypt text data using stream or block cipher with user
    --   supplied key and optional iv.
    --
    -- PARAMETERS
    --
    --   cryptext    - Crypt text data to be decrypted
    --   crypto_type - Stream or block cipher type plus modifiers
    --   key         - Key to be used for encryption
    --   iv          - Optional IV for block ciphers.  Default all zeros.
    --
    -- USAGE NOTES:
    --   To retrieve original plain text data, Decrypt must be called
    --   with the same cipher, modifiers, key and iv used for
    --   encryption.  If crypt text data was converted to hex or
    --   base64 prior to storage, it must be decoded using HEXTORAW or
    --   UTL_ENCODE.BASE64_DECODE prior to decryption.
    --
    ------------------------------------------------------------------------

    FUNCTION  Decrypt (src IN            RAW,
                       typ IN            PLS_INTEGER,
                       key IN            RAW,
                       iv  IN            RAW          DEFAULT NULL)
       RETURN RAW;

    PROCEDURE Decrypt (dst IN OUT NOCOPY BLOB,
                       src IN            BLOB,
                       typ IN            PLS_INTEGER,
                       key IN            RAW,
                       iv  IN            RAW          DEFAULT NULL);

    PROCEDURE Decrypt (dst IN OUT NOCOPY CLOB         CHARACTER SET ANY_CS,
                       src IN            BLOB,
                       typ IN            PLS_INTEGER,
                       key IN            RAW,
                       iv  IN            RAW          DEFAULT NULL);


    ------------------------------------------------------------------------
    --
    -- NAME:  Hash
    --
    -- DESCRIPTION:
    --
    --   Hash source data by cryptographic hash type.
    --
    -- PARAMETERS
    --
    --   source    - Source data to be hashed
    --   hash_type - Hash algorithm to be used
    --
    -- USAGE NOTES:
    --   SHA-1 (HASH_SH1) is recommended.  Consider encoding returned
    --   raw value to hex or base64 prior to storage.
    --
    ------------------------------------------------------------------------

    FUNCTION Hash (src IN RAW,
                   typ IN PLS_INTEGER)
      RETURN RAW DETERMINISTIC;

    FUNCTION Hash (src IN BLOB,
                   typ IN PLS_INTEGER)
      RETURN RAW DETERMINISTIC;

    FUNCTION Hash (src IN CLOB        CHARACTER SET ANY_CS,
                   typ IN PLS_INTEGER)
      RETURN RAW DETERMINISTIC;


    ------------------------------------------------------------------------
    --
    -- NAME:  Mac
    --
    -- DESCRIPTION:
    --
    --   Message Authentication Code algorithms provide keyed message
    --   protection.
    --
    -- PARAMETERS
    --
    --   source   - Source data to be mac-ed
    --   mac_type - Mac algorithm to be used
    --   key      - Key to be used for mac
    --
    -- USAGE NOTES:
    --   Callers should consider encoding returned raw value to hex or
    --   base64 prior to storage.
    --
    ------------------------------------------------------------------------
    FUNCTION Mac (src IN RAW,
                  typ IN PLS_INTEGER,
                  key IN RAW)
      RETURN RAW;

    FUNCTION Mac (src IN BLOB,
                  typ IN PLS_INTEGER,
                  key IN RAW)
      RETURN RAW;

    FUNCTION Mac (src IN CLOB         CHARACTER SET ANY_CS,
                  typ IN PLS_INTEGER,
                  key IN RAW)
      RETURN RAW;


    ------------------------------------------------------------------------
    --
    -- NAME:  RandomBytes
    --
    -- DESCRIPTION:
    --
    --   Returns a raw value containing a pseudo-random sequence of
    --   bytes.
    --
    -- PARAMETERS
    --
    --   number_bytes - Number of pseudo-random bytes to be generated.
    --
    -- USAGE NOTES:
    --   number_bytes should not exceed maximum RAW length.
    --
    ------------------------------------------------------------------------
    FUNCTION RandomBytes (number_bytes IN PLS_INTEGER)
      RETURN RAW;


    ------------------------------------------------------------------------
    --
    -- NAME:  RandomNumber
    --
    -- DESCRIPTION:
    --
    --   Returns a random Oracle Number.
    --
    -- PARAMETERS
    --
    --  None.
    --
    ------------------------------------------------------------------------
    FUNCTION RandomNumber
      RETURN NUMBER;


    ------------------------------------------------------------------------
    --
    -- NAME:  RandomInteger
    --
    -- DESCRIPTION:
    --
    --   Returns a random BINARY_INTEGER.
    --
    -- PARAMETERS
    --
    --  None.
    --
    ------------------------------------------------------------------------
    FUNCTION RandomInteger
      RETURN BINARY_INTEGER;


    PRAGMA RESTRICT_REFERENCES(DEFAULT, WNDS, RNDS, WNPS, RNPS);

END DBMS_CRYPTO;
/


그리고

 오라클 암호화 DBMS_CRYPTO (10g 이상)
------------------------------------------------------------------------------------------
▶ 권한부여
SQL> grant execute on DBMS_CRYPTO to [계정명];
▶ Create Function (일반계정용)
--------------------------------------------------------------------
CREATE OR REPLACE FUNCTION KORAS.ENCRY(strValue VARCHAR2, strEncKey VARCHAR2)
    RETURN RAW
    IS
        input_raw RAW(1024);
        key_raw RAW(16) := UTL_RAW.CAST_TO_RAW(strEncKey);
        v_out_raw RAW(1024);
        AES_CBC_PKCS5 CONSTANT PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
    BEGIN
        input_raw := UTL_I18N.STRING_TO_RAW(strValue, 'AL32UTF8');
        v_out_raw := DBMS_CRYPTO.ENCRYPT(
                        src => input_raw,
                        typ => AES_CBC_PKCS5,
                        key => key_raw);
        RETURN v_out_raw;
END ENCRY;
/
CREATE OR REPLACE FUNCTION KORAS.DECRY(v_in_raw RAW, strEncKey VARCHAR2)
    RETURN VARCHAR2
    IS
        key_raw RAW(16) := UTL_RAW.CAST_TO_RAW(strEncKey);
        output_raw RAW(1024);
        v_out_string VARCHAR2(1024);
        AES_CBC_PKCS5 CONSTANT PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
    BEGIN
        output_raw := DBMS_CRYPTO.DECRYPT(
                        src => v_in_raw,
                        typ => AES_CBC_PKCS5,
                        key => key_raw);
        v_out_string := UTL_I18N.RAW_TO_CHAR(output_raw, 'AL32UTF8');
        RETURN v_out_string;
END DECRY;


돌려 주면 됨
블로그 이미지

요다할아범

,

▨ 무한로우 생성 쿼리


[출처] http://www.koug.net/

 

[1] Oracle 9i
   select * from (select level from dual connect by level <= 1000);


[2] Oracle 10g
   select level from dual connect by level <= 1000;


▶ [2]는 9i에서도 돌아가지만, 100 Row까지만 나옵니다..

블로그 이미지

요다할아범

,

질문
----------------------------------
select t.corp_cd, t.engineer_nm from mantb_engineer t order by t.corp_cd
//회사코드, 엔지니어 이름 을 회사코드에 맞게 정렬해서 아래와 같은 결과가 나왔습니다.

     코드   엔지니어
1 A05308 박박박
2 A05308 김김김
3 A05308 최최최
4 A05308 민민민
5 A05308 이이이
6 A05308 마마마
7 A05308 차차차
8 A06182 박박박
9 A06182 김김김
10 A06187 최최최
11 A09141 윤윤윤
12 A09141 민민민

이 내용을 코드별로 그룹정렬해서 엔지니어 이름을 붙여서 정렬하고자 합니다.
ex) A05308  박박박 김김김 최최최 민민민 이이이 마마마 차차차
----------------------------------

==================================
답변
----------------------------------
SELECT corp_cd,
       LTRIM(SYS_CONNECT_BY_PATH(engineer_nm,','),',') engineer_nm
  FROM
(
  SELECT ROW_NUMBER() OVER (PARTITION BY corp_cd ORDER BY engineer_nm ) NUM
       , corp_cd
       , engineer_nm
       , COUNT(*) OVER (PARTITION BY corp_cd) gCnt
    FROM mantb_engineer
)
 WHERE LEVEL = gCnt
 START WITH NUM=1
 CONNECT BY PRIOR corp_cd = corp_cd
     AND PRIOR NUM = NUM-1


아래와 같이 정렬됩니다..
한 컬럼에 모든것을 이으실려면 컬럼간에 문자열 결합인자를 사용하시면 됩니다.
corp_cd || LTRIM(SYS_CONNECT_BY_PATH(engineer_nm,','),',')
응용해서 원하는 결과를 얻으시기를~~~

     코드               엔지니어
1  A05308  박박박, 김김김, 최최최, 민민민, 이이이, 마마마, 차차차
2  A06182  박박박, 김김김
3  A06187  최최최
4  A09141  윤윤윤, 민민민

ORDER BY 구문이 없으면 ERROR가 나네요 추가해서 수정했습니다.


 ------------------------------

2012년 10월 29일 추가

SELECT 한 데이터를 세로로 아닌 가로로 표현해야 될 때가 있다. 

그런 경우에 사용하는 쿼리이다.

     WITH TABLE1 AS

    (
      SELECT '01' AS COLUMN1 FROM dual
      UNION ALL 
      SELECT '03' AS COLUMN1 FROM dual
      UNION ALL 
      SELECT '05' AS COLUMN1 FROM dual
      UNION ALL 
      SELECT '08' AS COLUMN1 FROM dual
    )
     
    SELECT SUBSTR(REPLACE(XMLAGG(XMLELEMENT("nm", ', ' || COLUMN1)).EXTRACT('//text()').GetStringVal(), ', , ', NULL), 3)
      FROM TABLE1;

보면 데이터를 XMLELMENT로 바꾼 다음에 그걸 XMLAGG로 싸준 방식이다.

이런 식으로 하면 데이터는 아래와 같이 나온다.

01, 03, 05, 08

그런데 오라클이 10인지 11인지가 되면서 함수가 하나 생겼다.

바로 WM_CONCAT인데 아주 강력하다.

 SELECT SUBSTR(REPLACE(XMLAGG(XMLELEMENT("nm", ', ' || COLUMN1)).EXTRACT('//text()').GetStringVal(), ', , ', NULL), 3)
      FROM TABLE1;

이 부분을

SELECT WM_CONCAT(COLUMN1) FROM TABLE1;

이렇게만 변경하면 바로 원하는 결과 값이 나온다.

---------------------------------------------------------------------------------------------
오라클 클럽에서 아주 제대로 된 예제를 봐서 추가로 올린다.

WITH t(type, name,code) AS
(
SELECT 'A', '사과', '0' FROM dual
UNION ALL SELECT 'A', '레몬', '1' FROM dual
UNION ALL SELECT 'A', '포도', '2' FROM dual
UNION ALL SELECT 'A', '참외', '3' FROM dual
)
SELECT type
     , SUBSTR(XMLAgg(XMLElement(x, ',', name) ORDER BY code).Extract('//text()'), 2) name_9i
     , SUBSTR(XMLAgg(XMLElement(x, ',', code) ORDER BY code).Extract('//text()'), 2) code_9i
     , wm_concat(name) name_10g
     , wm_concat(code) code_10g
     , ListAgg(name, ',') WITHIN GROUP(ORDER BY code) name_11g
     , ListAgg(code, ',') WITHIN GROUP(ORDER BY code) code_11g
  FROM t
 GROUP BY type
;

블로그 이미지

요다할아범

,