반응형


출처 : http://ukja.tistory.com/232 에서 퍼온 자료입니다.



특정 Query를 수행한 후, 그 결과를 가로 형태가 아닌 세로 형태로 보기 좋게 출력하고 싶다. Tom Kyte가 멋지게 이 작업을 해냈는데, 핵심은 DBMS_SQL 패키지를 이용한 Dynamic SQL에 있다. 

create or replace procedure print_table( p_query in varchar2 )
AUTHID CURRENT_USER
is
    l_theCursor     integer default dbms_sql.open_cursor;
    l_columnValue   varchar2(4000);
    l_status        integer;
    l_descTbl       dbms_sql.desc_tab;
    l_colCnt        number;
begin
      dbms_sql.parse(  l_theCursor,  p_query, dbms_sql.native );
    dbms_sql.describe_columns
    ( l_theCursor, l_colCnt, l_descTbl );

    for i in 1 .. l_colCnt loop
        dbms_sql.define_column
        (l_theCursor, i, l_columnValue, 4000);
    end loop;

    l_status := dbms_sql.execute(l_theCursor);

    while ( dbms_sql.fetch_rows(l_theCursor) > 0 ) loop
        for i in 1 .. l_colCnt loop
            dbms_sql.column_value
            ( l_theCursor, i, l_columnValue );
            dbms_output.put_line
            ( rpad( l_descTbl(i).col_name, 30 )
              || ': ' ||
              l_columnValue );
        end loop;
        dbms_output.put_line( '-----------------' );
    end loop;
exception
    when others then
     raise;
end;
/


약간의 귀찮은 코딩이 필요하지만 그 효과는 입이 딱 벌어질 정도이다. 다음과 같이 아주 보기 편하게 데이터를 출력할 수 있다. 


SYSTEM> grant execute on print_table to public;

SYSTEM> create public synonym print_table for scott.print_table;



UKJA@ukja116> set serveroutput on
UKJA@ukja116> 
UKJA@ukja116> exec print_table('select * from v$session where sid = userenv(''sid'')');
SADDR                         : 35065B10                                        
SID                           : 127                                             
SERIAL#                       : 557                                             
AUDSID                        : 6755975                                         
PADDR                         : 35A94D88                                        
USER#                         : 88                                              
USERNAME                      : UKJA                                            
COMMAND                       : 3                                               
OWNERID                       : 2147483644                                      
TADDR                         :                                                 
...                             
CREATOR_SERIAL#               : 140                                             
-----------------                                                               

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.20


참고로, 나는 print_table 함수를 접하는 순간 Toad가 더 이상 불필요하게 되었다. 

DBMS_SQL 패키지를 이용한 Dynamic SQL 구현은 너무 강력하다. 아래는 내가 실제로 테스트를 할 때 많이 사용하는 간단한 PL/SQL Script이다. Column이 50개 이상 존재하는  V$SQL_SHARED_CURSOR 뷰에서 값이 'Y'인 것만 뽑아서 예쁘게 출력하고 싶기 때문이다. 

-- my shared cursor
/*
declare
  c         number;
  col_cnt   number;
  col_rec   dbms_sql.desc_tab;
  col_value varchar2(4000);
  ret_val    number;
begin
  c := dbms_sql.open_cursor;
  dbms_sql.parse(c,
      'select q.sql_text, s.*
      from v$sql_shared_cursor s, v$sql q
      where s.sql_id = q.sql_id
          and s.child_number = q.child_number
          and q.sql_text like ''&1''',
      dbms_sql.native);
  dbms_sql.describe_columns(c, col_cnt, col_rec);

  for idx in 1 .. col_cnt loop
    dbms_sql.define_column(c, idx, col_value, 4000);
  end loop;


  ret_val := dbms_sql.execute(c);

  while(dbms_sql.fetch_rows(c) > 0) loop
    for idx in 1 .. col_cnt loop
      dbms_sql.column_value(c, idx, col_value);
      if col_rec(idx).col_name in ('SQL_ID', 'ADDRESS', 'CHILD_ADDRESS',
                    'CHILD_NUMBER', 'SQL_TEXT') then
        dbms_output.put_line(rpad(col_rec(idx).col_name, 30) ||
                ' = ' || col_value);
      elsif col_value = 'Y' then
        dbms_output.put_line(rpad(col_rec(idx).col_name, 30) ||
                ' = ' || col_value);
      end if;

    end loop;

    dbms_output.put_line('--------------------------------------------------');

   end loop;

  dbms_sql.close_cursor(c);

end;
/


만일 이러한 수고없이 V$SQL_SHARED_CURSOR 뷰를 보려고 하면, 곧 좌절하고 말 것이다. 아래 데이터를 보면서 좌절감을 잠깐 맛보자...

UKJA@ukja116> col sql_id new_value v_sql_id
UKJA@ukja116> 
UKJA@ukja116> select sql_id from v$sql where sql_text like 
    'select /* cursor_share */ * from t1%';

SQL_ID                                                                          
-------------                                                                   
2zu6xb9130t89                                                                   

Elapsed: 00:00:00.07
UKJA@ukja116> 
UKJA@ukja116> set serveroutput on
UKJA@ukja116> exec print_table( -
        'select * from v$sql_shared_cursor where sql_id = ''&v_sql_id''');
SQL_ID                        : 2zu6xb9130t89                                   
ADDRESS                       : 2867E250                                        
CHILD_ADDRESS                 : 2FABDDD8                                        
CHILD_NUMBER                  : 2                                               
UNBOUND_CURSOR                : N                                               
SQL_TYPE_MISMATCH             : N                                               
OPTIMIZER_MISMATCH            : N                                               
OUTLINE_MISMATCH              : N                                               
STATS_ROW_MISMATCH            : N                                               
LITERAL_MISMATCH              : N                                               
FORCE_HARD_PARSE              : N                                               
EXPLAIN_PLAN_CURSOR           : N                                               
BUFFERED_DML_MISMATCH         : N                                               
PDML_ENV_MISMATCH             : N                                               
INST_DRTLD_MISMATCH           : N                                               
SLAVE_QC_MISMATCH             : N                                               
TYPECHECK_MISMATCH            : N                                               
AUTH_CHECK_MISMATCH           : N                                               
BIND_MISMATCH                 : N                                               
DESCRIBE_MISMATCH             : N                                               
LANGUAGE_MISMATCH             : N                                               
TRANSLATION_MISMATCH          : N                                               
ROW_LEVEL_SEC_MISMATCH        : N                                               
INSUFF_PRIVS                  : N                                               
INSUFF_PRIVS_REM              : N                                               
REMOTE_TRANS_MISMATCH         : N                                               
LOGMINER_SESSION_MISMATCH     : N                                               
INCOMP_LTRL_MISMATCH          : N                                               
OVERLAP_TIME_MISMATCH         : N                                               
EDITION_MISMATCH              : N                                               
MV_QUERY_GEN_MISMATCH         : N                                               
USER_BIND_PEEK_MISMATCH       : N                                               
TYPCHK_DEP_MISMATCH           : N                                               
NO_TRIGGER_MISMATCH           : N                                               
FLASHBACK_CURSOR              : N                                               
ANYDATA_TRANSFORMATION        : N                                               
INCOMPLETE_CURSOR             : N                                               
TOP_LEVEL_RPI_CURSOR          : N                                               
DIFFERENT_LONG_LENGTH         : N                                               
LOGICAL_STANDBY_APPLY         : N                                               
DIFF_CALL_DURN                : N                                               
BIND_UACS_DIFF                : N                                               
PLSQL_CMP_SWITCHS_DIFF        : N                                               
CURSOR_PARTS_MISMATCH         : N                                               
STB_OBJECT_MISMATCH           : N                                               
CROSSEDITION_TRIGGER_MISMATCH : N                                               
PQ_SLAVE_MISMATCH             : N                                               
TOP_LEVEL_DDL_MISMATCH        : N                                               
MULTI_PX_MISMATCH             : N                                               
BIND_PEEKED_PQ_MISMATCH       : N                                               
MV_REWRITE_MISMATCH           : N                                               
ROLL_INVALID_MISMATCH         : N                                               
OPTIMIZER_MODE_MISMATCH       : N                                               
PX_MISMATCH                   : N                                               
MV_STALEOBJ_MISMATCH          : N                                               
FLASHBACK_TABLE_MISMATCH      : N                                               
LITREP_COMP_MISMATCH          : N                                               
PLSQL_DEBUG                   : N                                               
LOAD_OPTIMIZER_STATS          : N                                               
ACL_MISMATCH                  : N                                               
FLASHBACK_ARCHIVE_MISMATCH    : N                                               
LOCK_USER_SCHEMA_FAILED       : N                                               
REMOTE_MAPPING_MISMATCH       : N                                               
LOAD_RUNTIME_HEAP_FAILED      : N                                               
-----------------                                                               

PL/SQL procedure successfully completed.


너무 많은 데이터때문에 분석하는 시간이 즐거운 시간이 아니라 고생스러운(주로 눈이) 시간이 되어 버린다. 하지만 다음과 같이 간단하게 이 문제를 해결할 수 있다. 

UKJA@ukja116> @shared_cursor 'select /* cursor_share */%'
SQL_TEXT                       = select /* cursor_share */ * from t1 where c1 = 
:b1                                                                             
SQL_ID                         = 2zu6xb9130t89                                  
ADDRESS                        = 2867E250                                       
CHILD_ADDRESS                  = 2DCB06D0                                       
CHILD_NUMBER                   = 0                                              
OPTIMIZER_MODE_MISMATCH        = Y                                              
--------------------------------------------------                              
SQL_TEXT                       = select /* cursor_share */ * from t1 where c1 = 
:b1                                                                             
SQL_ID                         = 2zu6xb9130t89                                  
ADDRESS                        = 2867E250                                       
CHILD_ADDRESS                  = 2DD0DB6C                                       
CHILD_NUMBER                   = 1                                              
BIND_MISMATCH                  = Y                                              
--------------------------------------------------                              
SQL_TEXT                       = select /* cursor_share */ * from t1 where c1 = 
:b1                                                                             
SQL_ID                         = 2zu6xb9130t89                                  
ADDRESS                        = 2867E250                                       
CHILD_ADDRESS                  = 2FABDDD8                                       
CHILD_NUMBER                   = 2                                              
--------------------------------------------------                              

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.04


이런 간단하지만 아름다운 결과들이 엔지니어라면 누구나 남을 한번쯤은 놀라게 할 만한 프로그래밍 실력이 필요한 이유이다. 



출처: http://ukja.tistory.com/232 [오라클 성능 문제에 대한 통찰 - 조동욱]

출처: http://ukja.tistory.com/232 [오라클 성능 문제에 대한 통찰 - 조동욱]

반응형
반응형

여러가지 방법이 있겠지만

 

엑셀에서 HTML 문서를 읽을 수 있다는 점에 착안해서 구현한 방법입니다.

 

HTML로 테이블을 하나 만들어서 출력해버리면 엑셀에서 그대로 뿌려주는게 가능합니다.

 

1. HTML 헤더부 생성

2. 본문에 테이블 및 데이터 출력

3. HTML 푸터부 생성

4. spool할때 spool 파일의 확장자를 xls로 출력

 

PS. 데이터 항목에 엑셀 함수를 뿌리면 엑셀에서 불러왔을때 해당 함수가 수행됩니다.

 

 

 

 

UTL_FILE.PUT_LINE(v_FileHandle, '<html>');
UTL_FILE.PUT_LINE(v_FileHandle, '<head>');
UTL_FILE.PUT_LINE(v_FileHandle, '<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">');
UTL_FILE.PUT_LINE(v_FileHandle, '<meta name="generator" content="SQL*Plus 10.2.0">');
UTL_FILE.PUT_LINE(v_FileHandle, '<style type=''text/css''> body {font:10pt Arial,Helvetica,sans-serif; color:black; background:White;} p {font:10pt Arial,Helvetica,sans-serif; color:black; background:White;} table,tr,td {font:10pt Arial,Helvetica,sans-serif; color:Black; background:#f7f7e7; padding:0px 0px 0px 0px; margin:0px 0px 0px 0px;} th {font:bold 10pt Arial,Helvetica,sans-serif; color:#336699; background:#cccc99; padding:0px 0px 0px 0px;} h1 {font:16pt Arial,Helvetica,Geneva,sans-serif; color:#336699; background-color:White; border-bottom:1px solid #cccc99; margin-top:0pt; margin-bottom:0pt; padding:0px 0px 0px 0px;} h2 {font:bold 10pt Arial,Helvetica,Geneva,sans-serif; color:#336699; background-color:White; margin-top:4pt; margin-bottom:0pt;} a {font:9pt Arial,Helvetica,sans-serif; color:#663300; background:#ffffff; margin-top:0pt; margin-bottom:0pt; vertical-align:top;}</style><title>SQL*Plus Report</title>');
UTL_FILE.PUT_LINE(v_FileHandle, '</head>');
UTL_FILE.PUT_LINE(v_FileHandle, '<body>');
UTL_FILE.PUT_LINE(v_FileHandle, '<p>');
UTL_FILE.PUT_LINE(v_FileHandle, '<table border=''1'' width=''90%'' align=''center'' summary=''Script output''>');

 

 

<위와 같이 HTML 헤더부를 생성>
 
 
 
 FOR data_rec IN GET_DATA_01 LOOP
UTL_FILE.PUT_LINE(v_FileHandle, '<tr>');
UTL_FILE.PUT_LINE(v_FileHandle, '<td>');
        UTL_FILE.PUT_LINE(v_FileHandle,data_rec.TX_DATE);
UTL_FILE.PUT_LINE(v_FileHandle, '</td>');
UTL_FILE.PUT_LINE(v_FileHandle, '<td align="right">');
        UTL_FILE.PUT_LINE(v_FileHandle,data_rec.TOT);
UTL_FILE.PUT_LINE(v_FileHandle, '</td>');
UTL_FILE.PUT_LINE(v_FileHandle, '<td align="right">');
        UTL_FILE.PUT_LINE(v_FileHandle,data_rec.CARD);
UTL_FILE.PUT_LINE(v_FileHandle, '</td>');
UTL_FILE.PUT_LINE(v_FileHandle, '<td align="right">');
        UTL_FILE.PUT_LINE(v_FileHandle,data_rec.CAPI);
UTL_FILE.PUT_LINE(v_FileHandle, '</td>');
UTL_FILE.PUT_LINE(v_FileHandle, '<td align="right">');
        UTL_FILE.PUT_LINE(v_FileHandle,data_rec.DUP);
UTL_FILE.PUT_LINE(v_FileHandle, '</td>');
UTL_FILE.PUT_LINE(v_FileHandle, '<td align="right">');
        UTL_FILE.PUT_LINE(v_FileHandle,data_rec.NODATA);
UTL_FILE.PUT_LINE(v_FileHandle, '</td>');
UTL_FILE.PUT_LINE(v_FileHandle, '<td align="right">');
        UTL_FILE.PUT_LINE(v_FileHandle,data_rec.YESDATA);
UTL_FILE.PUT_LINE(v_FileHandle, '</td>');
UTL_FILE.PUT_LINE(v_FileHandle, '<td align="right">');
        UTL_FILE.PUT_LINE(v_FileHandle,data_rec.CORRATE);
UTL_FILE.PUT_LINE(v_FileHandle, '</td>');
UTL_FILE.PUT_LINE(v_FileHandle, '<td align="right">');
v_Rows := v_Rows + 1;
    END LOOP;
 
<커서를 사용한 데이터 출력부>
 
 
 
UTL_FILE.PUT_LINE(v_FileHandle, '</table>');
UTL_FILE.PUT_LINE(v_FileHandle, '<p>');
UTL_FILE.PUT_LINE(v_FileHandle, '</body>');
UTL_FILE.PUT_LINE(v_FileHandle, '</html>');
 
<HTML 문서의 푸터부를 구현>
반응형
반응형

 
 ADOBE ACROBAT 8 Professional 에서

개관

Adobe® Acrobat®의 Form 기능에 익숙해져 있다면 form 도구 모음에 바코드 모양의 아이콘이 새로 생긴 것을 이미 봤을지도 모른다. 이는 2차원 바코드 오브젝트로, LiveCycle® 바코드 form 이면의 기술이다.
LiveCycle® 바코드 Form은 2D 바코드 기술을 사용하여 프린트되는 form으로부터 사용자 공급 데이터를 자동으로 캡처한다. 이는 OCR(Optical Character Recognition) 혹은 매뉴얼 데이터 엔트리를 사용하여 용지 기반 form을 처리해야 하는 요구사항을 배제한다. form 사용자는 단지 무료 Adobe Reader®를 이용, 그들의 form을 완성, 프린트, 서명한 후 팩스나 메일로 제출하기만 하면 된다. 몇몇 경우에, form 작성자는 최종사용자가 디지털 서명을 동반한 전자 제출이나 잉크 서명이 되어있는 지면상의 제출 중에서 선택할 수 있는 기회도 제공할 수 있게 된다.


2D 바코드가 실시간으로 데이터를 어떻게 캡처하는지 보려면 이 작은 form 견본 내의 정보를 변경해 보라.
바코드는 수정하고 필드를 나갈(예를 들어, Tab키를 사용하여) 때마다 변경될 것이다. 그 데이터 자체는 탭지정된, 자신만의 일상적 포맷이나 심지어 XML을 포함하는 방대한 포맷 내에 저장될 수 있다.




2D 바코드 적용하기

2D 바코드를 적용하기 이전에, 인쇄 전 작성될 수 있는 PDF Form(작성-인쇄 PDF Form)을 제작해야 할 필요가 있다. 만약 이미 그러한 form을 가지고 있다면, 인쇄-작성 form(인쇄된 후 필기로 작성된)을 열고 form 메뉴에서 새로운 “Run Form Field Recognition”을 사용하라. 이는 요구되는 위치에서 자동으로 필드를 생성하는 전체적인 form을 스캔할 것이다.
문자 그대로 금방 지면상의 form을 작성-인쇄 form으로 전환할 수 있다.


만약 Form 도구 모음이 아직 작업공간에 보이지 않는다면, Tools를 클릭한 후, Form, 그리고 마지막으로 “Show Forms Toolbar”를 클릭한다. 이렇게 하면 빠르고 쉽게 추가 필드를 생성하고, 기존의 것을 수정하여 2D 바코드를 적용할 수 있도록 해 줄 것이다.
form을 있는 그대로 배포해 수동으로 데이터를 입력하는 데 많은 시간과 돈을 쓰기보다는 작성-인쇄 form을 가지고 2D 바코드를 추가하여 데이터를 캡처해 수동 자료 기재에 대한 필요를 완전히 없앨 수도 있다.


바코드 툴을 선택하기 전에, 최종 사용자들이 제공하기를 기대하는 것을 반영하기 위한 가능한 많은 샘플 데이터로 자신의 form을 작성하는지를 확인하라.
2D 바코드를 적용할 수 있는 여러분의 form에서 빈공간을 찾아라. 요구되는 물리적 공간은 사용시 여러분이 계획하는 바코드 타입에 의존될 것이다. 여러분이 PDF417을 선택한다면, 높이보다 너비가 큰 직사각형 모양 이 필요할 것이며 DataMatrix뿐 아니라 QRCode의 경우는 정사각형 공간이 필요할 것이다.




Forms 도구 모음의 바코드 아이콘을 클릭하면 십자선 커서를 보게 될 것이다. 페이지에서 개방 구역을 선택 하고 텍스트 영역과 같은 방식으로 바코드를 “그리기”한다. 마우스 버튼을 뗀 후 보이는 첫 번째 화면에서 OK 버튼을 클릭하기 전에, 주의사항을 반드시 읽는다. “별개의 라이선스가 요구됨”이라는 문구를 보게 될 것 이다. 이 기술을 이용하기 위해 가능한 라이선스 요구사항이 있다는 점에 주의할 필요가 있다.
뒤에서 라이선 스 사용 케이스의 샘플을 더 제공할 예정이다.


일단 바코드가 그려지면, 특징 상자(properties box)가 나타나고 2D 바코드가 form 상에 렌더될 것이다. 만약 견본 데이터가 바코드가 생성되기 이전에 주입되지 않는다면 바코드 크기에 문제가 있을 수 있다는 주의사항을 알려줄 것이다. 견본 데이터 주입은 실제로 Adobe® Acrobat®이 모든 form 데이터를 보관 하도록 요구되는 바코드의 크기를 측정하도록 시도될 중요한 단계이다. 사실, 렌더된 바코드는 여러분이 도안했던 정확한 크기가 아닐지도 모른다.




Barcode Properties 바코드 특징(기능)들

General 탭에서 자동으로 산출되는 것이 적합하지 않다면 그 바코드에 대한 이름을 간단하게 제공할 필요가 있다.

Options 탭에서는 어떠한 바코드 기호를 쓸 것인지 결정한다. 각각의 기호는 그 구역이 자주 선택을 한정짓지만 특이한 특징들을 가지고 있다. 예를 들어, PDF417은 북미 지역에 대한 사실상의 기준이며 QRCode는 일본처럼 2바이트 문자 집합 언어를 사용하는 나라에서 더 인기가 많다. Adobe's decoder를 사용할 계획이 있다면 압축 옵션을 켜야만 한다. 압축 옵션을 켜놓은 상태에서, 데이터는 바코드로 렌더되기 전에 “편평화” 압축된다, 그러면 수동-스캐너나 제3자 바코드 판독기가 그 데이터를 해독할 수 없을지도 모른다.


디코드(판독) 조건은 바코드의 가장 중요한 설정 중 하나일 수도 있다. 작성-인쇄된 문서들을 실제로 받아 문서 스캐너로 스캔할 계획이라면, 문서 스캐너를 선택하라. 그 문서들을 팩스로 보낼 예정이라면, 디코드 조건으로 “팩스 서버(Fax Server)”를 선택해야 한다. 이 세팅은 바코드 크기 지정과 오류 수정 특징을 자동으로 변경하여 손상될지라도 디코드되도록 해준다. 바코드 크기 지정과 오류 수정을 변경하도록 해줄 수 있는 “Custom” 버튼이 있지만 바코드 기호에 익숙하고 여러분의 from 작업 흐름을 지원하는 특정한 변경 사항을 생성해야 하지 않다면 이러한 값들을 변경할 것을 권하지는 않을 것이다. 예를 들어, 오류 수정 레벨 을 2까지 줄이면 바코드에 상당히 더욱 많은 데이터를 입력할 수 있음을 알 수 있을 것이다. 그러나, 디코드 될 수 없는 바코드를 더욱 선호할 수도 있고 판독률은 극히 낮을 수도 있다.


Value 탭은 데이터가 어떻게 인코드되어야 하는지 뿐만 아니라 바코드에 포함되는 아이템들을 선택할 수 있게 해준다. “Encode using…”을 선택하면 자동으로 데이터가 인코드될 것이다.
또한 “Custom calculation script”를 선택하면 자신만의 스크립트를 쓸 수도 있다. 자동화된 경로를 택한다면 , Tab Delimited 포맷을 선택하여 어떠한 영역이 포함될지를 “Pick” 버튼을 클릭하여 선택한다. XML을 인코 딩 방식으로 쓸 수 있지만 delimited 포맷에 비하여 바코드 내에 더욱 많은 공간을 차지할 것이라는 점을 주의해야 할 것이다.

XML 인코딩
John Smith

Tab Delimited 인코딩
FirstName LastName
John Smith


”Tab Delimited”를 선택하면 데이터를 따라 영역 명칭을 포함하는 옵션을 가질 수 있다. 이는 form이 디코드 될 때에 다른 포맷으로 변환을 쉽게 할 수도 있다.
여러분이 바코드 내의 커스텀 코딩을 위한 선택을 한다면 순서에 맞는 영역과 여러분이 선택한 포맷을 암호 화할 수 있다.

Custom Calculation Script
event.value = this.getField(“FirstName”).value + “,” +
this.getField(“LastName”).value + “,” + this.getField(“Init”).value;





크기와 용량

바코드가 회색 상자로 변하는 것을 감지하였다면, 이는 바코드 내에 가능한 용량보다 더 많은 데이터를 입력 했음을 나타내는 것이다. 바코드 내에 포함된 영역의 수를 줄이고 싶거나 바코드 자체의 크기를 키우고 싶어 할 수도 있다. PDF나 그 자리(location) 내에 사용할 수 있는 바코드 수에는 제한이 없다는 점을 명심하여야 한다. 예를 들어, 4쪽짜리 문서에서, 4쪽의 바코드는 1에서 2쪽까지의 데이터를 캡처할 수 있고 4쪽의 두 번 째 바코드는 3에서 4쪽에 걸쳐 남아있는 데이터를 캡처할 수 있다.

바코드의 용량은 오류 수정, 크기, 내용을 포함하는 요인들의 수에 따라 정해진다. “fax” 기반 오류 수정 기능 이 있는 너비 3인치, 높이 1인치의 PDF417 바코드는 대략 300개의 대문자를 수용할 수 있다. “문서 스캐너” 기반 오류 수정이 되는 너비 7인치, 높이 1인치의 PDF417 바코드는 대략 1688개의 대문자를 수용할 수 있다. 2D 바코드의 모든 개념을 이해할 필요가 없다면, 여러분의 모든 form 영역에 대하여 최대 길이를 생성하고 다양한 데이터 타입의 form을 실험해 바코드가 절대 “grays out”되지 않는다는 확인해야 한다. 정상적 표현 을 사용하여 영역 내로 들어가는 데이터의 타입을 제한하고 싶을 수도 있다. 훌륭한 용량 실험은 문자 “HeLlO1Y3!”을 반복하여 최대 길이로 모든 영역을 채워가는 것이다. 이렇게 하면 바코드 인코더가 다양한 암 호화 방식을 전환해 가며 차례로 면밀히 바코드 용량을 테스트할 것이다. 그러나 사용자가 실제로 입력하는 것보다 더 많은 데이터를 인코드할 것이다.




Adobe® Acrobat® Standard 혹은 Professional 작업 흐름

여러분이 생성하는 form이 Adobe® Acrobat® Standard 혹은 Professional 을 사용하여 작성되고 인쇄될 예 정이라면, 어떠한 추가적 사용 허가(licensing) 과정도 요구되지는 않는다. Standard나 Professional에서 인 쇄할 경우, 2D 바코드들은 평문(plain text) 포맷 내에 나타난다. 바코드 기능들 내에서 데이터 압축을 켜지 않는 한, 핸드 헬드 스캐너를 포함하는 2D 기호를 읽어낼 수 있는 어떠한 판독기를 사용해도 그 바코드를 읽 어낼 수 있을 것이다.
만약 이미 고속 문서 스캐너를 가지고 있는 경우라면, 내장된 2D 바코드 판독 기능을 가지고 있을 것이다. 만 약 판독기를 가지고 있으면, Adobe® LiveCycle® Barcoded Forms Decoder를 구하면 된다.
Adobe® Acrobat® Standard 또는 Professional 기반의 작업 흐름 내에서, 여러분은 판독기만을 필요로 할 것이다.
여러분이 form을 발행하고 무료 Adobe® Reader®를 사용하여 작성하고 인쇄하기를 바라지 않는다면, 어떠 한 form도 사용 허가를 할 필요는 없을 것이다.




Adobe® Reader® 작업 흐름

여러분이 제작한 2D 바코드 PDF가 무료 Adobe Reader®를 사용하여 작성되어 인쇄될 예정이라면 라이선스 가 요구된다. 그 form이 사용 허가가 되어 읽지 않다면, 작성-인쇄 form이 작성되어 저장될 때에, 그 바코드는 암호화되어 판독될 수 없다. 그 2D 바코드가 핸드 스캐너로 스캔된다면, 긍정적인 판독을 산출하겠지만 그 결과는 왜곡된 데이터일 것이다. 고속 스캐너에 장착된 것과 같은 소프트웨어 기반 판독기의 경우도 그 결과 는 마찬가지일 것이다.

라이선스를 받았다면, 바코드 기능 내에 데이터 압축을 켜지 않는 한, 핸드 헬드 스캐너를 비롯, 2D 기호를 판독할 수 있는 어떠한 판독기를 사용해도 그 바코드를 읽어낼 수 있을 것이다. 바코드 부호는 form 디자이너에 의해 작동되거나 꺼질 수 있는 “특징”이 아닌, 단순히 하나의 인증 메커니즘 일 뿐이다.




Adobe® Reader® Workflow를 위한 Form Deployment(배치)

인증된 작성-인쇄 바코드 DFform은 Adobe®
LiveCycle® Reader Extensions를 사용하는 배치에 대하 여 준비되어 그 form의 2D 기능을 가능케 한다. 2D “right(저작권)”을 필요로 하는 파일을 선택하여 간편 사 용 웹 기반 인터페이스를 사용하여 업로드한다. 활성화하 기를 바라는 권리들을 선택하고 Adobe® LiveCycle® Reader Extensions는 확장된 바코드 PDF form을 생성하 여 고객이나 구성 요원에 배포하도록 해준다.

만약 이미 Adobe® LiveCycle® Reader Extensions를 가지고 있으며 Adobe® LiveCycle® Barcoded Forms 라이선스와 함께 주문하지 않을 예정이라면, Adobe® LiveCycle® Reader Extensions의 번들 버전은 추가 비 용 청구를 하지는 않는다. 이 번들 버전은 소프트웨어 ‘권 리'를 제공하여 PDF form상의 2D 기능을 활성화한다. 이 는 save-off-line과 같은 다른 Adobe® LiveCycle® Reader Extensions 저작권을 포함하지는 않는다.

Adobe® LiveCycle® Reader® Extensions를 이미 소유 하고 있거나 Adobe's LiveCycle® Barcoded Forms 라이 선스로 이를 주문하려고 하는 경우라면, PDF form상의 2D 기능을 가능케 하고 save-off-line, 주석달기 (commenting)뿐 아니라 많은 다른 기능과 같은 Adobe® LiveCycle® Reader Extensions의 모든 특징들이 소프트 웨어 “저작권”과 함께 제공될 것이다.
 

“전자 제출은 어떠한가?”

만약 최종 사용자가 여러분의 form을 인쇄하는 대신에 전 자상으로 제출하게 하는 옵션이 있다면, 반드시 트리를 저장하라. LiveCycle® Barcoded Forms는 인쇄되어야 하는 form에 적용되도록 되어 있다. 이는 잉크 혹은 복합 잉크 서명 법률 요구조건, 추가 부록물, 심지어는 고객이 나 내부 작업 흐름 선호도 등을 포함하는 어떠한 수의 근 거를 위한 것일 수 있다.
2D 바코드식 PDF form들은 훌륭한 과도적 stepping- stone 또는 bridge 기술을 만들어낸다. 지면의 form을 가 지고 있고 전자 포맷으로 변환하고 싶지만 여러분의 체계 에 있어서는 너무 ”과도한” 변화일지도 모른다고 생각이 든다면, 2D로 데이터 엔트리 제거를 시작하고 하부구조가 그에 준비가 되면 전자 제출형식으로 옮기기만 하면 된다 . 소모적인 수동 자료 기재를 없애는 동안 기존의 용지 기반 작업 흐름을 높이 평가하게 될 것이다.





“OCR 은 어떤가?”

OCR 혹은 ICR(Intelligent Character Recognition)은 어떤 경우에는 훌륭할 수 있지만 100% 신뢰성이 높은 것은 아니다. TAWPI 연구에서, OCR이 90%의 정확성으로 form 데이터를 캡처하는 최상의 경우가 있음이 판 명되었고, 이는 그야말로 최상의 케이스이다. 이는 조직 내부로 들어오는 데이터 중 최소 10%가 부정확하며 수동으로 처리되어야 할 필요가 있음을 의미한다. 일반적으로 이는 검증 혹은 유효화 단계라 명명된다. 2D 바코드가 일련의 오류 가능성을 제시하지 않기 때문에, 만약 그 바코드를 판독할 수 있다면 수동 검증 혹은 유효화 단계들을 없앤 100% 정확성을 가진 데이터의 100%를 보유한다는 점을 확신할 수 있다.

원문출처 :

http://www.adobe.com/devnet/livecycle/ barcodedforms/articles/acrobat_8_and_barcoded_forms.pdf

더 많은 정보를 원하시면 :

Adobe® LiveCycle® Barcoded Forms Datasheet

Adobe® LiveCycle®Reader Extension Datasheet

출처 : http://www.acrobatpdf.com/tip/detail_02.asp?id=15&gotopage=7&code=

반응형
반응형
 ADOBE ACROBAT 8 Professional 에서
Acrobat 강의를 하다 보면 가장 많이 듣는 질문이 있는데, 그 중에서도 유독 많은 질문이 문서 변환과 관련한 것입니다. 왜 문서 형태가 찌그러지는가? 글꼴이 깨질 때는 어떻게 하는가? 변환된 PDF 문서가 수정이 안 되는 이유는? 뭐 이런 것들입니다.
이 글에서는 그 중에서도 웹 페이지를 PDF 문서로 변환할 때 주의점과 요령에 대해 설명하겠습니다.
웹 페이지를 PDF로 만드는 방법은 두 가지가 있습니다. 인터넷 익스플로러 도구 모음에 있는 변환 버튼을 누르는 것과 인쇄 버튼을 눌러 프린터를 Adobe PDF로 선택하여 만드는 것이죠. 문제는 이 두 가지 방법의 결과가 확연히 다르다는 점입니다.
인터넷 익스플로러 도구 모음의 변환 버튼을 눌러 PDF 문서를 만들면 플래시와 같은 미디어 요소도 포함됩니다. 이미지나 텍스트도 수정할 수 있게 같이 변환되는 장점이 있지요. 하지만 표준 HTML 태그로 만들어진 웹 페이지가 아니라면 문서 형태가 유지되기가 매우 어렵습니다. 인쇄 버튼을 눌러 PDF 문서를 만들면 종이에 프린트할 때처럼 원본에 가까운 형태대로 저장할 수 있습니다. 대신에 문서 전체가 한 가지 속성으로 변환되기 때문에 수정이 불가능한 단점이 있는 것이지요.
그렇다면 어떤 방법을 써야 하는 걸까요?
상황에 가장 맞는 방법을 선택하는 것 밖에는 정답이 없습니다. 일단 공통으로 해야 할 일은 ‘페이지 설정'입니다. PDF 컨버팅, PDF 인쇄 모두 페이지 크기에 맞추어 만들어진다는 점에 주목해야 합니다.




‘페이지 설정' 창을 열어보면 용지 크기가 ‘A4'가 기본값으로 설정되어 있을 것입니다. 문서 형태가 찌그러지는 결과의 상당 부분을 차지하는 이유이기도 합니다. 이것을 위 그림과 같이 ‘Oversize' 크기로 바꾸어 줍니다. 이렇게만 하고서 PDF 변환이나 인쇄를 해도 상당한 효과를 볼 것입니다.





그런데 이와 같이 페이지 설정을 하고 컨버팅이 아닌 인쇄 버튼을 눌러 PDF 문서를 만들면 문제가 약간 생깁니다. 용지 크기가 너무 커 실제로 봐야 할 내용보다 여백이 훨씬 많아진다는 것입니다. 물론 웹 페이지 높낮이를 안다면 정확한 크기를 입력하여 변환하면 상관없는 문제입니다만 그러한 지식이 없는 사용자들도 있으니 다음 방법을 참고하기 바랍니다. 일단 이 문제를 해결하려면 Acrobat 8만 있으면 충분합니다.





도구 ->고급편집을 보면 ‘오려내기 도구'가 있습니다. 그리고 마우스를 이용하여 필요한 부분을 드래그합니다. 영역이 선택되면 키보드의 ‘엔터' 키를 누르면 됩니다.





전체 여백과 선택 영역을 동시에 볼 수 있는 창이 나타납니다 . 필요한 옵션을 선택하고 ‘확인'을 누르면 마무리됩니다.




여기서 한 가지 더 확인을 해 두자면 글꼴에 대해서도 꼭 체크해 주는 센스가 필요하다는 것입니다 . 아무 생각 없이 PDF 문서를 만들면 기본값으로 시스템 글꼴만이 선택되기 때문이죠.
웹 페이지의 높낮이를 안다면 다음 방법을 쓰면 좀 더 간단하게 해결할 수 있습니다 . 먼저 ‘인쇄 기본 설정'에서 ‘Adobe PDF 페이지 크기'의 추가 버튼을 눌러 ‘사용자 정의 용지 크기 추가' 창을 엽니다.




여기에서 ‘용지 크기'를 정해주고 추가/수정 버튼을 누르면 됩니다.




이 밖에도 여러 가지 방법이 있으나 지면 관계상 이 정도로 마무리하겠습니다 . 아무쪼록 Acrobat 을 이용하는 데에 조금이나마 도움이 됐기를 바랍니다.

출처 : http://www.acrobatpdf.com/tip/detail_02.asp?id=14&gotopage=7&code=

반응형
반응형

CREATE OR REPLACE PACKAGE ORHOME.PC_LOG_PROCESSING AS
 PROCEDURE LOG_TRIGGER (LOG_ERROR VARCHAR2);
END PC_LOG_PROCESSING;

CREATE OR REPLACE PACKAGE BODY ORHOME.PC_LOG_PROCESSING AS -- BODY
 PROCEDURE LOG_TRIGGER (LOG_ERROR VARCHAR2) IS
  FILE_HANDLE UTL_FILE.FILE_TYPE;
  BEGIN
   FILE_HANDLE := UTL_FILE.FOPEN('/log','procedure_log','a');
   UTL_FILE.PUT_LINE(FILE_HANDLE,LOG_ERROR);
   UTL_FILE.FCLOSE(FILE_HANDLE);
  EXCEPTION
   WHEN UTL_FILE.INVALID_MODE THEN
   NULL;
   RAISE_APPLICATION_ERROR(-20322,'file invalid mode');
  WHEN UTL_FILE.INVALID_FILEHANDLE THEN
   NULL;
   RAISE_APPLICATION_ERROR(-20322,'file invalid filehandle');
   WHEN OTHERS THEN
   NULL;
 END LOG_TRIGGER;
END PC_LOG_PROCESSING;

반응형
반응형

CHR(9) => DBMS.output에서 탭값 출력하기

엑셀에 바로 붙여넣기 귀찮아서 ... ㅋㅋ;

값을 쉽게 구하자..

 또한 & 표시는 CHR(38) 번.

PL/SQL 구문은 & 표시는 값을 입력받도록 되어 있어

REPLACE 구문으로 입력받은 값을 치환할 때 컴파일이 정상적으로 되지 않을수 있음...



간단한 C...를 통해 CHR값을 출력 할 수 있다.

#include <stdio.h>

void main()
{
   char a='\t';
   printf("%d", a);
}

반응형
반응형

아래와 같이 간단히 SQL PLUS 상에서 설정하면

출력이 이쁘게 나온다

REM
REM Pretty SQLPLUS
REM

SET PAGES 200 LINES 200
SET FEEDBACK OFF

COL OBJECT_TYPE FORMAT A12
COL NAME FORMAT A30




 

 

반응형

'Database > ORACLE' 카테고리의 다른 글

테이블의 주석을 변경해 보자  (0) 2009.03.07
오라클 시스템 모니터링 (Monitoring for Oracle)  (0) 2009.03.07
UNDO TABLESPACE SIZE  (0) 2009.03.07
테이블 스페이스 조회 쿼리  (0) 2009.03.07
SQLPLUS 환경 설정 하기  (0) 2009.03.07

+ Recent posts