/**  *
 * @(#)RefCursor.java  
 *
 *
 * Oracle REF Cursor를 사용해 프로시저에서 여러행을 반환하는 예제
 *
 *
 *
-- 패키지가 헤더 생성
 
* CREATE OR REPLACE PACKAGE ref_cursor_pkg AS
 *  TYPE ref_type IS REF CURSOR;
 *  PROCEDURE ref_cursor_pro(v_result OUT ref_type, v_sql in VARCHAR2);
 * END;

 *
 *
 *
-- 패키지 본문 생성
 * CREATE OR REPLACE PACKAGE BODY ref_cursor_pkg AS
 *  PROCEDURE ref_cursor_pro(v_result OUT  ref_type, v_sql IN VARCHAR2)  AS
 *  begin
 *      OPEN v_result FOR v_sql;
 *  END;
 * END;

 *
 *
 * REF CURSOR는 오라클 PL/SQL에서 여러 레코드의 쿼리 결과를 가져올때 편하게 사용 할 수 있습니다.
 * 이 방법은 Oracle8i 이상에서 실행가능합니다.
 *
 * 아래 예제는 특정 SQL문을 PL/SQL In Parameter로 입력 받아서 쿼리 결과를 Out파라미터로
 * 반환하는 예제 입니다.
 * Java Source를 실행하기 전에 위에 패키지 헤더와 본문을 SQL*Plus에서 먼저 실행해 주세요
 *
 */
 
 
 
import java.sql.*;
import oracle.jdbc.driver.OracleCallableStatement;
import oracle.jdbc.driver.OracleTypes;
 
 
 
public class RefCursor {
 
 
    public static void main(String[] args) {
        RefCursor vTest = new RefCursor();
        vTest.prepareCall();
 
    }
 
    void prepareCall(){

        Connection conn = null
        CallableStatement cstmt = null;
        OracleCallableStatement ocstmt = null;

        try {

            DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
             conn =
            DriverManager.getConnection ("jdbc:oracle:thin:@127.0.0.1:1521:ORACLE", "scott", "tiger");
           
            //Stored Procedure 를 호출하기 위해 JDBC Callable Statement를 사용 합니다
            cstmt =   conn.prepareCall("BEGIN ref_cursor_pkg.ref_cursor_pro(?,?); END;");
           
            //프로시져의 In Parameter로 SELECT문장을 넘깁니다.
            cstmt.setString(2,"SELECT empno, ename FROM emp");
           
            //CallableStatement를 위한 REF CURSOR OUTPUT PARAMETER를
            //OracleTypes.CURSOR로 등록합니다.
            cstmt.registerOutParameter (1, OracleTypes.CURSOR);
           
            //CallableStatement를 실행합니다.
            cstmt.execute ();
           
            //getCursor() method를 사용하기 위해 CallableStatement를
            //OracleCallableStatement object로 바꿉니다.
             ocstmt = (OracleCallableStatement)cstmt;
           
            //OracleCallableStatement 의 getCursor() method를 사용해서 REF CURSOR를
            //JDBC ResultSet variable 에 저장합니다.
            ResultSet cursor =  ocstmt.getCursor (1);
           
            //쿼리결과 empno, ename 출력
            while (cursor.next ()) {
                System.out.print (cursor.getString (1)+"          ");
                System.out.println (cursor.getString (2));
            }
           
        }catch(Exception e){
           
        }finally{
             ocstmt.close();
             cstmt.close();
             conn.close();
        }   
    }
}
 
 
 
/**
 *  샐행
 *  java -classpath .;C:\classes12.zip  RefCursor
 *
 * 7369          SMITH
 * 7521          WARD  
 * 7566          JONES
 * 7654          MARTIN
 * 7698          BLAKE
 * 7782          CLARK
 * 7788          SCOTT
 * 7839          KING  
 * 7844          TURNER
 * 7876          ADAMS
 * 7902          FORD  
 * 7934          MILLER
 */

 

================================================
    *
Oracle Community OracleClub.com
    * http://www.oracleclub.com
    * http://www.oramaster.net
    * 운영자 : 김정식 (oramaster _at_ empal.com)
  ================================================

 

Oracle10g 부터  CONNECT BY 절에서 제공하는

CONNECT_BY_ROOT, SYS_CONNECT_BY_PATH, CONNECT_BY_ISLEAF  기능에 대해서 알아보겠습니다.


CONNECT_BY_ROOT

 - 상관관계 쿼리에서 LEVEL이 0인 최상위 로우의 정보를 얻어 올 수 있습니다.
 
SQL>SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename, empno,
   CONNECT_BY_ROOT  empno "Root empno", level
   FROM emp
   START WITH job='PRESIDENT'
   CONNECT BY PRIOR empno=mgr;
 
ENAME                       EMPNO  Root empno    LEVEL
-------------------- ---------- ----------- ----------
KING                            7839           7839            1
    JONES                     7566           7839            2
        SCOTT                 7788           7839            3
            ADAMS            7876           7839            4
        FORD                   7902           7839            3
            SMITH              7369           7839            4
  
 

SYS_CONNECT_BY_PATH

 - 상관관계 쿼리에서 현재 로우 까지의 PATH 정보를 쉽게 얻어 올 수 있습니다.
 
SQL>COL path FORMAT A40
 
SQL>SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename, empno,
   SYS_CONNECT_BY_PATH(ename, '/') "Path"
   FROM emp
   START WITH job='PRESIDENT'
   CONNECT BY PRIOR empno=mgr;
 
 
 
ENAME                     EMPNO Path
-------------------- ---------- -------------------------------
KING                          7839       /KING
    JONES                   7566       /KING/JONES
        SCOTT               7788       /KING/JONES/SCOTT
            ADAMS          7876       /KING/JONES/SCOTT/ADAMS
        FORD                 7902       /KING/JONES/FORD
            SMITH            7369       /KING/JONES/FORD/SMITH
 
 

CONNECT_BY_ISLEAF

 - 상관관계 쿼리에서 로우의 최하위 레벨 여부를 반환 합니다.
 
SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename, empno,
   CONNECT_BY_ISLEAF "leaf", level
   FROM emp
   START WITH job='PRESIDENT'
   CONNECT BY NOCYCLE  PRIOR empno=mgr;
 
ENAME                     EMPNO     leaf      LEVEL
-------------------- ---------- ---------- ----------
KING                           7839          0          1
    JONES                    7566          0          2
        SCOTT                7788          0          3
            ADAMS           7876          1          4
        FORD                  7902          0          3
            SMITH             7369          1          4



출처 : http://cafe.naver.com/scorpionkim.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=610

오라클 데이터베이스  scott유저의 emp테이블을 보면 empno와 mgr컬럼이 있습니다. 
 

mgr 컬럼의 데이터는 해당 사원의 관리자의 empno를 의미 합니다.
 

예를 들어서 아래의 데이터를 보면은..
 

  EMPNO ENAME         SAL        MGR
 ------ --------- ------- ----------
   7369     SMITH          800       7902
   7902     FORD          3000       7566


empno 7369사원의  관리자는 7902의 empno를 가진 사원이며
empno 7902사원의  관리자는 7566의 empno를 가진 사원입니다. 
 
 
이런 상위 계층과 하위계층의 관계를 오라클에서는 START WITH와 CONNECT BY를 이용해서
쉽게 가져올 수 있습니다. 
 
상품의 카테고리(대분류,중분류,소분류...)를 조회 할때 START WITH와 CONNECT BY를 이용하면 
트리 구조로 편리하게 조회 할 수 있습니다. 


게시판에서의 일반글과 답변글 과의 관계에서도 사용 할 수 있습니다.
 
예     제 
START WITH와 CONNECT BY를 이용해 데이터를 계층적인 순서로  조회할 수 있습니다. 
 
 
START WITH
 
 - 계층 질의의 루트(부모행)로 사용될 행을 지정 합니다..
 - 서브쿼리를 사용할 수도 있습니다.
 
 
CONNECT BY
 
 - 이 절을 이용하여 계층 질의에서 상위계층(부모행)과 하위계층(자식행)의 관계를 규정 합니다.
 - 보통 PRIOR 연산자를 많이 사용 합니다..
 - 서브쿼리를 사용할 수 없습니다..
 
 
 
CONNECT BY의 실행순서는 다음과 같습니다.
 
 - 첫째 START WITH절
 - 둘째 CONNECT BY 절
 - 세째 WHERE 절 순서로 풀리게 되어있습니다.
-- 테스트를 위해서 scott유저로 접속을 합니다. 
SQLPLUS scott/tiger
 
 
예제1)상위계층과 하위 계층 관계의 순서대로 쿼리해 옴
 
 
-- LEVEL 예약어를 사용하여  depth를 표현 할 수 있습니다.
-- 직업이 PRESIDENT을 기준으로 계층 구조로 조회합니다.
 
SQL>SELECT LEVEL,empno,ename, mgr
        FROM  emp
        START WITH job = 'PRESIDENT'   -- 직업이 PRESIDENT를 기준으로
        CONNECT BY PRIOR  empno = mgr; -- 사원(empno)과 관리자(mgr)의  관계를 계층 구조로 조회
   
    LEVEL      EMPNO ENAME                       MGR
--------- ---------- -------------------- ----------
        1       7839      KING
        2       7566      JONES                 7839
        3       7788      SCOTT                 7566 
        4       7876      ADAMS                 7788
        3       7902      FORD                  7566
        4       7369      SMITH                 7902
        2       7698      BLAKE                 7839
        3       7499      ALLEN                 7698
        3       7521      WARD                  7698
        3       7654      MARTIN                7698
        3       7844      TURNER                7698
        3       7900      JAMES                 7698
        2       7782      CLARK                 7839
        3       7934      MILLER                7782


--  LEVEL컬럼은 depth를 나타냅니다.
-- JONES의 관리자는 KING을 나타냅니다.
--  SCOTT의 관리자는 JONES를 나타냅니다.
--  예제와 같이 상/하의 계층 구조를 쉽게 조회 할 수 있습니다.

 
예제2) 사원성명을 계층 구조로 보여 줌


SQL>SET LINESIZE 100
SQL>SET PAGESIZE 100
SQL>COL ename FORMAT A20

 -- 예제1의 결과를 가지고 LPAD함수를 이용해서 ename왼쪽에 공백을 추가 했습니다.
SQL>SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename, empno, mgr, job
       FROM emp
       START WITH job='PRESIDENT'
       CONNECT BY PRIOR empno=mgr;
 ENAME                    EMPNO        MGR       JOB
-------------------- ---------- ---------- ---------
KING                       7839             PRESIDENT
JONES                   7566       7839   MANAGER
SCOTT              7788       7566    ANALYST
ADAMS          7876       7788      CLERK
FORD                7902       7566    ANALYST
SMITH           7369       7902      CLERK
BLAKE                   7698       7839    MANAGER
ALLEN                7499       7698   SALESMAN
WARD                7521       7698   SALESMAN
MARTIN              7654       7698   SALESMAN
TURNER             7844       7698   SALESMAN
JAMES               7900       7698      CLERK
CLARK                   7782       7839    MANAGER
MILLER               7934       7782      CLERK
 
 
예제3) 레벨이 2까지만 쿼리해서 가져오는 예제
   
SQL>SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename, empno, mgr, job
        FROM emp
        START WITH job='PRESIDENT'
        CONNECT BY PRIOR empno=mgr
        AND LEVEL <=2 ;
   
ENAME                    EMPNO        MGR JOB
-------------------- ---------- ---------- ---------
KING                       7839             PRESIDENT
JONES                 7566      7839    MANAGER
BLAKE                7698      7839     MANAGER
CLARK                 7782      7839     MANAGER  
 
예제4) 각 label별로 급여의 합과 인원수를 구하는 예제
 
SQL> SELECT LEVEL, SUM(sal) total,COUNT(empno) cnt
        FROM emp
        START WITH job='PRESIDENT'
        CONNECT BY PRIOR empno=mgr      
        GROUP BY LEVEL
        ORDER BY LEVEL;
 
     LEVEL      TOTAL        CNT
---------- ---------- ----------
         1       5000          1
         2       8275          3
         3      13850          8
         4       1900          2
 
데이터가 많아질 경우....
 
 -
첫째로 풀리는 START WITH job='PRESIDENT' job 컬럼에 index가 생성되어 있지 않는다면
    속도를 보장할 수 없습니다.
 
 - 그리고 둘째로 풀리는 CONNECT BY PRIOR empno = mgr 역시 PRIOR 쪽의 컬럼값이 상수가
   되기 때문에 MGR컬럼에 index를 생성하여야 CONNECT BY의 속도를 보장할 수 있습니다.
   
 - 계층구조를 CONNECT BY, START WITH로 풀면 부분범위 처리가 불가능하고 Desc으로
   표현하기가 어렵 습니다.

<참고>

http://dblab.changwon.ac.kr/oracle/sqltest/hierarchical.html/
http://www.en-core.com/
 
출처 : http://cafe.naver.com/litave.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=28
 

순환 구조 내에서는 JOIN 이 불가능하므로 JOIN 을 수행하는 QUERY 로 구성된 VIEW 에 대해서도 SELECT 가 불가능합니다. 다른 테이블들과의 JOIN 을 하기 위해서는 순환 구조를 가지는 문장을 INLINE VIEW 로 처리한 후 JOIN 에 참여하게 해야 합니다.

 

CONNECT BY 는 순환 구조에서 무한 LOOP 가 발생할 수 있습니다. 이러한 루프는 서로 다른 ROW에 부모와 자식이 존재하는 경우 발생하며, ORA-1436 에러를 발생합니다. 이는 데이터 자체의 논리적 구조의 결함에 의해 발생하는 것입니다. 모든 데이터의 부모 데이터가 항상 존재할 수는 없듯이, 이러한 부분이 있는 지를 검증해보아야만 하고 만약 이렇게 된 겨웅가 있다면 이는 전체적인 구조 설계가 잘못되었거나 대상 테이블에 입력된 데이터가 잘못된 경우 입니다. 대부분 후자의 경우에 무한 LOOP 이 발생하게 됩니다.

 

마지막으로 이와 같은 CONNECT BY 를 사용한 후 ORDER BY 를 사용할 경우 실제로는 결과값이 정렬이 되지는 않았습니다. 하지만 ORACLE 9i 에서부터는 ORDER SIBLINGS BY 라는 구문이 추가되어 실제 값들을 정렬을 수행하면서 순환 구조로 전개가 되어 데이터의 추출이 이루어집니다.

 

출처 : http://cafe.naver.com/marinebang.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=1254

 

오라클에서는 타 데이터베이스와는 달리 순환 관계라는 기능을 제공합니다. 예를 들어 생산 공정에 소모되는 부품들을 조립 단계에 맞추어 각 단계별로 독립적인 테이블들로 구성하는 것이 아니라, 한 개의 테이블에 모든 부품 관련 정보들을 입력한 후, 조회 시 내부적으로 정의한 순서에 의해 읽어올 수 있는 방법을 말합니다. 즉, 순환 관계란 부모와 자식의 관계처럼 계층적 구조의 자료를 하나의 ENTITY 내에 구조화 하여 기술한 것입니다.

 

일반적으로 이와 같은 계층적 구조의 자료 형태의 단점은 하나의 레벨에 대한 데이터의 변경 시, 부모의 식별자가 바뀜으로서 자식의 식별자도 모두 바뀌어야 한다는 것입니다. 물론 이러한 것은 해당 테이블의 컬럼에 REVERSE 값을 주어서 보다 효과적으로 사용할 수 있습니다. 하지만 이와 같은 모든 레벨에 해당하는 값들을 단일 테이블에 저장하는 방식을 사용하였을 경우 DB BUFFER 및, 디스크 용량 그리고 DISK I/O와 MEMORY I/O 등 시스템의 전반적인 모든 튜닝 관련 사항들에 대해 보다 효과적으로 대처할 수 있습니다. 하지만 이러한 순환 관계 모델이 현업에서 사용되는 것은 드뭅니다. 그 이유는 해당 모델에 대해 이해가 부족하여 사용하기 어렵고, 그리하여 처리 속도가 느려지기 때문입니다.

 

이러한 순환관계로 테이블을 설계한다면 부모 및 자식 관계에 있는 모든 로우들이 단일 테이블내에 모두 저장이 됩니다. 그리고 이러한 순환 관계 테이블을 처리하기 위해서는 CONNECT BY ... START WITH ... 라는 구문을 사용하여 처리할 수 있어야 합니다. 이러한 기능을 제공하지 않는 데이터베이스의 경우에는 직접 순환 구조로 데이터를 추출할 수 있게 매우 복잡한 단계의 프로그래밍을 구현해야 합니다. 그리고 이러한 문장은 일반 SQL과는 다르게 구성되는 만큼 처리 구조도 독특한 특성을 가지고 있습니다.

 

where    sal > 500                                       - CHECK 조건

connect by prior empno = ‘mgr’                  - JOIN 조건

start with mgr is null                                   - DRIVING 조건

 

순환 구조 SQL 을 작성하고 실행할 때 중요한 부분은 일반 SQL과는 달리 WHERE 절이 처리 범위를 줄여주는 선행 조건이 아니라는 것입니다. 순환 전개 방식의 선행 처리 조건은 START WITH 절로 순환 구조 처리의 가장 중요한 부분입니다. WHERE 절은 단지 체크 조건으로 결과값에 대해 단순한 필터로만 작용을 합니다. 이리하여 순환 구조 SQL의 튜닝을 위해서는 START WITH 절에 사용되는 컬럼에 대해 인덱스를 생성해야 합니다. 만약 START WITH 의 처리 범위가 넓다면 이를 해당 쿼리 내의 WHERE 절 혹은 START WITH 의 해당 컬럼의 비교값에서 INLINE VIEW를 사용해서 범위를 줄여줘야 합니다.

 

그 다음으로 중요한 부분은 PRIOR 절입니다. 오라클 매뉴얼을 보거나 모든 책을 보더라도 CONNECT BY PRIOR a = b 라고 기술되어 있습니다. 마치 항상 저렇게 사용해야만 하는 것 처럼 느낄 수도 있습니다. 하지만 PRIOR 절은 반대편에 기술해도 되고 SELECT 절에 기술해도 됩니다. PRIOR의 의미는 실제로는 최초 시작한 노드의 PRIOR 절에 기술되는 컬럼 (a) 값을 읽어 PRIOR 절 내 = 의 반대편 컬럼(b) 에 상수를 제공하겠다는 의미입니다. 그렇다면 PROIR 로 읽은 컬럼 값을 제공받는 반대편 컬럼에도 튜닝을 위해서는 인덱스가 존재해야만 빠른 성능을 보장받을 수 있다는 것입니다.

 

어렵군...쩝...

 

출처: http://cafe.naver.com/marinebang.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=1253

CSS ( Cascade Style Sheet )
CSS 문서의 모양을 정의하는 일련의 속성들이 포함된 언어이다. CSS Spec에는 속성 속성들을 문서의 요소들과 관련짓는 선언 언어들이 정의되어 있다. 동적인 스타일을 웹페이지에 추가하거나 Dynamic HTML 사용하기 위해 CSS 이해해야 한다.

 

DHTML ( Dynamic HTML )
DHTML 보다 동적인 HTML 구현하기 위한 기술이다, 특히, DHTML 절대위치지정, 애니메이션 구현, 동적인 페이지 변경, 스타일이 적용된 HTML Page 구성할 있다. IE4.0 Communicator 4.0 이상에서 지원하고 있다. 지금 이렇게 용어에 대한 내용을 보이고 숨기고하는 것이 DHTML 사용한 예이다.

 

DOM ( Document Object Model )
DOM 플랫폼과 랭귀지에 중립적으로 Document Style, Content, Structure 다루기 위한 표준화된 방법을 제공하는 것이다. 특히, HTML XML 고려하여 디자인되었으며 이들을 다룰수 있는 프로그램 또는 스크립트를 가능하게 한다. 현재 XML Paser XSL Processor에서 주로 사용되고 있다.

 

DTD ( Document Type Definition )
DTD SGML 또는 XML 문서의 구조와 내용을 정의하기 위한 것으로 문서의 논리적 구조를 계층적으로 표현하고 있다. SGML 반드시 문서의 구조를 나타내는 DTD 존재해야 하나, XML DTD 없어도 XML 스펙만 준수하면 되는 Well-formed 지원 하고 있다.

 

EDI(Electronic Document Interchange)
산업이 발전함에 따라 신속한 업무 처리를 위해 기업간에 문서를 효과적으로 교환하기 위한 노력이 전개되었고, 결실이 EDI라는 형태로 이루어졌다. EDI 서로 다른 조직간에 거래를 위한 전자문서를 통신회선을 매개로 표준적인 규약을 이용해서 컴퓨터간에 교환하는 것을 말한다. , 하나의 기업이나 기업집단 내에 그치지 않고 다른 기업이나 기업집단과의 사이에 가능한 넓게 전자문서 교환에 의해 상거래를 실현하는 것을 목적으로 한다.

 

ICE ( Information and Content Exchange )
Vigneet, Firefly, JavaSoft 비롯한 콘텐트 중심의 회사들이 제안한 것으로, Site간의 사용자 프로필과 콘텐트 공유, 판매, 매입을 포함한 서버간 데이터 교환이 가능한 XML Application이다. 특히, XML-Data 표준으로 책정되면, 활용할 있는 Application Framework이라고 있다.


XPath ( XML Path Language )
XPath
현재 W3C에서 Working Draft단계로 XML문서에 대해 Element Attribute 지정하는 표준으로 XSLT에서 분리되었다. XPath XSLT에서 처리할 구조적으로 Element 지정하고, Element Attribtue 지정할수 있는 표준을 제공하고 있다.

 

XSLT ( XSL Transformations )
XSLT 현재 W3C에서 Working Draft단계로 XML문서에 대해 Transformation 기능을 처리하는 표준으로 XSL에서 분리되었다. XSLT XML 문서를 HTML 다른 형태로 변환하기 위한 표준을 제공하고 있다.

 

CDF (Channel Definition Formation): 채널 정의 포맷
XML
기반한 마크업 언어로, 웹사이트 작성자가 가입자에게 언제 사이트가 갱신되는지를 다양한 수준으로 알려줄 있습니다.
CDF
IE4에서 도입되었으며 XML 효율성을 널리 알린 공신이라고 있습니다. CDF 포맷으로 전송된 문서는 CDF DTD 따릅니다.

 

RDF (Resource Description Framework) : 자원 기술 프레임웍
XML
파일을 포함하는 데이터의 종류를 정의하는 기준입니다.
RDF
메타 데이터 처리의 초석 역할을 하는 것으로, 웹상에서 애플리케이션과는 독립적으로 컴퓨터가 이해할 있는 정보를 교환하는 수단을 제공하며 자원의 자동화 처리에 초점을 두고 있습니다.
RDF
크게 두가지 영역으로 나눌 있습니다.
- RDF
데이터 모델
- RDF
문법

 

스키마
스키마란 객체의 클래스의 특성을 정의하는 것입니다.
XML
경우 스키마란 문서가 마크업되는 방식에 대한 정의를 뜻합니다.
DTD
하나의 스키마라고 있습니다.
DTD
문서의 클래스를 정의하며 클래스의 요소와 특성의 형을 정의하기 때문입니다.

 

Element
SGML
XML에서 요소는 시작태그(start-tag)부터 그에 상응하는 마침태그(end-tag)까지의 영역을 말합니다.
참고로 HTML에서 HTML요소란 문서전체를 말합니다.

 

Entity : 객체
개체에는 범용개체(general) 인자개체(parameter) 있습니다.
일반개체의 선언은 다음과 같습니다.
내부개체 선언 :
외부채게 선언 :

 

NameSpace : 이름공간
XML
문서에서 요소나 특성의 이름으로 쓰일수 있는 이름들의 집합입니다.
이름공간은 다음과 같은 두가지 중요한 일을 가능하게 해줍니다.
이상의 소스로부터 문서들을 조합해 있으며, 여러 소스들이 섞인다고 해도 특성 요소나 어떤 소스로부터 왔는지를 식별해낼 있습니다.
사용자 에이전트가 DTD 기타요소, 특성안에 대한 명세 등의 추가적인 자료들을 사용하도록 만드는 것이 가능합니다.

 

SAX (Simple API for XML)
SAX(Simple API for XML)
XML 사용하는 웹파일들을 해석할 있게 해주는 응용프로그램 인터페이스입니다.
SAX
XML 파일을 해석하기 위해 DOM 대신 사용할 있는 대안입니다.
이름이 시사하는바와 같이, SAX DOM 베해 단순한 인터페이스이며, 처리해야할 파일이 많거나 매우 경우에 적합하답니다. 그러나, 데이터 내용을 조작할 있는 기능은 상대적으로 적습니다.
SAX
이벤트 중심의 인터페이스이이므로, 프로그래머가 일어날 있는 이벤트를 설정해 놓으면, SAX 이벤트가 일어났을 제어권을 가지고 상황을 처리합니다.
SAX
직접 XML 파서와 함께 일합니다.

출처 : http://blog.naver.com/ansysda/4882988

XML 속성(Attributes)은 보통 XML 요소를 설명하기 위해 또는 요소에 대한 부가 정보를 제공하기 위해 사용된다. HTML에서 다음과 같은 내용을 보면 쉽게 알 수 있을 것이다:

 

<IMG SRC="computer.gif">. 이 예에서 SRC는 IMG 요소의 속성이다. SRC 속성은 IMG 요소에 대한 부가 정보를 제공해주는 역할을 한다.

 

속성은 하나의 요소안의 (속성이름="값")의 쌍이며, 언제나 요소의 시작 태그 안에 포함되어 있어야 한다. 다음은 그 예이다:

 

HTML 예: <img src="computer.gif"> <a href="demo.asp">
XML 예: <file type="gif"> <person id="3344">


속성은 반드시 값을 가져야 한다.  그리고 값은 반드시 따옴표('' or "")로 묶어 주어야 한다.
속성이름을 작성하는 규칙은 요소작성 규칙과 동일하다. 하나의 요소 안에서는 속성의 이름은 유일해야 한다.

<이름 nickname=King nickname=King2 >박용운</이름> //에러발생

 

대부분 속성은 XML 문서 내용에 포함되어 있지 않은 정보를 제공하기 위해 사용된다. 즉, 속성은 요소의 특성을 나타내 준다고 볼 수 있다. 이 말을 다른 말로 표현하자면, 속성은 종종 독자들에게보다는 XML을 해석하는 해석기(파서, parser)에게 더 중요하다. 어쨋든 위의 예에서 person id는 독자들과는 별 상관 없는 숫자이지만 person 요소를 처리할 소프트웨어에게는 상당히 중요한 의미를 가진다는 것이다.

 

요소(element)와 속성(Attributes)의 사용

 

다음 예를 살펴 보자:

성별 구분을 위해 "속성"을 사용하는 방법: 
<person sex="female">
<firstname>다니엘</firstname>
<lastname>조</lastname>
</person>
 성별 구분을 위해 "요소"를 사용하는 방법:
<person> 
<sex>female</sex>
<firstname>다니엘</firstname>
<lastname>조</lastname>
</person>

 

첫 번째 예에서 sex는 속성이다. 두 번째 예에서 sex는 요소이다. 두 가지 예 모두 독자들에게는 같은 정보를 제공한다.

 

데이터를 기술하기 위해 "요소"를 사용해야 할지 "속성"을 사용해야 할지에 대한 특별한 규칙은 없다. 하지만 경험에 비추어보면, HTML에서는 "속성"을 사용하는 것이 간편하고 XML에서는 "요소"로 그 데이터를 표현할 수 있다면 "속성" 사용을 피해야 한다.

 

또 다른 예를 살펴 보자. 이 예는 "속성" 대신 어떻게 "요소"를 사용하는지에 대한 것이다. 이 예에 포함된 3개의 문서는 모두 동일한 정보를 갖고 있다. 첫 번째 문서에서는 date가 "속성"이고 두 번째 문서에서는 date가 "요소"이며 세 번째 문서에서는 date가 확장된 "요소"이다:

 

<?xml version="1.0"?> 
<note date="12/11/99">
<to>철수</to>
<from>다니엘</from>
<heading>잊지말 것!</heading>
<body>이번 주 약속 잊지말길...</body>
</note>
<?xml version="1.0"?> 
<note> <date>12/11/99</date>
<to>철수</to>
<from>다니엘</from>
<heading>잊지말 것!</heading>
<body>이번 주 약속 잊지말길...</body>
</note>
<?xml version="1.0"?>
<note>
<date>
<day>12</day>
<month>11</month>
<year>99</year>
</date>
<to>철수</to>
<from>다니엘</from>
<heading>잊지말 것!</heading>
<body>이번 주 약속 잊지말길...</body>
</note>

 

"속성" 사용을 피하는 이유

 

왜 "속성" 사용을 피해야 하는가? "속성"을 사용하게 되면 다음과 같은 문제점들이 있다:

  • "속성"은 여러 개의 값을 가질 수 없다 ("요소"는 가능하다)
  • "속성"은 확장되기가 어렵다 (향후 변경시)
  • "속성"은 구조를 기술할 수 없다 ("요소"는 "자식요소"를 사용할 수 있다)
  • "속성"을 이용해 프로그래밍 하기가 좀 더 어렵다
  • "속성" 값은 DTD에 대해 시험하기가 쉽지 않다

만일 XML 데이터를 보관하기 위해 "요소" 대신 "속성"을 사용하기 시작하면 유지하기도 어렵고 그 데이터를 처리하기도 어려워진다. 여기서 계속 얘기하고자 하는 것은 데이터를 기술하기 위해서는 "속성" 대신 "요소"를 사용하라는 것이다. "속성"은 독자와는 상관 없는 정보를 제공할 경우에만 사용하길 바란다. 다음과 같은 사용은 자제해 주기 바란다:

 

<?xml version="1.0"?>
<note day="12" month="11" year="99" to="철수" from="다니엘"
heading="잊지말 것!" body="이번 주 약속 잊지말길..."> </note>

 

속성을 사용하는 또 다른 경우

 

"속성"은 독자와는 상관 없는 정보를 제공할 경우에만 사용하라고 하였는데 이 외에 다음과 같은 경우에도 사용할 수 있다:

 

XML 문서에서 어떤 요소에 접근하기 위해 ID를 할당하는 경우가 있다. HTML에서 NAME이나 ID 속성을 사용하는 경우와 동일하다. 다음 예를 한번 보자:

 

<?xml version="1.0"?>
<messages>
<note ID="501">
<to>철수</to>
<from>다니엘</from>
<heading>잊지말 것!</heading>
<body>


출처 : http://blog.naver.com/tear230/100004179475

Well-formed XML Document

 

XML 1.0 스펙에 정의된 특정한 문법규칙을 따르는 XML.
XML문서를 설계하려면 게층구조의 트리로 표현하는것이 가장 바람직하다.

XML 문서는 Well-formed 를 만족시키기 위해 반드시 요소 작성 규칙을 따라야 한다.

 

* XML의 문법

<?xml version="1.0"?>
<note>
    <to>철수</to>
    <from>다니엘</from>
    <heading>기억할 것!</heading>
    <body>이번 주 약속 잊지말길!</body>
</note>
* '<' 와 '>' 사이의 단어들은 xml태그이다.
* 정보는 시작 태그와 끝 태그 사이에 담겨지게 된다
* 태그는 짝을 이루고 있다.
요소의 시작 태그와 끝 태그 사이에 들어 있는 텍스트는 요소 컨텐츠(element content)라고
부른다. 태그 사이에 있는 컨텐츠는 대부분의 경우 다른 요소와 달리 그냥 데이터이다.
이런 경우에는 요소 컨텐츠는 파싱된 문자 데이터(Parsed Character DATA)라고 부른다.
보통 줄여서 PCDATA라고도 한다.
* XML요소 작성 규칙
1. 모든 XML 요소는 시작태그 다음에는 반드시 마침태그(closing tag)를 가져야 한다.
HTML에서는 마침 태그(closing tag)가 필요 없는 요소들도 있었다:
<p>이것은 하나의 ?騈甄?amp;lt;p>이것은 또 다른 문단이다
하지만 XML에서는 다음과 같이 마침 태그를 반드시 가져야 한다:
<p>이것은 하나의 문단이다</p>
<p>이것은 또 다른 문단이다</p>
2. XML 태그는 대소문자 구분이 있다.
XML 태그들은 대소문자 구분을 한다. 태그 <Letter>와 태그 <letter>는 서로 다르다.
그러므로 시작 태그와 마침 태그는 반드시 대소문자를 맞춰줘야 한다:
<Message>이렇게 하면 잘못된 것이다</message> 
<message>이렇게 해야 맞다</message>
3. 모든 XML 요소는 중첩 원리를 잘 지켜야 한다.
HTML에서 어떤 요소들은 다음과 같이 서로 부적절하게 중첩될 수 있었다:
<b><i>이 문장은 볼드체와 이탤릭체로 나타난다</b></i>
 
하지만 XML에서는 다음과 같이 서로 중첩을 잘 시켜줘야 한다:
<b><i>이 문장은 볼드체와 이탤릭체로 나타난다</i></b>
4. 모든 XML 문서는 반드시 최상위 요소를 하나만 가질수 있다.
모든 XML 문서는 한 쌍의 최상위 요소 태그를 포함해야 한다. 
모든 다른 요소들은 이 최상위 요소 하부로 중첩되어야 한다.
모든 요소들은 자신의 하부로 자식 요소들을 가질 수 있으며
모든 요소들은 시작 태그와 마침 태그의 쌍을 정확히 이뤄야 한다.
또한 모든 하위 요소들은 자신의 부모 밑에서 순서를 잘 지켜 중첩되어 있어야 한다:
<root>
  <child>
    <subchild>
    </subchild>
  </child>
</root>
5. 속성 값은 쿼테이션(' 또는 ")으로 감싸줘야 한다.
XML 요소들은 HTML에서와 마찬가지로 name과 value 속성을 가질 수 있다. 
XML에서 속성 값은 항상 쿼테이션(' 또는 ")으로 감싸줘야 한다.
아래 두 개의 XML 문서를 보면, 첫 번째 것은 틀렸고, 두 번째 것은 맞았다.
어떤 부분이 맞고 틀렸는지 살펴보기 바란다:
<?xml version="1.0"?>
<note date=12/11/99>
 <to>철수</to>
 <from>다니엘i</from>
 <heading>기억할 것</heading>
 <body>이번 주 약속 잊지말길!</body>
</note>
 
<?xml version="1.0"?>
<note date="12/11/99">
 <to>철수</to>
 <from>다니엘i</from>
 <heading>기억할 것</heading>
 <body>이번 주 약속 잊지말길!</body>
</note>
6. XML은 텍스트 안에 들어 있는 공백을 유지한다.
HTML에서는 두개 이상의 공백문자을 포함하기 위해서는 &nbsp;를 사용해야만 했다. 
<b>&nbsp; 텍스트 &nbsp;</b>
하지만 XML에서는 태그사이에 텍스트와 함께 사용된 공백문자는 그대로 유지된다.
<b> 텍스트 </b>
-------------------------------------------------------------------------------------------------------
* XML 요소이름 작성규칙
    -  시작문자 가능 ' 문자, '_'
    -  시작문자 불가능 ' 숫자, xml
    -  첫문자 뒤에는 '-'나 '.', 숫자를 사용할 수 있다.
    -  이름은 공백을 포함할 수 없다.
    - ':'를 포함하지 말자. 예약어 이다.
    -  대소문자를 확실히 구분한다.
    -  여는 문자('<') 뒤에 공백을 두면 안 된다.

* 빈요소
아무 데이터도 갖지 않는 요소
<name></name> // 다음과 같은 방법도 사용가능 : <name/>
빈 요소가 자주 쓰이는 장소는 PCDATA를 전혀 갖지 않거나 요소에서 모든 정보를
속성으로 지정하는 경우에 많이 쓰인다.


* XML 선언

문서가 어떤 특정한 타입이라고 알려줄 수 있는 것은 종종 매우 유용하다. XML은 파서에게 몇가지 정보를 알려줌으로써 XML이 어떤 문서인지를 알려 줄 수 있는 XML선언을 제공한다.


<?xml version='1.0' encoding='euc-kr' standalone='yes'?>


 위의 코딩은 전형적인 XML선언이다.
 XML선언은 "<?xml"문자로 시작해서 "?>"로 끝이 난다.
 선언문에 반드시 version 속성을 표시 해야 하지만 encoding과 standalone 속성은 선택적이다.  속성은 반드시 version, encoding, standalone 순으로 쓰여져야 한다.


* Encoding : XML 파서에게 텍스트가 어떤 인코딩을 사용할 것인지 지정해 준다.
* standalone : 이 속성의 값으로는 "yes"또는 "no"를 가져야만 한다.
    - Yes : 이 문서가 외부 파일의 요소에 의존하고 있지 않다는 것을 알림.
             (파서에게 이 문서가 갖고 있는 정보를 완벽하게 처리하기 위해
               필요한 파일이 단지 이것 하나면 충분하다는 사실을 알림)
    - No : 이 문서가 다른 파일에 의존 한다.(외부 파일의 그림, 개체 등을 참조)
 

 


* 주석사용

 

    -  주석은 '<!--'로 시작해서 '-->'로 끝난다

    -  주석은 XML선언 이전에 표현할수 없다.

    -  태그 안에는 주석을 쓸수 없다.
        <first></first <!--이름을 나타낸다-->>

 

    -  주석문 안에다 '--'를 사용할 수 없다.
        <!--여기 부터는 해석을 하지 않는다 --주석이니까^^-->


 

[사용예제]


    <?xml version="1.0" encoding="euc-kr"?>
    <birth>
          <!--생일의 월 정보-->
              <month>09</month>
          <!--생일의 날짜 정보-->
          <day>33</day>
    </birth>

 

IE에 포함되어 있는 XML파서는 주석을 애플리케이션에 전달한다. 그래서 IE는 우리가 작성한 주석을 화면에 표시한다. 하지만 대부분의 경우, 이런 정보는 오직 소스 파일을 읽는 사람만이 사용할 것이라고 가정하고 만들어졌기 때문에, 주석에 적혀 있는 정보가 애플리케이션에 전달될 지 안될 지는 어떤 파서를 사용하느냐에 달려 있는 것이다.

자료출처 : http://korea.internet.com
출처 : http://blog.naver.com/tear230/100004178331

XML이란 무엇인가?

  • XML은 EXtensible Markup Language의 약자이다.
  • XML은 HTML과 매우 흡사한 markup language이다.
  • XML은 데이터를 기술하기 위해 고안되었다.
  • XML 태그들은 XML에서 미리 정의되어 있지 않다. 필요한 태그는 본인이 정의를 해야만 한다.
  • XML은 자기기술적(self describing) 특성을 갖고 있다.
  • XML은 데이터를 기술하기 위해 공식적으로 DTD(Document Type Definition)를 사용磯?

 

XML과 HTML의 주요 차이점

 

XML은 HTML의 대치물이 절대 아니다.
XML과 HTML은 서로 다른 목표를 가지고 고안되었다:

XML은 데이터가 무엇인지(what data is)에 초점을 맞춰 데이터를 기술하기 위해 고안되었다.
HTML은 데이터가 어떻게 보일지(how data looks)에 초점을 맞춰 데이터를 표시하기 위해 고안되었다.

HTML은 정보를 표시하기 위한 언어이고, XML은 정보를 기술(describing)하기 위한 언어이다.

 

 

XML의 확장성

 

HTML 문서를 만들기 위한 태그나 HTML 문서의 구조는 이미 정의되어 있다. HTML 문서를 만드는 사람은 HTML 표준에서 정의된 태그들만 사용할 수 있다.

XML은 자신의 문서 구조자신의 태그를 정의할 수 있도록 해준다.

 

 

XML의 용도

 

XML은 HTML과 별도로 데이터를 보관할 수 있다

HTML 페이지는 데이터를 표시하기 위해 사용된다. 데이터는 종종 HTML 페이지 내부에 저장된다. XML에서는 이 데이터를 별도의 XML 파일에 저장할 수 있다. 이렇게 함으로써 HTML로 하여금 데이터를 표시하고 꾸미는 것에 집중할 수 있도록 해준다. 또한 이렇게 함으로써 기본이 되는 데이터가 바뀌더라도 HTML은 전혀 수정할 필요가 없어지게 된다.

 

XML은 HTML 문서 내부에 데이터를 저장할 수도 있다

XML 데이터는 HTML 페이지 내부에도 데이터를 격리시켜 저장할 수 있다. 여전히 HTML은 데이터를 표시하는 것에 집중시킬 수 있다.

 

XML은 정보 교환의 한 방식으로 사용될 수 있다

대부분의 시스템, 데이터베이스는 서로 호환되지 않는 데이터 포맷을 포함하고 있다. 대부분의 개발자들은 인터넷 상에서 서로 호환되지 않는 데이터를 주고 받기 위해 많은 시간을 낭비하고 있다. 만일에 정보 교환할 데이터를 XML로 바꿔준다면 많은 시간을 절약할 수 있으며 서로 다른 애플리케이션 사이에서도 데이터 교환이 가능해진다.

 

XML은 파일 또는 데이터베이스에 데이터를 저장할 수 있다

XML은 해당 데이터를 파일이나 데이터베이스에도 저장할 수 있다. 이런 데이터를 저장하고 읽어 들이기 위해 별도의 애플리케이션을 개발할 수 있다. 물론 이런 데이터를 표시하기 위한 애플리케이션을 만들기도 한다.

 

 

XML 문서의 구성 요소


XML 문서는 다음과 같은 구성 요소를 가지고 있다:

요소(Elements), 태그(Tags), 속성(Attributes), 엔터티(Entities), PCDATA 및 CDATA


요소(Elements)
요소(Elements)는 XML 문서나 HTML 문서 모두에 있어 핵심 구성 요소이다.

요소(Elements)를 쉽게 이해하려면 HTML 문서의 요소를 살펴보면 된다. HTML 문서에서 "body", "table" 태그가 요소의 한 예이다. 지금까지 살펴 본 XML 문서 예제에서 "note", "to" 등도 요소이다. 요소는 텍스트, 또 다른 요소를 포함할 수 있으며 비어 있을 수도 있다.  비어있는 HTML 요소의 예로 "hr", "br", "img" 등을 들 수 있다.


태그(Tags)
태그는 요소를 구성하기 위해 사용된다. <요소이름>과 같은 시작 태그가 요소의 시작을 나타내고, </요소이름> 같은 마침 태그가 요소의 마지막을 나타낸다.


[예제]

body 요소 : <body>시작 태그와 마침 태그 사이에 들어갈 텍스트</body>
message 요소 : <message>시작 태그와 마침 태그 사이에 들어갈 어떤 메시지 내용</message>


속성(Attributes)
속성은 요소(element)에 대한 부가적인 정보를 제공한다.

속성은 요소의 시작 태그 안에 위치한다. 속성은 name/value 쌍으로 나타난다. 다음 예는 img 요소에 소스 파일에 대한 부가 정보를 제공하는 속성에 대한 것이다:

<img src="computer.gif" />
 

요소의 이름은 img이다. 속성의 이름(name)은 src이다. 속성의 값(value)은 computer.gif이다. 이 요소는 빈 요소(empty element)이기 때문에 /로 끝 마친다.


PCDATA
PCDATA는 parsed character data를 의미한다.

캐릭터 데이터(character data)는 XML 요소의 시작 태그와 마침 태그 사이에 위치한 텍스트라고 보면 된다.

PCDATA는 파서(해석기, parser)에 의해 해석이 될 텍스트이다. 텍스트 안에 있는 태그는 마크업(markup)으로 취급될 것이며 엔터티(entity)는 확장될 것이다. 이 말을 쉽게 풀어 쓰면, <, >같은 태그를 XML 파서가 해석할 것이며 엔터티도 XML 파서가 해석하여 엔터티가 가리키는 값으로 참조시킬 것이라는 뜻이다.


CDATA
CDATA는 character data를 의미한다.

CDATA는 파서(해석기, parser)에 의해 해석이 되지 않을 텍스트이다. 사실 XML 문서에 있는 모든 텍스트들은 XML 파서에 의해 해석 과정을 거치게 되지만 CDATA 만큼은 해석되지 않고 있는 모습 그대로 출력된다. 텍스트 안에 있는 태그는 마크업(markup)으로 취급되지 않을 것이며 엔터티(entity)는 확장되지 않을 것이다. 이 말을 쉽게 풀어 쓰면, <, >같은 태그 및 엔터티를 XML 파서가 해석하지 않을 것이므로 <, > 같은 문자와 엔터티 자체가 그대로 출력될 것임을 의미한다.


엔터티(Entities)
XML에서 엔터티는 변수와 비슷한 개념으로 생각할 수 있다. 엔터티는 문서 내에서 참조 될 수 있는 문자 집합의 단위를 말한다. 예를 들어 반복해서 사용하는 어구가 있다면 엔터티를 사용해 쉽게 표현할 수 있다. 엔터티에는 일반 엔터티, 파라미터(매개변수) 엔터티가 있다. 정의되어 있는 엔터티를 참조하는 것을 엔터티 참조(Entity Reference)라고 한다.


HTML 문서에서 " "가 어떤 역할을 하는지 잘 알고 있을 것이다.  는 엔터티 참조의 한 예로 HTML 문서에서 빈 공간을 만들 때 사용한다. 이 문서가 XML 파서에 의해 해석될 때 이 엔터티는 빈 공간으로 대치될 것이다.

출처: http://blog.naver.com/tear230/100004177530

 

이 문서는 이전에 다음 ID로 출판되었음: KR272318

요약

SQL Server 2000에서는 이제 로그를 축소하는 작업이 지연되지 않고 즉시 수행됩니다. 그러나, 일부 상황에서는 먼저 추가 작업을 수행해야 로그 파일을 원하는 크기로 축소할 수 있습니다.

추가 정보

DBCC SHRINKFILE을 실행할 때 SQL Server는 먼저 가상 로그 파일을 제거하여 로그 파일을 축소합니다. 대상 파일 크기로 축소되지 않았으면 SQL Server는 가상 로그가 채워질 때까지 마지막 가상 로그 파일에 더미(Dummy) 로그 항목을 넣고 로그의 윗 부분을 파일의 시작 위치로 옮깁니다. 그런 다음 트랜잭션 로그를 축소하는 작업을 완료하기 위해 아래와 같은 작업이 필요합니다.

로그의 활성 부분을 비우기 위해 BACKUP LOG 문을 실행합니다.

로그 파일이 대상 크기로 줄어들 때까지 원하는 대상 크기를 사용하여 DBCC SHRINKFILE을 다시 실행합니다.

 

아래 예제에서는 pubs 데이터베이스를 사용할 때 이 방법을 사용하여 pubs_log 파일을 2MB로 축소하는 단계를 보여줍니다.

1. DBCC SHRINKFILE(pubs_log, 2)을 실행합니다.

2. 대상 크기로 축소되지 않고 아래와 같은 메시지가 반환됩니다.

 

모든 논리 로그 파일이 사용 중이므로 로그 파일 2(Pubs_log)을(를) 축소할 수 없습니다.
DbId  FileId  CurrentSize  MinimumSize UsedPages     EstimatedPages
----- ------- ------------ ----------- ------------- ------------------
6     2       3048         128         3048          128  <- 여기 있는 모든 값은 변할 수 있습니다.

(1개 행 적용됨)
DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오.

 

3. BACKUP LOG pubs WITH TRUNCATE_ONLY를 실행합니다

4. DBCC SHRINKFILE(pubs_log,2)을 실행합니다.

5. 이제 트랜잭션 로그가 대상 크기로 줄어듭니다


자세한 내용은 SQL Server 2000 Books Online에서 "Shrinking the Transaction Log" 항목과 "DBCC SHRINKFILE" 항목을 참조하십시오.

SQL Server 7.0
에서 트랜잭션 로그를 축소하는 방법에 대해서는 Microsoft 기술 자료의 다음 문서를 참조하십시오.

256650 INF: SQL Server 7.0 트랜잭션 로그를 줄이는 방법

 

참고URL : http://support.microsoft.com/kb/317375/ko20

 

출처 : http://support.microsoft.com/kb/272318/

[ 기초 ]
Downloaded Program Files 폴더는 Windows의 OCX 캐쉬 폴더이고 occache.dll에 의해 구현된 셸 확장 폴더입니다.
이 폴더는 웹에서 cab 파일로 컨트롤이나 기타 프로그램을 다운로드했을 때
                                                            --> Internet Component Download (MSICD) 기능
cab 파일에 inf 파일이 없거나 inf 파일에서 설치 위치를 지정하지 않은 경우 디폴트로 설치되는 장소입니다.


[ 목적 ]
MSICD에 의해 OCX 캐쉬 폴더에 설치된 프로그램을 프로그래밍적으로 제거하는 방법입니다.
(업데이트 프로그램 구현 중에 조사하게 됨)


[ 자료 ]
OCX 캐시 폴더 관련 정보
http://support.microsoft.com/default.aspx?scid=kb;EN-US;154850

컨트롤 제거 방법 소개
http://msdn.microsoft.com/library/default.asp?url=/workshop/components/occache/reference/functions/removecontrolbyname.asp

 

[ 방법 ]
위 MSDN 예제를 봐도 어떻게 해야할지 감감한데..
약간의 테스트와 디스어셈블 분석을 통해 정확한 제거 방법을 알아냈습니다.

typedef HRESULT (WINAPI *REMOVECONTROLBYNAME)(

             LPCTSTR lpszFile,

             LPCTSTR lpszCLSID,

             LPCTSTR lpszTypeLibID,

             BOOL bForceRemove,

             DWORD dwIsDistUnit);

int _tmain(int argc, _TCHAR* argv[])

{

    HMODULE                   hMod;

    REMOVECONTROLBYNAME       pfn =  NULL;


    hMod = LoadLibrary("OCCACHE.DLL");


    if (hMod == NULL)

    {

    // Error loading module -- fail as securely as possible

    return 0;

    }


    HRESULT hr;

    pfn = (REMOVECONTROLBYNAME)GetProcAddress(hMod, "RemoveControlByName");

    if (pfn) {

        hr = (*pfn)(_T("C:\\WINDOWS\\Downloaded Program Files\\teechart5.ocx"),

            _T("{B6C10532-FB89-11D4-93C9-006008A7EED4}"), 0, TRUE, TRUE);

    }

    FreeLibrary(hMod);


    return 0;

}


위와 같이 RemoveControlByName 함수를 호출하면 됩니다.

파일 이름과 폴더 위치는 레지스트리를 검사하면 알아낼 수 있죠.

문제는 2번째 매개변수인데

이게 어떤 포맷인지 설명이 안되어 있어서 조금 헤맸죠.


이 값은 HKLM\Software\Microsoft\Code Store Database\Distribution Units 여기에 등록된 키의 이름과 일치하게 적어주면 됩니다.


실제로 MSICD로 컨트롤이 다운되려면 HTML에 다음과 같은 식으로 태그를 적어야합니다

<objectID="TeeChart" CLASSID="clsid:B6C10532-FB89-11D4-93C9-006008A7EED4"  CODEBASE="http://localhost:8080/test/download/teechart5.cab#Version=5,0,1,0"></object>


HTML의 OBJECT 태그에서 사용한 CLSID를 그대로 적고 앞에 "CLSID:" 떼고 {} 괄호로 감싸면 되죠.
이상입니다.

출처 : www.devpia.com

작성자: Joydip Kanjilal (누굴까? ㅡㅡ;;)
번역 작성일: 2006년 12월 27일
역자: 웹지니™
원문 보기: http://www.aspaliance.com

독자 여러분의 편의를 위해 원문은 삭제하고 번역문만 기재합니다. 원문이 궁금하신 분은 상단의 [원문 보기] 링크를 클릭해 주세요.
커넥션 풀링은 데이터베이스 액세스 성능을 크게 향상시킵니다. 이 기사에서는 커넥션 풀링이 무엇인지, 어떻게 데이터베이스 액세스 성능을 향상시키는지 그리고 .NET 환경에서 어떻게 커넥션 풀을 생성하고 커넥션 객체를 추가하거나 제거하는지 설명합니다.


Introduction
데이터베이스 연결은 상당히 리소스 집약적이며 상대적으로 느린 작업입니다. 하지만 매우 중요한 일이지요. 커넥션 풀이란 이미 열려져 있으며 재활용 가능한 커넥션 객체들의 컨테이너 입니다. 커넥션 풀은 마지막 커넥션 객체가 닫힐 때 메모리에서 해제됩니다. 커넥션 풀링을 이용할 때의 가장 기본적인 이점은 성능의 향상과 확장성이며 가장 중요한 단점은 실제로 사용되지 않는 커넥션이 열린 상태로 보관된다는 점입니다.
.NET의 데이터 프로바이더들은 기본적으로 커넥션 풀링이 활성화되어 있습니다. 만일 커넥션 풀링을 비활성화 하려면 연결 문자열에 Pooling=false라고 명시적으로 지정해야 합니다. 커넥션 풀링은 매번 데이터베이스 연결이 필요할 때마다 커넥션 객체를 생성하는 대신 이미 만들어져 있고 연결된 상태로 재활용할 수 있는 커넥션 객체를 제공합니다.
커넥션 객체가 닫히거나 메모리에서 해제될 때 이 커넥션 객체는 커넥션 풀로 되돌아가 다시 데이터베이스 연결이 필요해 질 때까지 대기하게 됩니다. 우리가 커넥션 풀링을 효과적으로 사용한다면 데이터베이스 액세스 작업에 필요한 리소스는 비교적 줄어들게 됩니다. 이 기사에서는 커넥션 풀링이 대체 무엇인지, 그리고 응용 프로그램의 성능과 확장성을 향상시키기 위해 커넥션 풀링을 어떻게 효율적으로 활용할 것인지를 설명합니다.


How does Connection Pooling work?
사실 커넥션 풀은 이미 열려져 있고 재사용 가능한 연결들을 보관하는 일종의 컨테이너입니다. 동시에 동일한 응용 프로그램 도메인 내에 여러 개의 풀이 존재할 수 있지만 커넥션 풀은 서로 다른 응용 프로그램 도메인 사이에서 공유될 수는 없습니다. 중요한 것은 하나의 연결 문자열을 위한 하나의 커넥션 풀이 생성된다는 점입니다. (역자 주: 즉, 서로 다른 연결 문자열 2개를 사용하는 응용 프로그램에서는 두 개의 커넥션 풀이 생성되게 됩니다. 연결 문자열이 단 한글자만 틀려도 커넥션 풀은 서로 다른 연결 문자열로 인식한다는 것에 주의해야 합니다.)
커넥션 풀은 어떤 연결 문자열을 이용해서 데이터베이스 액세스가 처음 시도될 때 생성됩니다. 또한 다른 연결 문자열을 이용해서 데이터베이스에 액세스하려는 요청이 들어오면 이 때는 또 다른 커넥션 풀이 생성됩니다. 그래서 우리는 데이터베이스 당 하나의 커넥션 풀이 아니라 연결 문자열 하나 당 하나의 커넥션 풀을 갖게 되는 것입니다. 다음 예제는 이러한 상황을 재현해 줍니다.

Listing 1

//연결 풀이 생성됩니다.
SqlConnection sqlConnection = new SqlConnection();
sqlConnection.ConnectionString = "Server=localhost;Database=test;User ID=joydip;Password=joydip;Trusted_Connection=False";
sqlConnection.Open();     

Listing 2
//연결 문자열이 다르기 때문에 또 다른 커넥션 풀이 생성됩니다.
SqlConnection conn = new SqlConnection();
sqlConnection.ConnectionString =
"Server=localhost;Database=test;User ID=test;Password=test;Trusted_Connection=False";
sqlConnection.Open();  

Listing 3
// 연결 문자열이 Listing 1에서 사용된 것과 같기 때문에 새로운 커넥션 풀이생성되지 않습니다..
SqlConnection conn = new SqlConnection();
sqlConnection.ConnectionString =
"Server=localhost;Database=test;User ID=joydip;Password=joydip;Trusted_Connection=False";
sqlConnection.Open();   
 

새로운 커넥션에 대한 요청이 들어오면 새로운 커넥션을 생성하지 않고 커넥션 풀에 보관되어 있던 재사용 가능한 커넥션 객체가 사용됩니다. 이 방법은 여러분의 응용 프로그램 성능과 확장성을 향상 시킵니다. 응용 프로그램이 커넥션을 닫으면 커넥션 객체는 커넥션 풀로 되돌아가 재연결 제한 시간이 지날 때까지 대기합니다. 연결 제한 시간이란 커넥션 객체가 동일한 연결 문자열로 동일한 데이터베이스에 다시 액세스할 필요가 있을 때까지 대기하는 시간입니다. 이 제한 시간 내에 새로운 요청이 들어오지 않으면 데이터베이스에 대한 연결은 닫히고 커넥션 객체는 커넥션 풀에서 제거됩니다.
새로운 커넥션 풀이 생성되면 커넥션 객체는 커넥션 풀에 보관되고 커넥션 풀과 커넥션 객체는 언제든지 사용할 수 있는 상태가 됩니다. 커넥션 풀은 연결 문자열에 지정된 최대 개수만큼의 커넥션 객체를 보관하고 있습니다. 커넥션 객체들은 비활성화된 상태로 장시간 커넥션 풀에 보관되거나 지정된 시간이 지나거나 또는 실제로 데이터베이스 연결이 가능하지 못한 상태가 될 때까지 커넥션 풀에 보관됩니다.
커넥션 풀은 내부적으로 커넥션 풀 관리자에 의해 관리됩니다. 지속적인 연결 요청이 들어오면 커넥션 풀 관리자는 커넥션 풀에서 사용 가능한 커넥션 객체를 찾아 응용 프로그램에 리턴합니다. 다음의 사항들은 커넥션 풀 관리자가 어떻게 동작하는지를 보여주며 새로운 커넥션 객체에 대한 요청이 들어왔을 때 동작을 시작합니다.
사용되지 않는 커넥션 객체가 커넥션 풀에 존재하면 이 커넥션 객체를 리턴합니다. 모든 커넥션 객체가 사용 중이면 새로운 커넥션 객체를 생성하고 커넥션 풀에 추가합니다. 커넥션 객체의 수가 커넥션 풀의 최대 객체 수에 도달하면 사용 가능한 커넥션 객체가 커넥션 풀로 되돌아올 때까지 요청이 대기하게 됩니다.

커넥션 풀을 제어하는데 필요한 연결 문자열의 매개 변수들은 아래와 같습니다.

Connection Timeout
MinPoolSize
MaxPoolSize
Pooling

커넥션 풀링을 보다 효과적으로 사용하기 위해서는 사용이 끝난 커넥션 객체의 Close 메서드를 반드시 호출해서 커넥션 객체가 커넥션 풀로 돌아갈 수 있도록 해야 합니다.


Improving Connection Pooling Performance
우리는 늘 최대한 늦게 커넥션을 열고 최대한 빨리 커넥션을 닫아야 합니다. 즉, 사용이 끝난 즉시 커넥션을 닫아야 하는 것이지요. 커넥션 객체는 실제로 사용되는 동안에만 열려있어야 합니다. 커넥션 객체가 오래도록 열려 있어서 커넥션 풀 내의 사용 가능한 커넥션 객체의 수를 줄이고 그에 따라 커넥션 풀의 성능에 영향을 미쳐서는 안됩니다. 커넥션 객체는 사용이 끝난 즉시 해제되어야 합니다. 이는 커넥션 객체가 재빨리 커넥션 풀로 되돌아가 재사용 가능한 상태로 만들어 줍니다. 아래 예제는 응용 프로그램 내에서 커넥션 객체를 효율적으로 열고 닫는 방법을 보여줍니다.


Listing 4
SqlConnection sqlConnection = new SqlConnection(connectionString);
try
{
  sqlConnection.Open();
  //실행될 코드
}
finally
{
  sqlConnection.Close();
}
Listing 4의 코드는 아래와 같이 "using" 키워드로 바꿔 쓸 수 있습니다.


Listing 5
using(SqlConnection sqlConnection = new SqlConnection(connectionString))
{
  sqlConnection.Open();
  //실행될 코드
}
Listing 5에서 사용된 using 키워드는 컴파일 시 try ~ finally 구문으로 변환된다는 것을 기억할 필요가 있습니다. 아래는 커넥션 풀링을 보다 효율적으로 활용하기 위한 방법입니다.

데이터베이스 연결은 항상 필요할 때 열고 사용이 끝나면 곧바로 닫아줍니다. 커넥션 객체를 닫기 전에 사용자 정의 트랜잭션을 항상 먼저 닫아줍니다. 최소한 하나 이상의 열려진 커넥션 객체가 커넥션 풀에 있도록 합니다.
연결 문자열에서 Integrated Security 특성을 이용하는 경우 커넥션 풀리의 사용을 피합니다. 커넥션 풀의 상태는 아래와 같은 방법으로 모니터링 할 수 있습니다.

sp_who 또는 sp_who2 저장 프로시저를 실행합니다. SQL Server Profiler를 사용합니다. 성능 모니터와 성능 카운터를 사용합니다.


References
- Tuning Up ADO.NET Connection Pooling in ASP.NET Applications
- Connection Pooling for the .NET Framework Data Provider for SQL Server
- The .NET Connection Pool Lifeguard
- ADO.NET Connection Pooling Explained
 

Conclusion
커넥션 객체의 컨테이너인 커넥션 풀은 활성화 되어 있거나 열려진 커넥션 객체가 존재하는 한 지속적으로 존재합니다. 새로운 연결 요청이 연결 문자열과 함께 들어오면 그에 따른 새로운 커넥션 풀이 생성됩니다. 우리는 응용 프로그램이 동일한 연결 문자열을 사용하도록 하여 응용 프로그램의 성능과 확장성을 향상시킬 수 있습니다. 그러나 우리는 커넥션 풀링을 적절히 사용하여야 하며 그렇지 못하면 응용 프로그램의 전반적인 성능에 악영향을 미칠 수 있습니다.
MSDN에는 "커넥션 풀링은 응용 프로그램의 성능을 향상시킬 수 있는 매우 강력한 기능이지만 효율적으로 관리하지 못하면 응용 프로그램에 악영향을 미칠 수 있다"라고 표기되어 있습니다.
이 기사를 통해 커넥션 풀링과 응용 프로그램 성능 향상을 위해 이를 어떻게 효율적으로 활용할 것인지를 알게 되었습니다.

코드를 알아낼수있는 방법
<html>
<head>
<script>
function key_check(){
alert("키번호는 [" +event.keyCode+ "] 입니다.");
}
</script>
</head>
<body onKeyDown='key_check();'>
알고싶은 키패드를 꽉!
</body>
</html>


Key KeyCode Key KeyCode Key KeyCode
BackSpace 8 0 48 KeyPad 0 96
Tab 9 1 49 KeyPad 1 97
ENTER 13 2 50 KeyPad 2 98
SHIFT 16 3 51 KeyPad 3 99
CTRL 17 4 52 KeyPad 4 100
ALT 18 5 53 KeyPad 5 101
PUSEBREAK 19 6 54 KeyPad 6 102
CAPSLOOK 20 7 55 KeyPad 7 103
한/영 21 8 56 KeyPad 8 104
한자 25 9 57 KeyPad 9 105
ESC 27 A 65 . 110
SPACE BAR 32 B 66 / 111
PAGEUP 33 C 67 * 106
PAGEDOWN 34 D 68 + 107
END 35 E 69 - 109
HOME 36 F 70 NUMLOCK 144
INSERT 45 G 71 SCROLLLOCK 145
DELEDT 46 H 72    
37 I 73    
38 J 74    
39 K 75    
40 L 76    
윈도우(왼쪽) 91 M 77    
윈도우(오른쪽) 92 N 78    
기능키 93 O 79    
F1 112 P 80    
F2 113 Q 81    
F3 114 R 82    
F4 115 S 83    
F5 116 T 84    
F6 117 U 85    
F7 118 V 86    
F8 119 W 87    
F9 120 X 88    
F10 121 Y 89    
F11 122 Z 90    
F12 123 - 189    
    ` 192    
    / 220    
    = 187    

=== Procedure ===

DECLARE

             in_out_Arguments1 VARCHAR2(1) := '';
             in_out_Arguments2 VARCHAR2(100) := '';

BEGIN

             DBMS_Output.put_line('=== 프로시저 실행 ===');
             Procedure_NAME( in_Arguments, in_Arguments , in_out_Arguments1, in_out_Arguments2 );
             DBMS_Output.put_line('실행후 결과값 1 :' || in_out_Arguments1 );
             DBMS_Output.put_line('실행후 결과값 2 :' || in_out_Arguments2 );
END;


=== Package ===

var Out_CURSOR refcursor;

exec PACKAGE_NAME( in_Arguments, in_Arguments , :Out_CURSOR);

※ DBMS_Output 창을 먼저 실행해야 한다.

Ajax로 구성된 어플리케이션을 분석하다보면, getElementById( )란 함수를 자주 보게 된다. 이것은 document 오브젝트에 내장된 함수로서, 현재 브라우저내의 오브젝트를 id 기준으로 찾아내고 해당 오브젝트에 대한 참조를 반환한다.

우선 간단히 살펴보자. 다음 예제는 input 텍스트를 찾아서 해당 내용을 경고창(alert)으로 출력하는 예제이다.

<body>
<input id="input_txt" type="text" value="getElementId로 값 구하기" />
<script type="text/javascript">
var inputTxt = document.getElementById('input_txt');
alert(inputTxt.value);
</script>
</body>

위 코드에서 input 텍스트 필드에 id가 input_txt로 설정되어 있고, 텍스트 필드의 내용(value)으로 'getElementId로 값 구하기'라고 설정되어 있다. 그리고 자바스크립트에서 document.getElementById('input_txt')로 텍스트 필드의 참조를 구한다. 이 참조는 inputTxt에 저장되고 inputTxt.value는 텍스트 필드의 내용(value) 값을 가리키는 것이다.

getElementById( ) 이외에 getElementByTagName( )과 getElementByName( ) 함수를 통해 원하는 오브젝트에 대한 접근이 가능하다. 하지만 전자는 바로 유니크한 오브젝트에 접근하는 것이 아니고(태그의 연관배열을 리턴하고 getElementByTagName('TD').item(0)과 같이 접근해야 함), 후자는 IE에서만 가능하다. 따라서 id로 구별하여 접근할 수 있는 getElementById( )를 많이 쓴다.

innerHTML 속성

document.write( )를 사용하면 화면에 출력이 가능하다. 그런데 이것은 페이지가 로딩될 때에만 출력된다(지금까지 내가 알기론...). 예를 들어 이미 화면이 모두 로딩 된 다음 추가 텍스트를 특정 위치에 다시 뿌려줄 수 없다. 이런 상황에서는 <div>의 innerHTML 속성을 사용해서 화면출력을 할 수 있다.

<html>
	<head>
		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
		<title>innerHTML 출력</title>
		<script type="text/javascript">			
			function printOut(){				
				var inputTxt = document.getElementById('input_txt').value;
				var outputForm = document.getElementById('output_form');

				outputForm.innerHTML = inputTxt;
			}
		</script>		
	</head>
	<body>
		<div>
			출력할 문자열을 입력하세요 :
			<input id="input_txt" type="text" />
			<input type="button" value="출력" onclick="printOut();" />
		</div>
		<div id="output_form">
		</div>
	</body>
</html>

위 코드를 실행하면 getElementById('input_txt')로 입력한 텍스트의 값을 구하고, '출력' 버튼을 누르는 순간 getElementById('output_form')을 찾아서 outputForm으로 참조하고 innerHTML 속성을 바꾸어 입력 문자열을 출력한다.

오늘은 여기까지...

이 글의 저작권은 asoop.com에 있습니다.
출처를 명확히 밝히는 조건으로 스크랩 및 상업적 이용을 허락합니다.
제목이 너무 복잡해 보이긴 합니다만 달리 표현할 방법이 없네요. 요즘 웹디자인할 때
플래쉬 무비를 여러 개 사용하다 보니 위치가 서로 겹치는 경우가 많은데 이때
앞뒤 순서(z-index) 설정하는 부분이 약간 복잡하게 되 있습니다.

특히 몇 가지 사항에 대해 잘 못 알고 있는 분들이 계셔서 참고 삼아 글 올립니다.


div 태그의 z-index 속성으로 순서를 정할 때 플래쉬가 포함되면 z-index가 기능하지
않습니다만 플래쉬무비 파라미터에 <PARAM NAME=wmode VALUE=transparent>를
포함시키면 z-index가 제대로 작동하게 됩니다.

특히 중첩된 두개의 레이어가 모두 플래쉬를 포함할 경우는 둘 다 위의 파라미터를 추가해
줘야 합니다. 둘 중 하나가 이 파라미터를 갖지 않으면 이넘이 모든 레이어의 위에 보여
지게 됩니다.

이렇게 되는 원인은 wmode 파라미터 설정이 갖는 의미가 단순히 플래쉬 무비를 투명
하게 하는데 있지 않고 다른 div들과의 z-index관계에 자신을 포함시키느냐의 여부까지
결정한다는데 있습니다. 이해하기 어려운 부분인데요 이 파라미터를 갖기 전에는 어떤
경우에도 z값을 부정해 버리지만 파라미터를 주면 z오더를 충실히 이행하는 z-index
준수 그룹으로 편입되어 버리는 것입니다. 즉 'wmode에 transparent를 주는 것은 말
그대로 투명도라는 특성을 주는 것이다' 라는 단순한 설정이 아니라 z오더에 대해
무시하던 플래쉬 무비를 z오더에 충실하게끔 만들어 준다는 것입니다.


참고로 혹시 오해하실 분이 계실것 같아서 말씀드리는 것은 여기서 플래쉬의 transparent
속성이 적용되는 것은 정확하게는 그 무비의 배경입니다. 그 무비의 스테이지 안에 위치한
배경을 제외한 다른 내용은 모두 보여지게 되는 것입니다. 자칫 특정한 이미지를 배경으로
사용하신 경우는 마치 transparent가 적용되지 않는 걸로 착각하실 수가 있습니다.

Syntax

HTML { overflow-x : sOverflow }
Scripting object.style.overflowX [ = sOverflow ]

Possible Values

sOverflow String that specifies or receives one of the following values.
visible Default. Content is not clipped and scroll bars are not added. Elements are clipped to the size of the containing window or frame.
scroll Content is clipped and scroll bars are added, even if the content does not exceed the dimensions of the object.
hidden Content that exceeds the dimensions of the object is not shown.
auto Content is clipped and scrolling is added only when necessary.

n      readyState Property

XML 문서의 현재 상태를 가리킨다.

Ø  Syntax

lValue = oXMLDOMDocument.readyState

Ø  Remarks

Long integer.

이 속성은 읽기 전용이다. 문서의 상태 지시와 XML 문서 객체의 전송상태를 위한 값을 돌려준다.

LOADING (1)

처리를 위한 데이터를 읽기 위한 로드 진행을 나타낸다. 그러나 데이터 파싱을 시작하지는 않는다.

표준 ReadyState 정의들의 목적은 데이터를 BLOB 속성과 동등해야 한다.

LOADED (2)

읽기, 파싱할 데이터의 처리준비를 위한 프러퍼티 읽기 완료를 나타낸다. 그러나 객체 생성 이전 단계이다.

INTERACTIVE (3)

객체 모델이 가져온 데이터 셋의 실행 가능여부, 읽기, 파싱과 같은 정보를 가진다. 객체 모델이 상태에서 가능할지라도 읽기 전용 속성을 가진다.

COMPLETED (4)

문서의 로드가 성공하거나 실패하거나 완전히 로드됨을 나타낸다.













Ø 
Example

문서가 비동기적으로 loading될 때 ready 상태의 차례를 알려주는 Jscript/HTML 예제이다.

<script>

var xmldoc;

function Load()

{

xmldoc = new ActiveXObject("Microsoft.XMLDOM");

xmldoc.onreadystatechange = CheckState;

xmldoc.load(URL.value);

}

function CheckState()

{

var state = xmldoc.readyState;

RESULTS.innerHTML += "readyState = " + state + "<BR>"

if (state == 4)

{

var err = xmldoc.parseError;

  if (err.errorCode != 0)

     RESULTS.innerHTML += err.reason + "<BR>"

  else RESULTS.innerHTML +="success" + "<BR>"

}

}

<script>

URL: <input type=text size=60 id=URL>

<input type=button value=LOAD onclick="jscript:Load()">

<div id=RESULTS style= "color:red;font-weight:bold;"></div>


출처 : http://home.postech.ac.kr/%7Ekelee/homedata/web/dom/viewbody3.htm

브라우저는 사용자 시스템상에 쿠키들을 관리할 책임이 있습니다. 쿠키들은 HttpResponse 객체를
통해서 브라우저에 보냅니다. Page 클래스의 Response 프로퍼티 처럼 HttpResponse 객체를 접근할 수 있습니다. 브라웢에 보내기를 원하는 어떤 쿠키들도 collection 에 추가될 겁니다. 쿠키를 생성할 때, 쿠키의 명과 값을 명시해야합니다. 브라우저가 서버에서 request 할 때 , 서버는 request 와 함께 쿠키들을 보냅니다. asp.net 어플리케이션에서 HttpRequest 객체를 이용하여 쿠키들을 읽을 수 있습니다. 마치 page 클래스의 request 프로퍼티 처럼 가능합니다. 하나의 text box 를 추가하고 2개의 버튼들과 하나의 label 을 웹페이지에 추가했습니다. textbox 은 쿠키정보를 inputting 하기 위한 용도입니다. 추가 버튼을 누름으로 인해 샘플 어플리케이션은 새로운 쿠키를 생성할 겁니다. View 버튼을 클릭하면 우리는 생성된 쿠키를 확인 하실 수 있습니다. 쿠키 만기일은날짜는 2006-10-1로 셋팅 했습니다.

protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{

Response.Cookies["MyCookie"]["Data"] = TextBox1.Text;
Response.Cookies["MyCookie"]["Time"] = DateTime.Now.ToString("G");
Response.Cookies["MyCookie"].Expires=DateTime.Now.AddMonths(1);

Label1.Text = "Cookie created!<p>" + "Your cookie contains:<font color=red>" + Request.Cookies["MyCookie"]["Data"] + "<br>" + Request.Cookies["MyCookie"]["Time"] + "</font>";

Response.Cookie("MyCookie").Expires=DateTime.FromString("2006-10-1");

}
protected void Button2_Click(object sender, EventArgs e)
{
if (Request.Cookies["MyCookie"] == null)
Label1.Text = "There is no cookie:";
else
Label1.Text = "Your cookie contains:" + "<font color=red>" + Request.Cookies["MyCookie"]["Data"] + "<br>" + Request.Cookies["MyCookie"]["Time"] + "</font>";

}

aspx 페이지 입니다.

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>

<body>
<form id="form1" runat="server">
<div>
<fieldset>
<legend>rdfdf</legend>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Add" Width="70px" />
<asp:Button ID="Button2" runat="server" Text="View" Width="84px" />
<br />
<br />
<asp:Label ID="Label1" runat="server" Text="" Width="138px"></asp:Label>
</fieldset>
</div>
</form>
</body>
</html>

전체적인 code behind 는 아래와 같습니다.

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{

protected void Page_Load(object sender, EventArgs e)
{

}

protected void Button1_Click(object sender, EventArgs e)
{
Response.Cookies["MyCookie"]["Data"] = TextBox1.Text;
Response.Cookies["MyCookie"]["Time"] = DateTime.Now.ToString("G");
Response.Cookies["MyCookie"].Expires=DateTime.Now.AddMonths(1);
Label1.Text = "Cookie created!<p>" + "Your cookie contains:<font color=red>" + Request.Cookies["MyCookie"]["Data"] + "<br>" + Request.Cookies["MyCookie"]["Time"] + "</font>";
Response.Cookie("MyCookie").Expires=DateTime.FromString("2006-10-1");
}
protected void Button2_Click(object sender, EventArgs e)
{
if (Request.Cookies["MyCookie"] == null)
Label1.Text = "There is no cookie:";
else
Label1.Text = "Your cookie contains:" + "<font color=red>" + Request.Cookies["MyCookie"]["Data"] + "<br>" + Request.Cookies["MyCookie"]["Time"] + "</font>";

}
}

감사합니다.
==================================
카페 : http://cafe.daum.net/aspdotnet
작성자 : 심재운
메일 : shimpark@gmail.com
==================================

WINDOWS KEY + ...
번호 단축키 내          용
1 윈도우키 시작메뉴 부르기 ( = Ctrl + Esc )
2 윈도우키 + D (토글) : 바탕화면보기 ( = 화면에 나타난 창을 모두 작업표시줄로..)
3 윈도우키 + M : 바탕화면보기 2 ( cf; 윈도우키 + Shift + M : 창 원래대로..)
4 윈도우키 + E : 윈도우탐색기열기
5 윈도우키 + F : 검색창 ( = 찾기에서 "파일또는 폴더")
6 윈도우키 + Pause/Break : 시스템 등록정보
7 윈도우키 + Ctrl + F : 검색창 ( = 찾기에서 "컴퓨터")
8 윈도우키 + R : 실행창 ( = 시작 -> 실행)
9 윈도우키 + Tab (+ Enter) : 프로그램 이동
10 윈도우키 + F1 : 윈도우 도움말
11 윈도우키 + L : 로그온 화면
Alt + ...
1 Alt + 방향키 : 뒤로 (<-) , 앞으로 (->) (인터넷 익스플로러 또는 탐색기에서)
2 Alt + Space Bar : 시스템 메뉴 호출
3 Alt + Enter : 등록정보 보기
4 Alt + F4 : 프로그램 종료 (현재 프로그램을 바로 종료시킴)
5 Alt + Tab : 프로그램 이동 ( Enter 누를 필요없이 바로 이동)
6 Alt + F : 응용프로그램의 "File" 메뉴 호출
Ctrl + ...
1 Ctrl + Esc : 시작메뉴 부르기 ( = 윈도우 키)
2 Ctrl + F4 : MDI 프로그램 문서닫기 (mIRC 같은 프로그램)
3 Ctrl + Alt + Delete : 프로그램 강제 종료 (작업관리자로 이동하여 선택적 종료)
4 Ctrl + W : 현재창 닫기 (한 프로그램에서 여러창 띄운 경우 - 프로그램 종료와는 다름.)
5 Ctrl + A : 모두선택
6 Ctrl + C : 복사하기
7 Ctrl + X : 잘라내기
8 Ctrl + V : 붙여넣기
Shift + ...
1 Shift + Delete : 휴지통을 거치지 않고 바로 삭제
2 Shift + CD 넣기 : CD 자동 실행 않기
3 Shift + 방향키 : 블록 지정하기
4 Shift + 폴더 (더블) 클릭 : 폴더를 윈도우 탐색기처럼 열기
5 Shift + F10 : 바로가기 메뉴
마우스와 단축키
1 Ctrl + 클릭 : 떨어져있는 복수 개체 선택
2 Shift + 두군데 파일을 지정 : 연결된 복수개체 선택
3 Ctrl + 드래그 : 복사하기
4 Shift + 드래그 : 이동하기
5 Ctrl + Shift + 드래그 : 바로가기 아이콘 만들기
6 Shift + X 표시 클릭 : 현재 폴더와 상위 폴더 닫기
Space
Bar
인터넷 익스플로러에서 마우스나 화살표키를 쓸 필요없이 스페이스바를 치면 현재 화면에서 아래 화면으로 내려갑니다.
이메일을 읽다가 현재 창에서 읽기가 끝났을 때는 스페이스바를 치면 아래로 내려갑니다.
메일 읽기가 끝났을 때 스페이스바를 치면 다음 메일로 넘어갑니다.
엑셀에서는 지울 내용이 있는 칸에 커서를 대고 `Delete' 키나 `Back Space' 키를 누르지 않아도, 스페이스바 한번만 누르면 내용이 전부 지워집니다.
파워포인트에서는 슬라이드 기능을 쓸 때 스페이스바를 치면 다음 화면으로 넘어갑니다.
Alt + Tab 윈도우의 멀티태스킹 기능으로 여러 프로그램 띄워 놓고 있을 때, 작업전환은 보통 마우스의 포인터로 하는데 단축키 `Alt + Tab' 으로도 할 수 있습니다.
작업창을 여러개 띄운 상태에서.. Alt 키와 Tab 키를 동시에 누른 후 Alt 키는 그대로 누른채 두고 Tab 키만 떼면 화면중간에 현재 활성화된 프로그램 전부를 보여주는 창이 뜨고 이 상태에서 Tab키를 툭툭 눌러보면 블록이 움직이는 것을 볼 수 있습니다.
바꿀 작업창으로 블록을 움직이면 됩니다. 손에 익으면 마우스를 쓰는 것보다 더 편합니다.
또한 이 단축키를 이용하면 마우스 작동이 멈췄을 때도 안전하게 재부팅할 수 있습니다. 먼저 Alt + Tab을 눌러 작업창을 띄운 뒤, Alt + F4 를 눌러 프로그램을 종료시키고, 프로그램 종료가 끝나면 자판에 있는 윈도우키를 누른 후, `시작' 창이 뜨면 화살표 키로 시스템 종료를 택한 뒤 엔터.
Ctrl + Enter 익스플로러에서 가장 대표적인 주소인 http://www.**.co.kr 을 곧바로 띄워줍니다.
주소창에 kbs 라고만 치고, 콘트롤키와 엔터키를 함께 누르면 http://www.kbs.co.kr 이 뜨는 것을
볼 수 있습니다. 이 기능은 인터넷 익스플로러 5.5 버전 이상을 사용하는 경우에 해당합니다.
5.5 보다 낮은 버전 사용자는 .co.kr 대신에 .com 으로 연결됩니다.
Esc (시작화면 없이 바로 윈도우 띄우기) 컴퓨터를 부팅할 때 윈도우 로고,
즉 시작화면을 띄우는 시간이 지겨운 분들은 윈도우 부팅할 때 `Esc' 를 누르세요.
시작화면을 아예 없애려면 윈도우 98 사용자의 경우 루트 폴더에 있는 `msdos.sys' 라는 파일을
메모장에서 열고 `Options' 항목을 찾아 logo 값을 0 으로 바꿔주면 됩니다.
이 파일은 읽기전용이므로 편집을 하려면 속성을 바꿔줘야 합니다.
하지만 시스템 운영에 필요한 파일인 만큼 초보자들은 가급적 건드리지 않는 것이 좋습니다.
시스템을 다시 켜야 하는 경우 컴퓨터 전체를 재부팅하기보다는 윈도우만 다시 시작하게 하는 것이 기다리는 시간을 많이 줄일 수 있습니다. 윈도우 재시작을 시키려면 윈도우 시작 메뉴에서 종료 버튼을 누를 때 `시스템 다시 시작' 메뉴를 선택하면서 시프트 (Shift) 키를 누르고 있으면 됩니다. 그러면 컴퓨터는 윈도우 재시작만 하기 때문에, 시스템 재시작을 할 때 컴퓨터가 자기진단을 하면서 걸리는 시간을 단축시킬 수 있습니다.
한자키 + 한글자음 (윈도우나 익스플로러 등에서 특수문자 사용) 윈도우나 익스플로러 등에서 글쓰기를 할 때 가끔 ▲ 나 ☎, ♨ 등과 같은 특수문자를 써야 할 때가 있는데 아래아한글이나 워드를 실행시켜 원하는 특수문자를 찾아 복사해서 옮겨쓰는 방법이 아니라 윈도우키 (한글자음 + 한자키) 를 이용하는 방법이 있습니다. (한자가 나오는 조그만 창으로 여러 특수기호들이 나타남.)
- 한자키 + ㅂ : ─ │ ┌ ┐ ┘ └ ├ ┬
- 한자키 + ㄴ : '나' 등의 기호를,
- 한자키 + ㅈ : 로마자 숫자 ( ⅰ ⅱ ⅲ ⅳ나 Ⅰ Ⅱ Ⅲ Ⅳ...)
- 한자키 + ㅅ : 기수형 한글자음 ( ㉠ ㉡ ㉢ ...)

IE 7 실행시 첫페이지가 http://runonce.msn.com/runonce2.aspx 로 고정되는 문제

Windows Registry

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main]
"RunOnceComplete"=dword:00000001
"RunOnceHasShown"=dword:00000001

추가하면 된다.  권한이 없을 경우에는 현재 사용자에게 권한을 열어주면 된다.

출처: http://blog.naver.com/yourjp?Redirect=Log&logNo=10010107240

C++, C# 및 SQL을 아신다면 이해에 큰 도움이 됩니다.

보안은 다차원적인 문제입니다. 어디에서나 보안상 위험이 발생할 수 있습니다. 사용자가 오류 처리 코드를 작성하거나 너무 많은 권한을 제공하는 경우, 서버에서 실행하고 있는 서비스가 무엇인지 잊어 버리는 경우, 모든 사용자 입력을 허용하는 경우 등이 있습니다. 그 밖에도 여러 가지 경우가 있습니다. 다음과 같은 안전한 네트워크 전략에 대한 10가지 주의 사항에 따라 시스템, 네트워크, 코드를 순조롭게 보호할 수 있습니다.

간이 목차
1. 사용자 입력 신뢰의 위험성
2. 버퍼 오버런 방지
3. 사이트 간 스크립팅 방지
4. sa 사용 권한 불필요
5. Crypto 코드 주의
6. 사용자의 공격 프로필 감소
7. 최소한의 권한 원칙 사용
8. 실패 모드에 주의
9. 취약한 가장
10. 관리자가 아닌 사용자가 실제로 사용할 수 있는 응용 프로그램 작성


발췌 : Michael Howard와 Keith Brown의 칼럼 중 / 마이크로소프트
현상 : Oracle Stored Procedure 호출이 제대로 되지 않음
원인 : Stored Procedure에 입출력되는 VARCHAR 변수의 초기화가 되지 않음
조치 : Stored Procedure 입력, 출력 VARCHAR 변수의 Length를 반드시 설정
(TMS에 문제를 일으키는 것으로 보임)
-----
현상 : exec TMS_ORACLE7 -A: Failed.
원인 : ORACLE에서 DB 사용자에게 GRANT(사용허가권)가 없어서 발생하는 문제임.
ORACLE LIB에서 문제가 생길 수도 있다.
조치 : ORACLE의 VIEW중에 V$XATRANS$라는 VIEW를 GRANT시켜주면 조치됨.
ORACLE의 DBA권한에서 실행가능함.
방법: grant all on V$XATRANS$ TO SCRJPCS
여기서 SCRJPCS는 DB USER-ID임.
-----
현상 : DataBase에 연결하지 못한다.
원인 : 1.해당 DataBase에 필요한 환경 설정이 잘못되어 있다.(INVAL Error발생)
2.환경 파일에 환경 설정이 잘못되어 있다.(INVAL Error)
3.DataBase에 권한이 없다.
4.DataBase가 기동되지 않았다.
조치 : 1.set 명령으로 필요한 환경변수 설정을 확인한다.
- Oracle : ORACLE_HOME, ORACLE_SID, ORA_NLS
- Informix : INFORMIXDIR, INFORMIXSERVER
2.구성파일에 설정되어 있는 ENVFILE을 확인한다.
3.해당 User에게 DataBase 권한을 부여한다.
- ORACLE : "v$xatrans$"라는 VIEW에 대하여 해당 User에게 권한을 부여한다.
- INFORMIN : 해당 DB를 사용할 수 있는 권한을 User에게 부여한다.
4.DataBase를 기동하고 Server를 새로 띄운다.
-----
현상 : LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0 PLS-00801: Message 801 not found; product=PLSQL; facility=PCM
22/9 PL/SQL: SQL Statement ignored
28/17 PLS-00201: identifier 'JWONRYO.JWONMAS' must be declared
62/9 PL/SQL: SQL Statement ignored
원인 : 현 Database의 Domain 밖에 있는 Table을 Handling하는 경우에 권한이 없는
경우에 발생
조치 : 접근할 수 있는 권한을 부여한다.
-----
현상 : LINE/COL ERROR
-------- -----------------------------------------------------------------
135/5 PL/SQL: Statement ignored
135/9 PLS-00365: 'AVSQLCODE' is an OUT parameter and cannot be read
원인 : OUT parameter를 IN parameter로 사용하고 그 값을 읽은 경우.
조치 : OUT parameter를 IN OUT parameter로 선언.
-----
현상 : ORA-0020
원인 : 프로세스 수를 프로세스를 초과한 경우.
조치 : 프로세스 수를 들여줌.
-----
현상 : ORA-00023: session references process's private memory; cannot detach session
원인 : XA library를 사용하는데 Oracle이 dedicator server로 설치된 경우 발생
조치 : XA library를 사용할려면 Oracle을 MTS mode로 설치되어야 한다.
-----
현상 : 1.ORA-0054 resource busy and acquire with NOWAIT specified
2.ORA-0054 WHEN DROP A TABLE(SESSION KILL)
원인 : 1.Oracle 사용자가 어떤 Row을 Lock를 했는데, 다른 Oracle 사용자가 NOWAIT문을 이용하여
동일한 Row를 Lock를 한 경우에 발생
2.TABLE에 LOCK이 걸려 DML 및 DDL 명령 사용시
조치 : LOCK을 걸고있는 SESSION들을 KILL
-----
현상 : ORA-0059
원인 : DB_FILES 값에 도달한 경우
조치 : init.ora 의 DB_FILES 를 늘려주고 DB 를 Restartup 하면 해결
-----
현상 : ORA-00210: cannot open control file '/dev/vx/rdsk/oracle/v_ctl1'
ORA-07368: sfofi: open error, unable to open database file.
원인 : Sequent Symmetry or NUMA-Q platform이 very large file (O/S에서 2GB
이상의 file system 지원)을 지원하기 위해 VLFS patch를 적용했거나
VLFS를 이미 지원하는 O/S Version일 경우 오라클 master node가 정상적으로
startup 되고 나서 다른 node가 startup parallel이 될 때 먼저 startup 된
master node가 shared disk 의 모든 오라클 관련 file을
none-shared mode로 open 하기 때문에 위의 현상이 발생됨.
조치 : 1.PTX/Cluster V1.3.2일 경우
* Oracle V7.3.x : O/S상에서 VLFS patch적용하지 않았을 경우는 관계
없으나, 이미 적용되었다면 추가적으로 O/S patch FP#23373
적용하여야 함
2.PTX/Cluster running DYNIX/PTX 4.4.x 일 경우
* Oracle V7.3.3 : 현재 fix된 patch는 없으며 다음과 같은
workaround 방법으로 해결이 가능함.

Workaround)
--- $ORACLE_HOME/rdbms/lib/ins_rdbms.mk file에 아래의 추가된 부분만
삽입하여 오라클 kernel relink 실시
(예:make -f ins_rdbms ioracle)
oracle: $(ORALIBD) $(CORELIBD) $(NETLIBD) $(KSMS) $(CONFIG)
$(PSOLIBLIST) opimai.o @$(ECHO) $(LINK) -o $@ $(LDFLAGS)
$(LDFLAGS_ORA) opimai.o $(CONFIG) \
-llkseqora \ ---> 추가된 부분
$(LLIBSERVER) $(LLIBORA) $(LLIBKNLOPT) $(LLIBSLAX)
$(LLIBPLSQL) \
$(LLIBSICX) $(LLIBSOWSUTL) \
$(LLIBSICX) $(LLIBSOWSUTL) \

...........
...........

* Oracle V7.3.4 :
Oracle V7.3.4 일 경우는 문제가 없으나 patchset을 적용할 경우
V7.3.4.2에서는 V7.3.3과 같은 방법으로 oracle kernel을 relink하면
문제가 해결됨.
-----
현상 : ORA-0376 : file %s cannot be read at this time
원인 : DBF가 파손됨.
조치 : Check the state of the file. Bring it online
-----
현상 : ORA-00376: file 29 cannot be read at this time
ORA-01110: data file 29: '/db/GICORP_4/axix01.dbf'
원인 : datafile의 size가 os에서 허용하는 filesize를 초과해서 발생.
조치 : unix의 ulimit filesize를 확인해 보시기 바랍니다.
그리고 datafile size 보다 크도록 수정해 주어야 합니다.
1.unix ulimit filesize를 증가 시킨다
C shell인 경우
% limit filesize <number>
Bourne 이나 Korn shell 인 경우
$ ulimit -f <number>
2.archivelog mode인지 확인합니다
SVRMGR> select * from v$database;

NAME CREATED LOG_MODE CHECKPOINT ARCHIVE_CH
--------- -------------------- ------------ ---------- ----------
GICORP 05/17/00 13:44:56 ARCHIVELOG 36290290 36284249
1 row selected.
3.media recovery가 필요한 datafiles를 찾습니다
SVRMGR> select * from v$recover_file;

FILE# ONLINE ERROR CHANGE# TIME
---------- ------- ------------------ ---------- --------------------
9 OFFLINE 36287415 12/20/00 23:30:55
23 OFFLINE 36289350 12/21/00 08:40:54
28 OFFLINE 36287415 12/20/00 23:30:55
29 OFFLINE 36287415 12/20/00 23:30:55
37 OFFLINE 36287415 12/20/00 23:30:55
5 rows selected.
4.각각의 datafile에 대해서 다음을 실행해 줍니다
SVRMGR> recover datafile '/db/GICORP_4/axix01.dbf';

Media recovery complete.

SVRMGR> alter database datafile '/db/GICORP_4/axix01.dbf' ONLINE;
Statement processed.

5.database를 restart합니다

SVRMGR> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
SVRMGR> startup
ORACLE instance started.
Total System Global Area 54578916 bytes
Fixed Size 69348 bytes
Variable Size 20783104 bytes
Database Buffers 33554432 bytes
Redo Buffers 172032 bytes
Database mounted.
Database opened.
SVRMGR>
-----
현상 : ORA-0312,0313 에러(ONLINE LOG CRASH)
원인 : 1.데이타베이스 STARTUP 시 발생
조치 : [ ONLINE LOG 가 손상되었을때 DB에 OPERATION 이 없었던 경우는 다음과 같은 절차로 DB을
OPEN 할수있다 - 확률 70% ]

1.CONTROLFILE 생성
-. 손상된 online log 는 포함시키지 않는다.
-.resetlogs option 으로 생성한다.
-.reuse option 은 생략하고 기존 controlfile 은 다른이름으로 move 시킴.

<V7 에서 CONTROLFILE 생성하는 방법 >
sqldba> startup mount
sqldba> alter database backup controlfile to trace;

위와 같이 명령을 입력하면 ORACLE_HOME/rdbms/log 디렉토리에 트레이스 화일이
생긴다. 그 트레이스 화일에서 create controlfile 명령부분을 남기고 삭제한다.
콘트롤화일 생성 문장 예 - <cnt.sql> : GROUP 1 이 ONLINE LOG 라고 가정
---------------------------------------------------------------------
CREATE CONTROLFILE DATABASE "RC722" RESETLOGS NOARCHIVELOG
MAXLOGFILES 32 ********
MAXLOGMEMBERS 2
MAXDATAFILES 30
MAXINSTANCES 8
MAXLOGHISTORY 800
LOGFILE
GROUP 2 '/oracle/oracle/dbs/log2RC722.dbf' SIZE 5M,
GROUP 3 '/oracle/oracle/dbs/log3RC722.dbf' SIZE 5M
DATAFILE
'/oracle/oracle/dbs/systRC722.dbf',
'/oracle/oracle/dbs/rbsRC722.dbf',
'/oracle/oracle/dbs/toolRC722.dbf',
'/oracle/oracle/dbs/usrRC722.dbf',
'/oracle/oracle/dbs/tempRC722.dbf',
'/oracle/oracle/rcdata.dbf'
;
2.절차
$ sqldba lmode=y
SQLDBA> connect internal
SQLDBA> shutdown abort
SQLDBA> startup nomount
statement processed
SQLDBA> @cnt
SQLDBA> recover database using backup controlfile until cancel;
....
...
CANCEL (Return)
Recovery canceled
SQLDBA> alter database open resetlogs;

: 만일 정상적으로 open 되면 log file 추가
SQLDBA> alter database add logfile '?/dbs/log1ORA722.dbf' size 1M;
: 정상적으로 open 안되면 RC에 다시 연락
-----
현상 : ORA-0439
원인 : BITMAP INDEXES 생성 시 option 이 인스톨되지 않아서 발생
조치 : 반드시 Oracle 8 Enterprise Edition 에서만 사용이 가능하다.
Oracle 8i 에서도 동일하게 적용된다.
-----
현상 : ORA-0600[3339] DATA BLOCK CORRUPTION DETECTION
[3339] [arg1] [arg2] [] [] [] []
ORA-1578 : Data block corrupted in file # block #
원인 : 1.ORACLE이 직접 버퍼로 데이타를 읽어들일 때 읽은 블럭의 DBA(Data Block Address)가 잘못
되었음(INVALID)을 의미
2.ORACLE의 문제가 아니라 OS나 HW의 문제인 경우가 많다.
-----
현상 : ORA-0604: error occurred at recursive SQL level %s
원인 : 1.내부적으로 SQL명령이 실행될 때 발생(현재 할당된 익스텐트가 가득 차서 다음 익스텐트를
할당 받으려고 할 때 오라클이 다음 익스텐트의 크기와 위치를 결정하기 위하여 SELECT
명령을 내리게 되는 것과 같은 경우)
2.init.ora 화일의 파라미터 가운데 DC_FREE_EXTENTS 나 ROW_CACHE_ENQUEUES 의 값이 너무
작게 설정
3.테이블 스페이스가 가득 차거나 Extent 갯수의 최대 허용값을 초과해서 에러가 발생하는
경우 ORA-604 에러가 함께 발생
조치 : 1.?/dbs/init<SID>.ora 화일에 지정된 open_cursors 의 크기를 알아보는 것이다. 이 값이
설정이 안되어 있으면 Default가 50이므로
open_cursors=255
----------------
2.DC_FREE_EXTENTS 나 ROW_CACHE_ENQUEUES들의 값을 크게 설정
3.에러의 원인을 찾기 위해서 init.ora 화일에 다음과 같은 라인을 추가한다.
events = "604 trace name errorstack"
이렇게 init.ora를 변경하고 DB를 Shutdown 하고 Startup 하면 ORA-0604 에러가 발생하는
경우에 자세한 정보를 Trace 화일에 기록해 주므로 이 화일을 검사하여 에러의 원인을
찾을 수 있다.
-----
현상 : ORA-0901 invalid CREATE command
원인 : CREATE 뒤에 오는 KeyWord를 식별하지 못한 경우
-----
현상 : ORA-0902 invalid dadatype
원인 : Oracle에서 제공되지 않은 datatype를 사용한 경우
-----
현상 : ORA-0903 invalid table name
원인 : 테이블의 이름이 Oracle object 명명에 대한 필요조건을 만족시키지 못한 경우
-----
현상 : ORA-0904 열명이 부적합합니다.
원인 : 컬럼이 테이블에 존재하지 컬럼을 사용한 경우
-----
현상 : 083147.gold!stmkdjc.22031: LIBTUX_CAT:522: INFO: Default tpsvrdone() function
used
ORA-0904 : invalid column name
ORA-1003 : no statement parsed
원인 : 1.해당 Table에 존재하지 않은 Field를 사용한 경우
2.Host Variable 앞에 ":"를 덧붙지지 않은 경우
3.해당 Table를 변경하고 관련된 프로그램을 컴파일하지 않은 경우
조치 : 1.해당 Table에 Column이 존재하는지 확인
2.Host Variable 앞에 ":"를 덧붙인다.
3.해당 Table에 관련된 프로그램를 컴파일한다.
-----
현상 : ORA-0906 missing left parenthesis
원인 : 왼쪽 괄호를 찾지 못한 경우에 발생
-----
현상 : ORA-0907 missing right parenthesis
원인 : 오른쪽 괄호를 찾지 못한 경우에 발생
-----
현상 : ORA-0910 specified legth too long for its datatype
원인 : 특정 datatype의 길이가 허용 최대 길이를 초과한 경우
-----
현상 : ORA-0911 invalid character
원인 : Oracle이 뮤효 문자라고 간주하는 것을 만날 때 발생한 에러로 실제문제는 없어진 문자때문
-----
현상 : ORA-0913 too many value
원인 : INSERT문에서 지정된 열의 수보다 열 값의 수가 적으면 발생
-----
현상 : ORA-0917 missing comma
원인 : 1.Comma를 기대하고 있는 SQL문에 comma가 없는 경우
2.오른쪽 괄호가 없는 경우에도 발생
-----
현상 : ORA-0918 column ambiguously defined
원인 : 1.둘 이상의 테이블이 한 SQL문에서 참조될 때 발생
2.한개 이상의 지정된 테이블에 존재하는 어떤 열이 해당 테이블로 한정받지 못한 경우
-----
현상 : ORA-0920 invalid relational operator
원인 : 관계 연산자를 식별하지 못한 경우
-----
현상 : ORA-0921 unexpected end of SQL command
원인 : 불완전한 SQL문일 경우에 발생
-----
현상 : ORA-0922 missing or invalid option
원인 : option에 임의의 문자가 삽입됨(예:NOT NULL --> NOT_NULL)
-----
현상 : ORA-0932 inconsistent datatype
원인 : 1.어떤 연산자를 어떤 열에 적용시키려고 하는데 그것의 datatype을 연산자와 함께 사용한 경우
2.ORA-0997 illegal use of LONG datatype을 복귀시킬 가능성
-----
현상 : ORA-00933: SQL command not properly ended
원인:
-----
현상 : ORA-0934 group function is not allowed here
원인 : SQL문의 WHERE구나 GROUP BY구에서 Group function를 사용한 경우
-----
현상 : ORA-0936 missing expression
원인 : 1.Comma 기술 뒤에 열이나 표현식이 존재하지 않은 경우에 발생
2.ORA-0917 missing comma을 복귀시킬 가능성
-----
현상 : ORA-0937 not a single-group group function
원인 : 어떤 SQL문의 선택 list는 어떤 열이 GROUP BY구에서 참조되지 않으면 그열과 Group function를
포함할 수 없다.
-----
현상 : ORA-0938 not enough arguments for function
원인 : SQL문이 불충분한 수의 인수로 함수를 호출한 경우에 발생
-----
현상 : ORA-0942 : table or view does not exist(테이블 또는 뷰가 존재하지 않습니다.)
원인 : Oracle은 테이블이나 뷰가 존재하지만 사용자가 테이블이나 뷰를 위한 오브젝트 특권(Grant)을 부여하지 않음
조치 : Table 생성 및 권한부여
-----
현상 : ORA-0947 not enough values
원인 : INSERT문에서 지정된 열의 수가 열 값의 수보다 클때 발생
-----
현상 : ORA-0979 not GROUP BY expression
원인 : 어떤 query의 선택 list 안의 한 열이 GROUP BY구에 들어있고 다른 열은 들어있지 않은 경우에 발생
-----
현상 : ORA-0997 illegal use of LONG datatype
원인 : 1.어떤 기능들은 datatype이 LONG인 열에서 수행되지 않는다.
2.Long column은 2G까지 지원을 하지만,
SQL*Plus에서 insert into 문장을 이용하여 long column에 넣을 문자열을
single quote(') 안에 기술 시, 2000 characters가 넘으면 ora-1704 에러가 난다.
조치 : 1.TABLE의 COPY는 가능하지 않으므로,LONG COLUMN을 가진 테이블을 COPY하고자 할 때,
32KBytes 이하의 size라면 다음의 PL/SQL을 사용하면 가능하다.
2.PL/SQL을 이용해야 하며, 경우에 따라 Pro*C, SQL*Loader 등을 이용하여 insert해야만 한다.
-----
현상 : ORA-1001 Invalid Cursor
원인 : Typing 에러, 잘못된 메모리 관리 등의 여러가지 원인에 의해서 발생.
조치 : 1.환경에서 조치할 사항
- PRECOMPILE 옵션 가운데 MAXOPENCURSORS 를 늘려준다.
- init<SID>.ora 화일에서 OPEN_CURSORS 파라미터 값을 늘려준다.
- 사용되지 않는 CURSOR는 OPEN 상태로 두지 말고 CLOSE 시켜준다.
- 지금은 거의 사용되지 않지만 ORACLE V6 를 사용한다면 PRECOMPILE 옵션 가운데
AREASIZE를 512K 정도로 크게 늘려주도록 한다. 그리고 init<SID>.ora 에서
CONTEXT_AREA 값도 늘려준다 .
- TRACE FILE을 이용하면 문제의 원인을 찾는데 있어 유용할 때가 있다.
2.그 밖의 경우
- OPEN 되지 않은 CURSOR 에 대해서 작업을 할 때
- 존재하지 않는 OBJECT에 대해서 SQL 명령을 실행할 때
- CURSOR CACHE로부터 삭제된 경우
- CURSOR CACHE로부터 삭제된 또다른 경우
PRECOMPILE 옵션 가운데에서 MAXOPENCUSORS 를 늘려주거나
HOLD_CURSOR=YES, RELEASE_CURSOR=NO 로 설정
- XA/TUXEDO 환경에서 ORA-1001 에러가 발생하는 경우(일부 ORACLE 버젼에서 발생)
-----
현상 : ORA-1002 FETCH OUT OF SEQUENCE IN PRO*C(stop[<fltmsjaud>]:리스너를 중단합니다.
원인 : 1.user가 더이상 유효하지 않은 cursor로부터 fetch를 하려고 하기 때문
2.ORA-1403 등과 같이 NO DATA FOUND를 return하는 fetch작업을 수행할때
3.SELECT FOR UPDATE를 가진 cursor 의 fetch작업내에 commit이 있는 경우
조치 : 3.commit을 fetch loop의 바깥쪽으로 빼거나 select for update문을 사용하지 않아야 한다.
-----
현상 : ORA-1012 Error( not logged on )가 발생
원인 : 1.tpbegin()이 되어 있지 않음
2.PC쪽에서 NOTRAN Mode로 Service를 호출
조치 : 1.Program을 확인한다.
2.flag를 0으로 Setting한다.(TRAN Mode로 Service 호출)
3.Service절에 Default에 AUTOTRAN을 "Y"로 설정하고 해당 Service명을 기술한다.
-----
현상 : ORA-1027 bind variables not allowed for data definition operations
원인 : WHERE에 BIND_VAR 를 이용한 CREATE VIEW 는 불가능
조치 : 이 경우 EXEC SQL CREATE TABLE IMAGE
(EMPNO NUMBER(4) NOT NULL, BITMAP LONG RAW)
END-EXEC.
이 처럼 create 해야 한다.
-----
현상 : ORA-1031 insufficient privileges
원인 : 사용자가 테이블이나 뷰와 연관된 적어도 한 개의 object 특권을 부여받았지만 SQL문에서 지정된
특권을 부여받지 않았을 때 발생
1.ORACLE의 SYSTEM 유저에 POWERBUILDER의 BASE TABLE 5개가 생성이 되어 있지
않은 경우
2.SYSTEM 유저로 접속한 후에도 일반 유저가 접속이 되지 않을 경우
조치 : 1.5개 base table(pbcatcol, pbcattbl, pbcatfmt, pbcatvld, pbcatedt)을
drop한 다음 system 유저로 접속을 하고, 다시 일반 유저로 접속하는 방법.
2.system 유저로 들어가서 5개 base table에 대한 사용 권한을
일반 유저에게 주는 방법.
$sqlplus system/manager

SQL>grant all on pbcatcol to public;
SQL>grant all on pbcatedt to public;
SQL>grant all on pbcatfmt to public;
SQL>grant all on pbcattbl to public;
SQL>grant all on pbcatvld to public;
-----
현상 : ORA-1034, "ORACLE not available"
ORA-7320, "smsget: shmat error when trying to attach sga."
ORA-7429, "smsgsg: shmget() failed to get segment."
원인 : ORACLE DBA 사용자만 데이타베이스를 ACESS할수 있고 다른 사용자는 SQL*PLUS 등을 통하여
CONNECT를 하려고 할때 다음 에러가 발생 할경우
-----
현상 : TPFAILED ......................
sqlca.sqlcode ==> -1036
ORACLE에서 단독으로 실행하면 문제가 발생되지 않고 OUTPUT을 정확하게 출력하지만
TP/M와 함께 실행이 되면 SQL SELECT문을 수행하지 못하고 sqlca.sqlcode ==> -1036의
MESSAGE를 뿌리고 실행을 멈춘다.
원인 : ORACLE에서 Version간의 Segment 정의부분이 다르기 때문
조치 : makefile 혹은 proc.mk file에서
sqlcheck=semantic userid=scrjpcs/scrjpcs를 포함시킨다.
-----
현상 : ORA-1039: insufficient privileges on underlying objects of the view.
원인 : SYS user가 아닌 다른 user로 SQL Analyze에 로그인하여 SQL statement에 대한 explain plan 옵션을 사용할 때 다음과 같은 에러가 발생
조치 : 1.dictionary table/view들을 validate시켜 놓으려면 dba가 read 권한만 SQL Analyze를 수행하는 user에게 grant하면 충분하다.
2.SYS user로서 SQL explaining을 수행하는 것이다.
-----
현상 : ORA-9992 scumnt: failed to open <FILENAME>
ORA-9993 scumnt: failed to lock <FILENAME>
ORA-1102 cannot mount database in exclusive mode
원인 : 서로 독립적인 두개의 instance가 동일한 database file들을 동기화 (synchronisation)없이 access할 수 있기 때문에 database corruption을 유발시킬 수 있었다.
조치 : database의 db_name이 변경되면 각각의 lk<DB_NAME> file을 생성.
-----
현상 : ORA-01118: cannot add any more database files: limit of XXX exceeded
원인 : 데이타 화일의 갯수가 MAXDATAFILES 값에 도달한 경우 발생
조치 : MAXDATAFILES를 늘리기 위해서는 DB를 새로 만들어야 하며 그 이후 버젼을 사용중이라면 콘트롤
화일을 새로 만들어서 MAXDATAFILES를 늘릴 수 있다
-----
현상 : ORA-1157 : cannot identify data file 11 - file not found
ORA-1110 : data file 11 : '/user1/oracle7/dbs/user2.dbf'
원인 : OS 명령으로 DATA FILE 을 삭제한 경우
조치 : DATABASE STARTUP시 STARTUP MOUNT 단계까지 실행한 후, 문제의 데이타 화일을 OFFLINE 시킨다.
데이타베이스를 오픈한다. 단 데이타베이스 오픈이 정상적으로 수행되면 문제가 발생한 데이타
화일을 포함하고 있는 TABLESPACE를 DROP하지 않을 경우에는 DATABASE STARTUP시 항상 데이타
화일의 오픈 단계에서 에러가 발생된다. 따라서, 문제의 데이타 화일의 OFFLINE과 TABLESPACE의
DROP전에 반드시 해당 TABLESPACE를 사용하고 있는 USER의 데이타 백업을 수행해야 한다.

데이타 화일의 OFFLINE과 관련된 명령은 다음과 같다.
SQLDBA를 COMMAND LINE MODE로 기동시킨다.

$ sqldba lmode=y
SQLDBA> CONNECT INTERNAL;
SQLDBA> STARTUP MOUNT;
ORACLE instance started.
Database mounted.
SQLDBA> ALTER DATABASE DATAFILE '/user1/oracle7/dbs/user2.dbf'
OFFLINE DROP;
Statement processed.
SQLDBA> ALTER DATABASE OPEN;
Statement processed.
SQLDBA> DROP TABLESPACE tablespace_name INCLUDING CONTENTS;
Statement
-----
현상 : ORA-01237 cannot extend datafile %s
원인 : O/S 레벨에서는 file size를 1TB 이상 지원한다고 하는데, oracle datafile을 2G 이상으로 resize하려고 한다거나 tablespace에 datafile을 추가하거나 생성할 때, 2G 이상 주면 file size limit에 걸리는 현상 발생
조치 : 화일 시스템에서 large file을 사용하기 위해서는 화일 시스템을 'largefiles' option으로 mount해야 한다.
-----
현상 : ORA-1400 primary key or mandatory(NOT NULL) column is missing or NULL during insert
원인 : 어떤 필수적인 열을 위한 값을 공급하지 않은 경우
-----
현상 : ORA-1401 inserted value too large for column(열에 입력한 값이 너무 큽니다.)
원인 : 문자열을 할당하고자 할때 길이가 최대치를 초과한 경우
-----
현상 : ORA-1403 no dada found
원인 : 사실상 전혀 Error가 아니다.
-----
현상 : ORA-1405 fetched column value is NULL
원인 : ERROR 가 아니고 WARNING MESSAGE 이다.
조치 : dbms=v6 를 PRECOMPILER OPTION 에 추가해준다. dbms=v6 로 SETTING 할경우는 HOST 변수에
NULL 이 RETURN 되더라도 sqlca.sqlcode 는 0 이 된다.
-----
현상 : ORA-1407 cannot update mandatory(NOT NULL) column to NULL
원인 : 필수적인 열의 값을 NULL에 설정한 경우에 발생
-----
현상 : ORA-1408 such column list already indexed
원인 : 이미 동일한 열 List에 기초한 Index를 갖고 있는 Table에서 Index를 작성하고자 하는 경우에 발생
-----
현상 : ORA-1410 invalid ROWID
원인 : 1.적절한 Format으로 ROWID를 상술하지 않은 경우에 발생
2.지정된 ROWID가 존재하지 않은 경우에 발생
-----
현상 : ORA-01438: 지정한 정도를 초과한 값이 열에 지정되었습니다.
원인 : 지정한 자릿수를 초과한 Column이 존재한 경우에 발생
-----
현상 : ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "SYS.STANDARD", line 648
ORA-06512: at "BETH.BETH", line 6
ORA-06512: at line 1
원인 : SELECT 문에서 조건에 해당하는 row가 2건 이상
return되었을 때 발생하는 TOO_MANY_ROWS 에러와 동일한 에러이다.
조치 : 확인한 결과 DUAL table에서는 비록 2개의 ROWID를 볼 수는 없지만,
실제 2개의 row가 DUAL table에 존재하는 상황이다.
따라서, 다음 명령을 이용하여 여분의 필요없는 row를 delete해야 한다.
-----
현상 : ORA-1449 column contains NULL values; cannot alter to NOT NULL
원인 : 어떤 열을 필수적인 것으로 변경하고자 하나 적어도 테이블 내의 한 행이 그 열을 위한 NULL값을
가질 때 발생
-----
현상 : ORA-1452 cannot CREATE UNIQUE INDEX; duplicate keys found
원인 : 값이 독특하지 않은 일련의 열에서 독특한 인덱스를 작성한 경우에 발생
-----
현상 : ORA-1453 SET TRANSACTION must be first statement of transaction
원인 : 모종의 다른 SQL문 이후에 SET TRANSACTION문을 기동할 때 발생
-----
현상 : ORA-01458 Invalid length inside variable character string
원인 : DB Table field의 길이와 Host Variable의 길이 차이가 있을때 발생한다.
그러므로 Table field의 길이와 Host Variable의 길이를 비교해 본다. 혹은 Stored
Procedure의 Input Parameter가 Null 값으로 넘겨질 때도 발생한다.
조치 : DB Table field와 Host Variable의 길이를 조정한다.
Stored Procedure의 Input Parameter에 Null값을 0의 값을 채워서 넘긴다.
주의 : Stored Procedure에서 Cursor를 사용할 때
FOR ... LOOP를 사용할 때 주의를 해야한다.
FOR i IN 1..batch_size LOOP
FETCH get_emp
INTO
emp_name( i )
,job( i )
,sql( i )
;

IF get_emp%NOTFOUND THEN -- if no row was found
CLOSE get_emp;
done_fetch := 100; -- indicate all none
EXIT;
ELSE
done_fetch := 900; -- indicate all none
found := found + 1; -- count row
END IF;
END LOOP;
에서 Fetch Array의 0번째에 Data를 저장할 때 문제가 생긴다.
그러므로, emp_name( 0 )이라고 하면 Error를 발생한다.
-----
현상 : ORA-01476: divisor is equal to zero
원인 : Zero값으로 임의의 수를 나누었을때 발생
-----
현상 : ORA-01480: trailing null missing from STR bind value
원인 : 1.해당 Column의 Size 보다 더 큰 값이 들어온 경우에 발생
2.Character Type(CHAR, VARCHAR)의 Host variable인 경우 변수 선언시 Table의 Column size 만큼의 변수길이를 선언한 경우 발생
조치 : 1.해당 Column의 Size와 해당값을 확인
2.Character Type(CHAR, VARCHAR)의 Host variable인 경우 변수 선언시 Table의 Column size에 1를 더해 주어야 한다.
(데이터의 마지막에 NULL 문자를 포함해야 하기 때문에)
-----
현상 : ORA-1481 invalid number format model
원인 : 어떤 숫자 Format Model이 미정의 문자를 포함한 경우에 발생
-----
현상 : ORA-1547 : Failed to allocate extent of size 'num' in tablespace 'TOOLS
원인 : TABLESPACE가 에러에 명시된 ORACLE block 수 만큼의 요청된 EXTENT를 할당할 충분한 FREE
SPACE를 갖고있지 못할 경우에 발생
조치 : 1.해당 TABLESPACE내에서 연속된 영역의 ORACLE block 할당할 수 있도록 데이타 화일을 추가
2.TABLE의 STORAGE PARAMETER에서 INITIAL EXTENT, NEXT EXTENT의 크기를 조정하여 TABLE을
재구축
3.다음의 방법으로는 관련 TABLESPACE를 재구성하는 것
-----
현상 : ORA-1552 (CANNOT USE SYSTEM ROLLBACK SEGMENT FOR NON-SYSTEM TABLESPACE '%S')
원인 : SYSTEM TABLESPACE 이외의 TABLESPACE를 포함한 OPERATION을 위하여 SYSTEM TABLESPACE의
ROLLBACK SEGMENT를 사용할 경우에 발생
조치 : SYSTEM TABLESPACE에 하나 이상의 ROLLBACK SEGMENT를 추가한 다음, 데이타베이스 오브젝트를
생성
-----
현상 : ORA-1555 Snapshot Too Old
원인 : 1.데이타의 변경이 심한 데이타베이스에서 롤백 세그먼트의 갯수와 크기가 작을 경우에 발생
2.롤백 세그먼트가 손상되어 읽을 수 없게 된 경우
3.Fetch Across Commit(테이블에 대하여 Query가 커서를 열고 루프 내에서 데이타를 Fetch
하고 변경하고 커밋하는 과정에서 발생)
4.Delayed Block Clean Out(데이타 블럭이 변경되고 커밋되면 오라클은 롤백세그먼트 헤더에
그 트랜잭션이 커밋되었다고 기록하지만 데이타 블럭을 바로 변경하지는 않는다 (Fast
Commit). 그리고 다음 트랜잭션이 변경된 블럭을 요구할 때야 비로소 변경 시키는것
조치 : 1.커서가 Open된 상태에서는 커밋을 자주하지 않고 롤백 세그먼트 크기를 키워 나가도록
2.커서를 사용하기 전에 Full Table Scan을 해주면 예방이 가능
-----
현상 : ORA-1562(Failed to extend rollback segment(id = %s))
원인 : 1.사용중인 ACTIVE 상태의 ROLLBACK SEGMENT가 다음 EXTENT를 할당하고자 할 경우
2.해당 ROLLBACK SEGMENT에 대하여 발생 가능한 최대 EXTENT 수를 초과할때 발생
조치 : ROLLBACK SEGMENT의 재생성
-----
현상 : ORA-01578: ORACLE data block corrupted (file # 6, block # 3)
ORA-01110: data file 6: '/tmp/ts_corrupt.dbf'
원인 :
조치 : 해당 objects를 drop하고 recreate하여 처리
-----
현상 : ORA-01578
원인 : data block 에 corruption 이 생긴 경우에 발생.
조치 : 1.최선의 해결책은 backup 받아둔 file 을 restore 한 후 recover 작업을 하는 것이다.
2.backup datafile 을 restore 하고 recover 하지 않을 것이라면 우선, 어떤 object 에서 corruption 이 발생하였는지 확인해야 한다.
3.해당 segment 가 non-data dictionary index 라면, 해당 index 를 drop 한 후 재생성한다.
4.해당 segment 가 table 이라면, corruption 이 발생한 block 의 data 는 소실된 것이다.
5.만약 해당 table 에 대한 최근의 export dump file 이 존재한다면, 해당 table 을 drop 한 후 import 함으로써 복구할 수 있다.
6.corruption 이 발생한 non-clustered table 에서 corrupted block 을
access 하지 않고 나머지 data 들을 select 할 수 있도록 ROWID 를 이용할
수 있다.
7.만약 data dictionary 에 속하는 table, index 또는 rollback segment에
corrupted block 이 발생하였다면 Oracle Support 의 지원을 받는다.
8.일반적으로, ORA-1578 은 hardware 의 문제때문에 유발된다. 하지만 만약에
ORA-600[3374] 가 발생한다면 memory 상에서 corruption 이 발생한
경우이다. 이 경우 database 를 restartup 하면 문제가 해결될 수 있다.
-----
현상 : ORA-1591(Pending Transaction의 처리)
원인 : 분산 트랜잭션의 경우 2 phase commit수행 단계중에 fail이 발생하게 되면 관여된 일부 database에서는 rollback 혹은 commit이 되고, 일부는 distributed lock이 걸린 상태로 계속 지속될 수 있다.
이렇게 pending된 transaction에 대해서는 기본적으로 Oracle의 background process인 RECO process가 자동으로 정리하여 주나, 경우에 따라 자동으로 정리가 되지 못하는 상황이 발생
조치 : STEP 1: alert.log file을 check한다.
STEP 2: network 환경을 확인한다.
STEP 3: RECO process가 떠 있는지 확인한다.
STEP 4: DBA_2PC_PENDING을 조회해 본다.
STEP 5: DBA_2PC_NEIGHBORS view를 조회해 본다.
STEP 6: commit point site를 확인한다.
STEP 7: DBA_2PC_PENDING의 MIXED column을 확인한다.
STEP 8: DBA_2PC_PENDING의 STATE column의 값을 확인한다.
STEP 9: 불일치 사항을 파악하고 DBA_2PC_PENDING을 정리한다.

2PC에서 1st phase commit(xa_prepare)이 정상적으로 종료되면 Oracle의 dba_pending_transaction에 해당
Transaction에 대한 정보가 나타난다.

formatid 40
globalid 636861656A750000000000000000000000000000000000
5B5103A6BEC9900000DE8
branchid 0000006600000065

이 상태에서 일정한 시간 내에 2nd phase commit(xa_commit)에 끝나지 않으면 dba_2pc_pending에도 이
Transaction이 나타난다.

local_tran_id 4.24.3026
global_tran_id 40.636861656A750000000000000000000000000000000000
5B5103A6BEC9900000DE8
state prepared
mixed no
advice
tran_comment
fail_time
force_time
retry_time
os_user jun
os_termina
host chaeju
db_user
commit# 5332231

위에서 "일정한 시간"이란 용어를 사용했는데 Oracle의 문서에는 이에 관한 정확한 언급은 없다.
다만, 다른 Transaction에서 해당 레코드를 참조하려고 할 때 이미 lock이 걸려 있으므로 대기하는
시간에 대해서는 init.ora에서 지정하는 distributed_lock_timeout에 대해서만 언급하고 있다. 그런데
oracle 8.1.7에서는 distributed_lock_timeout을 설정하면 obsolete로 나온다.

이 시간 동안에 해당 레코드에 대한 lock이 풀리지 않으면 아래와 같은 에러를 만난다.

ORA-02049: time-out: distributed transaction waiting for lock

위의 에러가 발생한 이후에 이 레코드를 참조하려고 하면 1591 에러가 나타난다.

ORA-01591: lock held by in-doubt distributed transaction '4.24.3026'

보는 것처럼 ORA-01591 에러 메시지에는 local_tran_id가 있다. 이를 이용하여 dba_2pc_pending에서
global_tran_id를 조회하고, 이 데이터는 dba_pending_transaction의 formatid와 globalid로 이루어져
있으므로 이를 이용하여 dba_pending_transaction에서 branchid도 얻을 수 있다.

이들로 부타 아래와 같이 XID를 얻을 수 있다.

xid.formatid = dba_pending_transactions.formatid
xid.gtrid_length = len(dba_pending_transactions.globalid)
xid.bqual_length = len(dba_pending_transactions.branchid)
xid.data = dba_pending_transactions.globalid + dba_pending_transactions.branchid

여기까지는 Oracle로 부터 XID를 얻는 과정이다.

tpconvert(str, (char *)&xid, TPTOSTRING | TPCONVXID)를 이용하여 XID의 string 표현을 얻을 수 있고
이값을 이용하여 .TMIB 서비스를 호출하면 아래와 같은 정보를 얻을 수 있다.

TA_ERROR 0
TA_MORE 0
TA_OCCURS 1
TA_GRPCOUNT 2
TA_GRPINDEX 0
TA_GRPNO 102
TA_GRPNO 101
TA_TIMEOUT 9
TA_COORDGRPNO 102
TA_CLASS T_TRANSACTION
TA_STATE READY
TA_COORDLMID SITE1
TA_GSTATE READY
TA_GSTATE READY
TA_TPTRANID 0x0 0x3a6bec99 0xde8 0x28 0x0 0x0
TA_XID 0x0 0x3a6bec99 0xde8 0x28 0x66
TA_COORDSRVGRP APPGRP2
TA_LMID SITE1
TA_SRVGRP APPGRP2
TA_SRVGRP APPGRP1

위의 경우에는 아직 Tuxedo가 transaction에 대한 정보를 가지고 있기 때문에 별다른 조치가 필요없다.
하지만, Oracle의 dba_2pc_pending에는 있는데 Tuxedo에서 해당 Transaction에 대한 정보를 가지고
있지 않은 경우에는 Oracle에서 rollback force나 commit force를 이용하여 pending transaction을
정리해 주어야만 lock이 풀린다.
-----
현상 : ORA-1628, 00000, "max # extents (%s) reached for rollback segment %s"
ORA-1630, 00000, "max # extents (%s) reached in temp segment in tablespace %s"
ORA-1631, 00000, "max # extents (%s) reached in table %s.%s"
ORA-1632, 00000, "max # extents (%s) reached in index %s.%s"
원인 : 오브젝트의 익스텐트가 MAX # 에 도달 했기 때문에 발생되며 오브젝트의 MAXEXTENTS는
STORAGE 의 MAXEXTENTS 파라미터에 의해 결정
조치 : ALTER TABLE .. STORAGE (MAXEXTENTS n)를 사용하여 최대 MAXEXTENTS 값보다 작은 수로
MAXEXTENTS를 늘려준다.
-----
현상 : ORA-1652, 00000, "unable to extend temp segment by 6144 in tablespace "VESSEL"
원인 : 테이블이나 인덱스 등을 만들 때 자신의 TEMP TABLESPACE 가 아닌 곳에서 ORA-1652(temp
tablespace가 부족함) 에러가 발생
조치 : 에러메시지에서 보여주는 대로 해당 테이블스페이스에 Temporary Segment 가 생성될 만한
연속된 공간을 마련하여 주는 것
-----
현상 : ORA-1653
원인 : 특정 tablespace 에 space 가 부족해서 table의 extent가 일어나지 못해서 발생
조치 : user의 default tablespace 를 변환한 후, 이 default tablespace
안에 create table을 다시 한 후 sql*loader 를 실행한다
-----
현상 : ORA-1654 ERROR ON INDEX SEGMENT
원인 : tablespace가 적어 extent 영역을 할당할 수 없어서 발생
조치 : datafile을 추가 시 이전값 이상의 사이즈를 추가해야 함.
-----
현상 : ORA-1722 invalid number
원인 : 수치값이 불법일 경우
-----
현상 : ORA-1747 열명을 올바르게 지정해 주십시요.
원인 : 열명이 다른 경우(SQL문장 기술시 첫번째 열명 앞에 Comma를 삽입한 경우)
-----
현상 : tb_ra315 insert error ORA-02291: integrity constraint (SCRJAPPR.A315_E007_FK)
violated - parent ....
원인 : Table과 관련된 Reference 관계로 parent table의 data가 없는 관계로 data 입력불가
조치 : Reference 관계를 끈어주든지 아니면 관계된 Table에 Data를 모두 입력하는 방법.
-----
현상 : ORA-02303: cannot drop or replace a type with type or table dependents
원인 : Type이나 table의 dependency가 있는 type을 drop하거나 replace하고자 할 때 발생.
조치 : SQL Reference guide에 의하면 DROP TYPE FORCE 옵션은 recommend하지 않는다.
왜냐하면 이 옵션을 쓰게 되면 복구가 불가능하고 dependency가 있던 table들은
access하지 못하는 결과를 초래한다.
-----
현상 : ORA-03113: end-of-file on communication channel
원인 : 1.이전에 작동했던 해당 instance의 shared memory segment들이 아직 system에 남아있어서 발생.
2.서버의 Oracle 쉐도 프로세스가 예기치 않게 종료된 경우 발생.
3.SQL*NET 드라이버가 Unix의 ORACLE 실행 파일과 연결되지 않아 발생한 경우.
4.서버쪽의 기계 손상이나 네트워크 고장인 경우.
5.네트워크에서 두 서버가 같은 노드 이름을 가질 때에도 이 오류가 발생.
6.모든 원인은 결국 클라이언트가 서버로부터 어떤 정보를 읽으러 갔다가 거기서 더 이상 연결이 없음을 발견했다는 뜻임.
7.Oracle XA를 사용하는 AP 서버 혹은 TMS 서버가 떠 있는 상황에서 연결된 DB를 재기동 시키거나 혹은 다른 문제로 인해서 데이터베이스와의 연결이 끊어진 경우에 발생
조치 : shared memory를 check하여 oracle이 소유하고 있는 shared memory segment를 삭제하여 문제를 해결.
자동으로 재접속을 하기 위해서는 TUXWA4ORACLE(WorkAround For Oracle) 환경변수를 1로 설정하면 해당 서버가 오라클에 접근하여 3113 에러가 발생하는 순간에 재접속이 이루어진다.
(XA 서버에만 해당되며 Non-XA 서버의 경우는 사용자 coding에 의해서 동일한 기능을 구현할 수 있다.)
-----
현상 : ORA-3114 Error( not connected to ORACLE )가 발생
원인 : ORACLE이 Shutdown 되었다.
조치 : ORACLE이 떠 있는지 확인하고, Server를 새로 기동한다.
-----
현상 : ORA-3121
원인 : SQL*NET V2를 통해 연결하려 할 때 연결 스트링에 'tns:'net접두어를 사용하지 않은 경우
조치 : 구버전인 SQL*NET V1의 net 접두어 (SQL*Net TCP/IP에 대한 "t:"등)를 사용하지 않도록 주의
하십시요.
-----
현상 : ORA-4068 existing state of packages%s%s%s has been discarded
원인 : 응용프로그램 실행 중에 사용하고 있는 Stored Procedure를 Compile하는 경우에 발생
조치 : 응용프로그램을 재기동시킨다.
-----
현상 : ORA-4091 table name is mutating, trigger/function may not see it
원인 : DataBase Trigger가 Transaction 내에서 변경된 테이블에 대하여 Query를 기동할 때 발생
조치 : 1.PL/SQL table을 생성한다.
2.BEFORE STATEMENT trigger를 생성한다.
3.AFTER ROW trigger를 생성한다.
4.AFTER STATEMENT trigger를 생성한다.
5.data insert 및 확인
-----
현상 : ORA-4092 cannot COMMIT or ROLLBACK in a trigger
원인 : 1.Trigger가 COMMIT or ROLLBACK을 실행하고자 할 때 발생
2.Trigger가 내장 프로시저, COMMIT나 ROLLBACK될 함수, 패캐지 서브프로그램을 호출한 경우
-----
현상 : ORA-6106,ORA-6120 NETTCP : socket creation failure
원인 : WIN V1.X용 SQL*NET TCP/IP는 SQLTCP.DLL과 SQLTCP1.DLL들은 ORACLE용 연결 스트링이 TCP/IP
프로토콜 스트링으로 변환되면 OCI DLL에 의해 작업 진행중에 올려집니다. ORACLE INTERFACE
DLL은 SQLTCP.DLL을 먼저 올리려고 합니다. 이것이 실패하면 DOS TSR 버전의 드라이버를
찾습니다. 두 가지 모두 실패하면 ORA-3121 메세지가 나옵니다.
-----
현상 : ORA-6108
원인 : 1.부적절한 machine, 또는 machine는 맞지만 틀린 포트를 지정할 때 발생
2.TCP/IP 레이어는 모든 연결 요구를 Listener의 소켓 큐에 넣을 수 없을 경우 발생
3.네트워크가 아주 혼잡하고 호스트에 도달하려는 중에 시간이 종료할 경우
조치 : 1.클라이언트에서 호스트 Machine에 대해 ping을 실행하십시요. 대부분의 PC TCP/IP업체는
"ping" 유틸리티를 제공합니다. 클라이언트 Machine에서 다음을 입력하십시요
ping <host IP address>
이 방법으로 잘 되지 않으면 아마도 호스트 machine이 down된 것입니다. IP 주소를 사용
하여 호스트에 대해 ping을 성공적으로 실행할 수 없으면, 서버의 호스트 이름을 사용하여
ping을 실행해 보십시요.
ping <hostname>
호스트 이름을 사용하여 ping을 실할 수 없으면 TCP/IP 구성을 점검하십시요. 호스트 이름
을 가지고 ping을 실행할 수 없으면, 연결 스트링에 호스트 이름을 사용하여 SQL*NET와
연결할 수 없습니다.
2.SQL*NET TCP/IP Listener가 해당 서버에서 실행중인지 점검하십시요. 서버의 UNIX프롬프트
에서 다음을 입력하면 됩니다.
ps -al|grep "orasrv"
이 때 최소한 한 행이 표시되어야 합니다. 그렇지 않으면 UNIX 프롬프트에서 "orasrv"
또는 "tcpctl start"를 입력하여 수화자를 띄우십시요. SYSADMIN 특권을 가지고 해당 기계
에 로그인해야 합니다.
3.서버쪽에서 루프백을 할 수 있는 지, 다시 말해서 PC 클라이언트에서 지정한 것과 같은
연결 스트링을 사용하여 서버의 툴을 연결할 수 있는지 점검하십시요. 예를 들면, 서버의
SQLPLUS 또는 SQLDBA를 호출하고 서버의 SQLPLUS 또는 SQLDBA 프롬프트에서 다음을 입력
하십시요.
CONNECT USERNAME/PASSWORD@t:<servername>/<portnum>:<sid>
4.루프백 성사되면 호스트 서버의 ORASRV 포트 번호를 확인하십시요. (대부분의 기계에서
SERVICE 파일은 /etc 디렉토리에 있습니다.) 또한 "tcpctl" 유틸리티를 사용하면 대부분의
UNIX 기계에서 ORACLE Listener를 시작하거나 멈출 수 있습니다. "tcpctl stop"로 Listener
를 종료하십시요. "tcpctl start"으로 다시 시작하십시요. 이때 시작 포트에 관한 정보가
표시됩니다.
5.이것이 성공하면 포트를 지정하지 말고 포트를 연결해 보십시요.
t:<servername>:<sid>
연결되지 않으면 클라이언트에서 SERVICE 파일을 정확하게 설정하 않았기 때문입니다.
a)WINDOWS\WIN.INI를 점검하여 [Oracle] 부분의 ORA_CONFIG 매개 변수가 어떤 구성 파일을
지시하고 는지 알아보십시요. 이폴트는 다음과 같습니다.
[Oracle]
ORA_CONFIG=C:\WINDOWS\ORACLE.INI
b)ORACLE.INI 파일을 보고 TCP_SERVICES_FILE 매개변수가 설정되었고 SERVICES 파일을 지시
하고 있는 지 확인하십시요.
c)SERVICES 파일을 보고 다음 항목이 있는 지 확인하십시요.
orasrv 1525/tcp oracle
6.또한 서버가 SQL*NET V2가 아니라 SQL*NET V1을 실행중인지 확인하십시요.
7.결 스트링의 재시도 매개변수를 증가시켜 보십시요. 재시도 횟수를 지정하는 구문은 다음과
같습니다.
t:host[/service]:SID[,buffer-size][:conn-retries]
conn-retries의 디폴트는 1입니다.
8.VAX에 연결할 경우에는 VAX config.ora 파일에 다음행이 있는지 확인하십시요.
SQLNET USERNAMEMAP*=*
이것은 VAX account가 없는 PC가 디폴트 사용자 account을 사용하여 연결 할 수 있게 해
줍니다.
-----
현상 : ORA-6110 "NETTCP: message send failure"
원인 : Windows 클라이언트의 TCP/IP사이에 버퍼 조정문제가 있을 때 발생
조치 : 1.버퍼 크기를 연결 스트링에 포함시켜 일정한 크기로 고정하는 것
t:<servername>:<sid>,<buffersize>
연결 스트링에 버퍼 크기를 포함시킨 후에도 여전히 ORA-6110이 발생하면 더 작은 값을
사용해 보십시요. WINDOWS용 SQL*NET TCP/IP의 기본 버퍼 크기는 4096입니다. 이것을
1024로 사용하면 대개 ORA-6110에러가 없어집니다.
2.서버쪽
1)서버에서 루프백을 수행할 수 있습니까? 다시 말해서 PC 클라이언트에서 지정한 것과
같은 연결 스트링을 사용하여 서버의 툴을 연결할 수 있습니까? 예를 들어 서버에서
SQLPLUS 또는 SQLDBA를 호출하고 에러가 없어집니다.
CONNECT USERNAME/PASSWORD@t:<servername><portnum>:<sid>
루프백을 실행하면 실제 문제를 더 잘 보여주는 다른 에러가 나타나는 수도 있습니다.
2)ORA-6110은 Oracle실행 파일에 사용 권한이 정확하게 설정 되어 있지 않으면 Unix 서버에
연결할 때도 발생할 수 있습니다. Oracle과 orasrv의 사용권한은 다음과 같이 설정되어야
합니다.
>chmod 6755 oracle
>chmod 6755 orasrv
이 때, Permission는 다음과 같이 설정됩니다.
-rwsr-xr-x 1 oracle dba ...size ...date oracle
-rwsr-xr-x 1 root dba ...size ...date oracle

3)ORA-6110과 틀린 네트워크 주소
TCP/IP 네트워크에서 중복 IP주소가 살아 있으면 ORA6110이 발생할 수 있습니다. 네트
워크의 모든 IP주소가 고유의 것인지 확인하십시요.
-----
현상 : ORA-6122 "NETTCP: setup failure
원인 : SQL*NET 구성이 적절하게 설정되지 않은 상태에서 WINDOWS용 SQL*NET TCP/IP를 가지고 연결
하려 할 때 발생
조치 : 1.WINDOWS\WIN.INI를 조사해 보십시요. ORA_CONFIG 매개 변수를 정의하는 ORACLE 부분이
있어야 합니다
[Oracle]
ORA_CONFIG=C:\WINDOWS\ORACLE.INI
2.ORACLE.INI(또는 ORA_CONFIG 매개변수가 지시하는 파일)을 보십시요. ORACLE_HOME이
WINDOWS용 SQL*NET TCP/IP와 다른 Oracle Windows 응용 프로그램이 설 된 디렉토리를
지시하는 지 확인하십시요. 디폴트는 다음과 같습니다.
ORACLE_HOME=\ORAWIN
3.또한 ORACLE.INI에 TCP_VENDOR를 정확하게 설정했는지도 확인하십시요.
4.경로에 C:\ORAWIN\BIN(또한 ORACLE_HOME을 설정한 BIN 디렉토리)이 있는지 확인하십시요.
DOS프롬프트에서 SET을 입력하고 <return>을 누르면 됩니다. 이명령은 경로를 보여줍니다.
5.ORAWIN\BIN 디렉토리에 SQLTCP.DLL과 SQLTCP1.DLL이 모두 있는지 확인하십시요.
6.경로의 다른 어떤 디렉토리에도 SQLTCP.DLL이 없는 것을 확인하십시요.
7.ORAWIN\BIN 디렉토리와 경로의 다른 디렉토리에 MSOCKLIB.DLL이 있는 지 확인하십시요.
또한 파일의 두 복사본을 가지고 있지 않도록 하십시요. 복사본이 둘일 경우, 이전 복사본
의 이름을 바 면 문제가 줄어들 수 있습니다.
8.WINDOWS 디렉토리에 VSL.INI 파일이 있는지 확인하십시요. 만약 없으면 ORACLE INSTALLER
를 통해 SQL*NET를 다시 입력하십시요.
-----
현상 : ORA-6136, 00000, "NETTCP: error during connection handshake"
원인 : 1.Client and Server 환경에서 간혹 SQL*NET으로 Server에 접속하려고 할 경우
2.Unix Server에서 $tcpctl stop 으로 orasrv의 Process를 정지시키려고 해도 아무런 반응
없이 Holding되는 경우가 발생
조치 : 1.TCPCTL Utility를 이용하여 다음의 Option을 부여하여 Start하는 방법.
$tcpctl start listen=30 timeout=30 forkon listen=<queue size>이며, 청취자 열의
크기를 지정.
timeout=<seconds>이며, 지정된 시간에 orasrv와의 응답 확인 시간을 나타냄.
forkon SQL*net이 orasrv process에 접근하는 방법을 나타냄.
System에 따라서 forkon option이 적용 않되는 경우도 있음.
2.Client에서 접속을 하여 사용 다가 비정상 종료(Session이 맺어진 상태에서 Client의
Power Off)를 하여 Server에 Processor가 남아 있고, orasrv를 통해 접속할 수 있는
Session의 수가 점점 줄어들 경우가 있는 데 이러한 경우에는 orasrv를(tcpctl stop or
UNIX kill command를 이용)강제로 종료 시고 다음과 같이 Start 시켜 주십시오.

#nohup tcpctl start ( Client의 비정상 종료가 Orasrv에는 영향을 미치지 않음)
또는
#orasrv (ORACLE_HOME\bin directory에서 직접 orasrv processor를 띄운다)
-----
현상 : ORA-06502 : PL/SQL : 값(수치) 오류입니다.
원인 : DB Column과 Host variableㅇ의 길이가 맞지 않은 경우.
조치 : DB Column과 Host variableㅇ의 길이를 확인하고 길이를 동일하게 한다.
-----
현상 : ORA-06533: Subscript beyond count
원인 : VARRAY는 default 로 3개의 element 이상을 가져 올수 없기 때문.
조치 : EXTEND method를 이용하여 해결할 수 있다.
-----
현상 : ORA-06571
원인 : SQL문 안에서 Stored function을 call하여 사용하는 경우 발생.
조치 : 기본적으로 stored function이나 procedure, package에서의
DML 문장의 사용은 보장이 되는 기능이나, sql list에서의 stored function의
사용은 몇 가지 제약 조건을 가지고 수행이 가능합니다.
-----
현상 : ORA-1119: error in creating database file
ORA-7515: sfccf UIC GROUP <= MAXSYSGROUP - file operations not allowed
원인 : VMS에서만 발생하는 에러로 DATAFILE을 생성하려는 Directory의 Owner가 DBA user가 아닐때 발생.
조치 : Datafile을 생성하려는 Directory의 Owner를 Oracle DBA user로 변경시켜 주어야 한다.
-----
현상 : ORA-9241, ORA-9301
원인 : 개발툴이 해당 툴 또는 SQL*NET에 필요한 메세지 화일을 찾을 수 없을 때 발생
조치 : ORACLE.INI 파일에 LOCAL = <V2 service name>을 추가한다. 만일 ORACLE.INI 파일에 LOCAL
파라미터를 추가한 후에도 계속 ora-9301 에러가 계속 발생한다면 autoexec.bat 파일에 SET
CONFIG = <PATH> \ORACLE.INI를 추가한다.
[주의 1]CONFIG가 ORACLE.INI를 지시하도록 설정하면 나중에 다시 설치할 문제가 발생할 수
있다. 그럴 때는 AUTOEXEC.BAT 에서 SET CONFIG 행을 삭제하고 다시 Booting 한후
설치를 시작한다.
[주의 2]MS ACCESS를 이용하여 ORACLE의 데이타를 질의할 경우는 환경변수를 다음과 같이
설정한다.
SET CONFIG_FILES = <path> \ORACLE.INI
[주의 3]SET 다음의 CONFIG 나 CONFIG_FILES 은 반드시 대문자 이어야 한다.
-----
현상 : ORA-9352
원인 : nt 에서 service 의 problem 발생.
조치 : 1.background services and processes 를 띄우기
dos>oradim80 -startup -sid SID -starttype srvc,inst -usrpwd password -pfile filename
2.여러 개의 instance 를 띄우고자 하는 경우
- ORACLE_SID 를 setting 한다.
c:\> set oracle_sid =sid
- server manager 실행
c:\>svrmgr30
svrmgr>connect internal/passwd
-----
현상 : ORA-12004/ORA-12034
원인 : master table의 snapshot log가 있는 table에 대해서, snapshot이 추가로
생성되고 나면 snapshot을 생성하기 시작한 시간과, 기존의 snapshot이 log를
refresh해간 시간을 비교하여 새로운 snapshot 생성시작 시간이 더 빠르면
ora-12004가 발생
조치 : 생성하고자 하는 snapshot에 대한 master table의 다른 snapshot들을 refresh하지 못하도록 하거나, refresh하지 않는 시간에 새로운 snapshot을 생성하여야 한다.
refresh 못하도록 막는 방법으로는 일시적으로 snapshot job을 broken시킨 후 snapshot이 생성된 후 다시 broken을 false로 하면 된다.
-----
현상 : ORA-12154
원인 : tnsnames.ora 파일의 Alias처럼 정의된 Connect String으로 사용하는 db_alias를 찾지 못할 경우 발생
-----
현상 : TNS-12203 "TNS:unable to connect to destination"
원인 : 1.WINDOWS용 TCP/IP 어댑터를 설치하지 않은 상태에서 연결하려 할
2.TNS-12203 에러는 WINDOWS용 ORACLE SQL*NET소프트웨어가 ORACLE 홈 디 렉토리를 찾을 수
없다는 의미일 수 있습니다.
3.TNSNAMES.ORA가 ORACLE 홈 디렉토리 아래의 NETWORK\ADMIN에 있는지 확인하십시요.
4.서버쪽에서 실행중인 SQL*NET V2 TCP/IP Listener가 없어도 TNS-12203이 발생
5.연결할 SERVICES 이름에 대해 CONNECT DESCRIPTOR에 정확한 ADDRESS 매개변수를 지정했는지
확인하십시요.
6.JSB VSL 소켓이 초기화되지 않으면 TNS-12203 이 발생할 수 있습니다.
7.TNS-12203에 이어 실제 문제가 무엇인지 더 자세하게 나타내 주는 또 다른 에러가 발생할 수
있습니다.
조치 : 1.SQL*NET TCP/IP V2는 SQL*NET V2와 V2 TCP/IP 어댑터 등 두가지 제품으로 구성됩니다.
이들은 별도의 두 키트로 되어 있는데, 반드시 두 키트를 모두 설치해야 합니다.
2.WIN.INI파일의 ORACLE 부분에 다음 항목이 있는지 확인하십시요.
[ORACLE]
ORA_CONFIG=C:\WINDOWS\ORACLE.INI
WINDOWS디렉토리가 C:\WINDOWS가 아니면, 위 행의 C:\WINDOWS 부분을 그 이름으로 바꾸십시요
그런 다음, ORACLE 소프트웨어를 다시 설치하십시요. ORACLE.INI 파일이 있으면 ORACLE.INI
파일에 다음 행이 있는지 확인하십시요.
ORACLE_HOME=C:\ORAWIN
ORACLE 홈 디렉토리가 C:\ORAWIN이 아니면 위 행의 C:\ORAWIN 부분을 이름으로 바꾸십시요.
3.ORACLE 홈 디렉토리는 ORACLE.INI(또는 WIN.INI의 ORA_CONFIG매개변수가 지시하는 파일)의
ORACLE_HOME 에 의해 정의됩니다.
4.서버쪽에서 실행중인 SQL*NET V2가 있는지 확인하십시요. 서버쪽에서 Listener Control 유틸
리티(LSNRCTL)를 사용하면 서버의 V2 Listener가 실행중인지 확인할 수 있습니다. 서버에서
"LSNRCTL STATUS"명령을 실행하십시요. Listener Control이 유틸리티 대해서는 SQL*NET
Administrator's Guide를 참조하십시요.
5.정확한 ADDRESS 매개변수를 사용중인지 확인하는 방법은, WINDOWS 클라이언트에서 사용 할 것
과 같은 ADDRESS 매개 변수를 가진 TNSNAMES.ORA를 사용하여 서버에서 루프백을 해 보는 것
입니다. 루프백을 수행한다는 것은 데이타베이스와 같은 기계에서 SQL*DBA 등을 호출하고
연결 스트링을 지정함으로써 SQL*NET V2를 통해 연결한다는 뜻입니다.
6.문제를 해결하려면 다음 사항을 점검하여 JSB VSL 레이어가 정확하게 초기화되었는지 확인
하십시요.
1)ORACLE.INI 파일(또는 WIN.INI의 ORA_CONFIG 매개변수가 지시하는 파일)의 업체키 매개
변수 TCP_VENDOR가 정확하게 설정되었는 지 확인하십시요
2)ORACLE_HOME\BIN 디렉토리에 MSOCKLIB.DLL이 있는지 확인하십시요.
3)ORACLE_HOME\BIN 디렉토리에 선택된 JSB 업체 특유의 DLL이 있는지, 또는그 JSB 업체 특유
의 TSR 파일이 실행되는 지 확인하십시요.
4)WINDOWS 홈 디렉토리에 VSL.INI 파일이 있는 지 확인하십시요.
7.화면에서 다른 에러가 보이지 않으면 ORACLE_HOME\NETWORK\LOG 디렉토리의 SQLNET.LOG 파일을
점검하십시요.
-----
현상 : TNS-12533
원인 : TNSNAMES.ORA에서 기술자의 ADDRESS 부분에 프로토콜 CONNECT DESCRIPTOR의 매개 변수가 틀릴
때 발생
조치 :
-----
현상 : ORA-12541: TNS:no listener
원인 : listener가 떠 있지 않은 경우에 발생.
조치 :
-----
현상 : TNS-12545 "TNS:name lookup failure
원인 : TNSNAMES.ORA에서 기술자의 ADDRESS 부분에 프로토콜 CONNECT DESCRIPTOR의 매개 변수가 틀릴
때 발생TCP/IP 프로토콜 어댑터를 가진 SQL*NET V2를 통해 툴에서 연결하려는 데 TCP/IP
프로토콜 어댑터가 TNSNAMES.ORA 파일의 ADDRESS 부분에 제공된 호스트 이름을 분석할 수 없을
때 발생
-----
현상 : ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
원인 : OPENINFO의 DB에 접속하는 계정이 존재하지 않은 경우.
조치 : DB에 접속하는 계정을 확인하여 OPENINFO의 DB 접속계정을 재설정 해야됨.
1.$ORACLE_HOME/bin directory의 "oracle"과 "orasrv" (orasrv가 없는
경우에는 "tnslsnr"을 확인해 보아야 한다.)의 permission과 ownership
을 check.
2.file system이 no set uid로 mount되어 있는지 확인.
3.oracle user의 "umask"를 확인.
4.$ORACLE_HOME/bin 에 존재하는 실행모듈의 ownership 을 확인.
5.모든 oracle file이 dba group으로 되어 있는지 확인.
6.ORACLE_HOME의 path에 존재하는 모든 directory가 755 mask로 setting
되어 있는지 확인.
-----
현상 : 0509-036,0509-022,0509-026,ORA-12547
원인 : 1.Oracle 계정이 아닌 일반 계정으로 unix에 접속하여 svrmgrl을 수행 시 발생.
2.$ORACLE_HOME/bin/oracle 실행 화일에 대한 permission이 적당하지 않을 수 있고,
unix 계정의 .profile 또는 .login 화일에 ORA_NLS33 파라미터를 셋팅하지
않았기 때문에 발생
조치 : 1.$ORACLE_HOME/bin/oracle 화일의 sticky bit가 제대로 셋팅되었는지 확인.
2.ORA_NLS33 파라미터가 제대로 셋팅되어 있는지 확인.
user가 오라클 database에 login할 때, oracle 실행 프로그램을 사용하여
오라클 계정으로 shadow process를 생성한다.
-----
현상 : ORA-24777: use of non-migratable database link not allowed.
원인 : Remote database를 사용하는데 Oracle이 dedicator server로 설치된 경우 발생(DB-Link사용할 경우)
조치 : Remote database를 사용하여 transaction를 보장 받을려면 Oracle을 MTS mode로 설치되어야 한다.
-----
현상 : ORA-29701(OGMS관련 ORACLE ERROR)
원인 : 1.오라클에서 GMS에 접속할 수 없을 경우 발생한다.
2.lmon( GMS client )이 communication file의 위치를 찾지 못할 경우 발생한다.
3.기타 발생 원인은 GMS에 틀린 internal function(skgxn)이 사용되거나
GMS가 local request에 대한 서비스를 할 수 없거나 CM subsystem에 문제가 있을
경우 등
조치 : 1.Oracle이 startup 될 때, GMS가 실행되지 않고 있을 때 발생한다. 이와
같은 경우에는 'ogmsctl status' 명령을 상용하여 GMS가 startup되었는지 확인
하여야 한다.
2.기본적으로 사용하는 디렉토리인 /tmp/.ogms를 사용하지 않을 경우 GMS home이
지정되어야 한다. OGMS home directory를 별도로 지정하여 사용할 경우에는
init.ora 파라미터 파일에서 ogms_home 파라미터 값을 지정해 주어야 한다.
-----
현상 : ORA-29702 ERROR(OGMS관련 ORACLE ERROR)
원인 : 1.오라클에서 GMS에 접속할 수 없을 경우 발생한다.
2.lmon( GMS client )이 communication file의 위치를 찾지 못할 경우 발생한다.
3.기타 발생 원인은 GMS에 틀린 internal function(skgxn)이 사용되거나
GMS가 local request에 대한 서비스를 할 수 없거나 CM subsystem에 문제가 있을
경우 등
조치 : GMS 서비스에 예상치 못한 에러가 발생했을 경우 로그에 남게 된다. GMS가 실행
중인지를 확인해 보고, 내부 에러로 인해 GMS가 스스로 shutdown 되었다면
daemon file에 기록된 트레이스 정보를 살펴보아야 한다.
-----

>oerr ora n   --> 에러 발생시 다음 명령은 치면 오라클에서 자세한 설명을 해준다.(path가 잡혀있어야 함)


출처 : http://www.databaser.net/oracle/ora_error.txt

* DestinationDirs section *

01     SourceDrive:\pathname (the directory from which the INF file was installed)
10     Windows directory. ( =>  %windir% )
11     System directory. ( =>  %windir%\system32 ) cf.Win9x/Me => %windir%\system
12     Drivers directory. ( =>  %windir%\system32\drivers )
17     INF file directory.
18     Help directory.
20     Fonts directory.
21     Viewers directory.
23     Color directory (ICM) (not used for installing printer drivers)
24     Root directory of the system disk. ( ex =>  C:\ )
25     Shared directory.
30     Root directory of the boot disk. ( "ARC system partition".  dirid 24와 다를 수도 있다.)
50     System directory for NT-based operating systems. ( =>  %windir%\system )
51     Spool directory (not used for installing printer drivers – see Printer Dirids)
52     Spool drivers directory (not used for installing printer drivers)
53     User profile directory
54     Directory where ntldr.exe and osloader.exe are located (NT-based systems only) 
55     Print processors directory (not used for installing printer drivers)
-1     Absolute path 


* special shell folders. (dirid 16384 ~ 32767)

16406     All Users\Start Menu 
16407     All Users\Start Menu\Programs 
16408     All Users\Start Menu\Programs\Startup
16409     All Users\Desktop
16415     All Users\Favorites
16419     All Users\Application Data
16422     Program Files
16427     Program Files\Common
16429     All Users\Templates
16430     All Users\Documents

16437     All Users\Documents\My Music
16438     All Users\Documents\My Pictures
49000     %windir%\system32\dllcache

16384     User\Desktop   ( =  16385 , 16387 , 16388 , 16394 16396 16399 16413 16414 )
16386     User\Start Menu\Programs
16389     User\My Documents
16390     User\Favorites
16391     User\Start Menu\Programs\Startup
16392     User\Recents
16393     User\SendTo
16395     User\Start Menu
16397     User\My Documents\My Music
16398     User\My Documents\My Video
16410     User\Application Data
16411     User\PrintHood
16412     User\Local Settings\Application Data

<예문>
[DestinationDirs]
Add_File   = 12               ;  12  와  10,system32\drivers 는 같은 경로다.
Add_File   = 16422,Test    ;  => C:\Program Files\Test
%11%\aic78xx.sys        ; dirid 로 path 연결시에는 dirid 를 % 로 감싸준다.
; 해당 폴더가 존재하지 않으면 새로 생성된다.
; 공백이 포함된 폴더명은 Strings 섹션에 임의의 문자열로 지정후  %문자열%  형식으로 사용.

테이블 선언시 자동 증가를 원하는 필드에

IDENTITY( 시작값, 증가값 )

옵션을 주시면 됩니다.
그리고 insert시에는 자동 증가 필드를 제외한 다른 필드만 값을 설정할 수 있습니다.
* 테이블 생성 시가 아니라, 생성이후에 자동 증가를 적용하시려면 그 필드가 NOT NULL 정의된 정수형 필드만 가능합니다.

CREATE TABLE ex_table
(
  notice_num  INT NOT NULL IDENTITY(1,1),
  title             VARCHAR(100)
)


 * 문자열 검사를 할 때 ==과 Equals메서드 중 누가 더 빠를까요?..

* 저번에 본 봐와 같이 ==(IL : op_Equality)에는 12개의 메서드가 사용되지만

* Equals 매서드는 2 가지만 사용되더군요.

* 따라서 문자열 비교할 때는 Equals메서드를 사용해 비교하세요.


using System;


namespace EqualsVs__

{

  /// <summary>

   /// Class1에 대한 요약 설명입니다.

   /// </summary>

   class Class1

   {

       /// <summary>

       /// 해당 응용 프로그램의 주 진입점입니다.

       /// </summary>

       [STAThread]

       static void Main(string[] args)

       {

           string strCompared = "문자열";


           //IL_000c:  call       bool [mscorlib]System.String::op_Equality(string, string)

           //사용 메서드 수 : 12개

           //시간 : 7453.4

           if (strCompared == "문자열")

               Console.WriteLine("True");


           // IL_0023:  callvirt   instance bool [mscorlib]System.String::Equals(string)

           //사용 메서드 수 : 2개

           //시간 : 37.9

          if (strCompared.Equals("문자열"))

               Console.WriteLine("True");

       }

   }

}

덧붙여서.. int,double... 의 실수와 연관있는형은 ==가 훨빠릅니다. 단 스트링비교는 반드시 equal 로 하시는 습관을 들이십시요. 얼마안된다 안된다 생각하실수도 있겠지만.. 저거 하나가 여러게 모이면 확연히 표가 납니다...

- 출처 :  KNUG (한국 닷넷 사용자 모임; Korea .NET User Group)
- 출처 2 : http://cafe.daum.net/aspdotnet

* 문자열이 있는지 검사할 때 흔히 if (문자열개체 != "")나
* if (문자열개체 != Stirng.Empty)를  쓰는데 이럴 경우 불필요한 오버헤드가 생기지만,
* Length 속성은 개체가 생성될때 설정되므로
* if (문자열개체.Length != 0 )로 해서 값만 비교해서 보다 빠르게 검사할 수 있습니다.

using System;

namespace StringEmptyVSStringLength
{
  /// <summary>
   /// Class1에 대한 요약 설명입니다.
   /// </summary>
   class Class1
   {
       /// <summary>
       /// 해당 응용 프로그램의 주 진입점입니다.
       /// </summary>
       [STAThread]
       static void Main(string[] args)
       {
          string notEmptyString = "값이 있는 문자열";

           // IL_000c:  call       bool [mscorlib]System.String::op_Inequality(string, string)
          if (notEmptyString != String.Empty)
           {
           }

          //IL_0014:  callvirt   instance int32 [mscorlib]System.String::get_Length()
           if (notEmptyString.Length != 0)
           {
           }
       }
   }
}

IL 코드로는 1가지 명령어지만

"if (notEmptyString != String.Empty)"에서는 12가지 내부 개체의 메서드를 사용해 비교하려는 양쪽의 문자열을 정렬하고 서로 일일히 비교하지만, i"f (notEmptyString.Length != 0)"에서는 단순이 변수에 값이 0이냐만 비교하기 때문에 속도가 빠를수 밖에 없죠.

실행해 시간을 검사하면 아래와 같은 차이를 보입니다. 단위는 (Microseconds)
             
742.4          if (notEmptyString != String.Empty)
0.7             if (notEmptyString.Length != 0)


- 출처 :   KNUG (한국 닷넷 사용자 모임; Korea .NET User Group)
- 출처 2 : http://cafe.daum.net/aspdotnet

스레드 사용

Greg Ewing
Clarity Consulting Inc.

요약: 기사에서는 스레딩의 다른 모델(단일, 아파트 자유) 모델의 사용에 대해 설명합니다. 스레드를 이용하는 응용 프로그램을 작성하는 도움을 있도록 스레드를 사용하는 C# 코드 샘플도 소개합니다. 또한 다중 스레딩 코드에 포함된 중요한 문제에 대해서도 설명합니다(9페이지/인쇄 페이지 기준).

목차

소개
스레딩에 대한 배경 지식
예제 응용 프로그램
다중 스레드 코드의 문제
결론

소개

다중 스레드 MSMQ(Microsoft Message Queuing) 트리거 응용 프로그램을 작성하는 일은 일반적으로 까다로운 작업이었습니다. 그러나 .NET Framework 스레딩 메시징 클래스의 도입으로 어느 때보다 쉬워졌습니다. 클래스를 사용하면 .NET Framework 대상으로 하는 모든 언어로 다중 스레드 응용 프로그램을 작성할 있습니다. 이전에 Microsoft Visual Basic 같은 도구는 스레딩에 대한 지원이 매우 제한되어 있었습니다. 따라서 C++ 사용하여 다중 스레드 코드를 작성하거나 Visual Basic에서 여러 프로세스나 ActiveX DLL 구성되는 이상적이지 않은 솔루션을 작성하거나 또는 다중 스레딩을 완전히 무시하는 밖에 없었습니다. .NET Framework에서는 어떤 언어를 사용하는지에 관계없이 풍부한 다중 스레드 응용 프로그램을 작성할 있습니다.

기사에서는 Microsoft 메시지 대기열의 메시지를 수신하고 처리하는 다중 스레드 응용 프로그램을 작성하는 프로세스를 단계적으로 소개하며, 특히 System.Threading System.Messaging이라는 가지 네임스페이스에 초점을 둡니다. 샘플 코드는 C#으로 작성되어 있지만 원하는 다른 언어로 쉽게 변환할 있습니다.

스레딩에 대한 배경 지식

Win32 환경에서 스레딩의 기본 모델은 단일, 아파트 자유 가지입니다.

단일 스레딩

처음에 작성한 응용 프로그램은 아마 응용 프로그램의 프로세스에 해당하는 스레드만 포함된 단일 스레드였을 것입니다. 프로세스는 해당 응용 프로그램의 메모리 공간을 차지하는 응용 프로그램의 인스턴스로 정의할 있습니다. 대부분의 Windows 응용 프로그램은 단일 스레드에서 모든 작업을 수행하는 단일 스레드 응용 프로그램입니다.

아파트 스레딩

아파트 스레딩은 단일 스레드보다 복잡한 스레딩 모델입니다. 아파트 스레딩으로 표시된 코드는 자체의 아파트로 제한된 고유 스레드에서 실행될 있습니다. 스레드는 처리 시간 동안 일어날 프로세스에서 소유하는 엔터티로 정의할 있습니다. 아파트 스레딩 모델에서 모든 스레드는 기본 응용 프로그램의 메모리에서 각각의 하위 섹션 내에서만 작동합니다. 모델에서는 코드의 여러 인스턴스를 동시에 그리고 독립적으로 실행할 있습니다. 예를 들어 .NET 이전의 Visual Basic에서는 아파트 스레드 구성 요소와 응용 프로그램을 만드는 것으로 제한되어 있었습니다.

자유 스레딩

자유 스레딩은 가장 복잡한 스레딩 모델입니다. 자유 스레딩 모델에서는 동시에 여러 스레드가 같은 메서드와 구성 요소로 호출됩니다. 아파트 스레딩과 달리 자유 스레딩은 분리된 메모리 공간에 제한되지 않습니다. 예를 들어 응용 프로그램에서 매우 비슷하지만 독립적인 수학 계산을 대량으로 실행해야 하는 경우에 자유 스레드 개체를 사용할 있습니다. 경우 같은 코드 인스턴스를 사용하여 계산을 실행하는 여러 스레드를 만듭니다. Visual Basic 6.0 같은 언어에서는 이와 같은 작업이 거의 불가능하므로 자유 스레드 응용 프로그램을 작성한 경험이 있는 응용 프로그램 개발자는 아마 C++ 개발자뿐일 것입니다.

스레딩 모델 작업

스레딩 모델에 대한 개념의 이해를 돕는 예로 집에서 다른 집으로 이사하는 일을 있습니다. 단일 스레드 방법은 포장에서 상자 운반과 풀기까지의 모든 일을 직접하는 것이라고 있습니다. 아파트 스레딩 모델로 작업하는 경우는 절친한 친구 몇에게 도움을 청하는 것과 같습니다. 친구는 각기 다른 방에서 일하고 다른 방에서 일하는 사람을 도울 없습니다. 그들은 각자의 공간과 이삿짐을 맡습니다. 자유 스레드 방법을 선택하는 경우, 친구들에게 도움을 요청하는 것은 아파트 스레딩 모델과 동일하지만 친구들이 모두 어느 시간이나 어느 방에서든 함께 이삿짐을 꾸릴 있다는 점이 다릅니다. 비유에서 집은 모든 스레드가 작동하는 프로세스이고 친구는 코드의 인스턴스이며 이삿짐은 응용 프로그램의 리소스와 변수입니다.

위의 예에서는 모델의 장점과 단점을 보여 줍니다. 아파트 스레딩은 구성 요소의 여러 인스턴스가 작동하므로 단일 스레딩보다 빠릅니다. 자유 스레딩에서는 모든 일이 동시에 일어나고 모든 리소스가 공유되므로 어떤 경우에는 아파트 스레딩보다 빠르고 훨씬 효율적입니다. 그러나 여러 스레드에서 공유 리소스를 변경하는 경우 문제가 일어날 있습니다. 사람이 상자를 사용해 부엌 물건을 다음 다른 친구가 와서 같은 상자에 침실 물건을 포장하는 경우를 생각해 보십시오. 번째 친구는 상자에 '부엌'이라는 레이블을 붙였는데 친구가 위에 '침실'이라는 레이블을 붙입니다. 결국 짐을 때는 부엌 물건을 침실에서 풀게 것입니다.

예제 응용 프로그램

단계로 예제 응용 프로그램의 디자인을 검토합니다. 응용 프로그램에서는 여러 스레드를 만들고 스레드는 MSMQ 대기열의 메시지를 수신합니다. 예제에서는 기본 Form 클래스와 사용자 지정 MQListen 클래스의 가지 클래스를 사용합니다. Form 클래스는 사용자 인터페이스를 처리하는 것과 아울러 작업자 스레드를 만들고 관리하고 소멸시킵니다. MQListen 클래스에는 메시지 대기열 항목을 비롯해 작업자 스레드를 실행하는 필요한 모든 코드가 포함됩니다.

다중 스레드 코드의 문제

샘플 코드 작업을 완료했으므로, 이제 다중 스레드 응용 프로그램을 작성하는 필요한 도구를 가지게 되었습니다. 스레딩은 응용 프로그램의 성능과 확장성을 극적으로 개선할 있습니다. 이런 강력함과 더불어 스레딩의 위험에 대해서도 알고 있어야 합니다. 어떤 경우에는 스레드 사용으로 응용 프로그램에 해를 끼칠 있습니다. 스레드로 인해 작업이 다운되거나 예상치 못한 결과가 일어날 있으며 심지어 응용 프로그램이 응답을 중지할 수도 있습니다.

스레드가 여러 개인 경우 스레드 서로가 특정 지점에 도달하거나 종료할 때까지 대기하고 있지 않은지 확인합니다. 제대로 수행하지 않으면 스레드가 서로 대기하고 있으므로 아무 스레드도 종료되지 않는 교착 상태를 초래할 있습니다.

여러 스레드에서 쉽게 공유될 없는 리소스(: 플로피 디스크 드라이브, 직렬 포트 또는 적외선 포트) 액세스해야 하는 경우 스레드 사용을 방지하거나 synclock 또는 mutex 같은 고급 스레딩 도구를 사용하여 동시성을 관리할 있습니다. 스레드가 리소스 하나를 동시에 액세스하려 하면 스레드에서는 리소스를 얻을 없고 데이터 손상이 일어납니다.

스레딩의 다른 일반적인 문제는 경쟁 조건입니다. 스레드가 파일에 데이터를 쓰는 동안 다른 스레드에서 해당 파일을 읽고 있는 경우 어떤 스레드가 먼저 종료할지 없습니다. 문제는 스레드가 파일경쟁 조건이라고 합니다. 읽는 스레드가 쓰는 스레드보다 앞서는 경우 없는 결과가 반환됩니다.

스레드를 사용할 모든 스레드가 다른 스레드와 별도로 완전히 작업을 마칠 있을지 여부도 생각해 보아야 합니다. 데이터를 앞뒤로 전달해야 하는 경우 데이터가 비교적 간단해야 합니다. 복잡한 개체를 전달하는 경우 개체를 앞뒤로 이동하기 위해 막대한 마샬링 비용이 들어가기 시작합니다. 이에 따라 운영 체제에서 관리하는 오버헤드가 생기고 전체 성능이 떨어집니다.

다른 문제로는 코드를 다른 개발자에게 넘겨주는 따른 전환 비용이 있습니다. .NET으로 스레딩이 훨씬 쉬워졌지만 코드를 유지 관리하는 다음 개발자가 스레딩 작업을 하기 위해서는 스레딩에 대해 알고 있어야 합니다. 그러나 점은 스레드 사용을 피해야 이유라기 보다는 적절한 코드 주석을 제공해야 이유입니다.

이런 문제들로 인해 스레딩 자체를 사용하지 않는 보다는 응용 프로그램을 디자인하고 스레드를 사용할지 여부를 결정할 모든 문제들을 기억하고 있는 것이 좋습니다. 불행히도 백서에서는 이런 문제를 방지하기 위한 방법을 설명하지 않습니다. 스레드를 사용하기로 했으나 위에서 언급한 문제가 발생한 경우 synclock이나 mutex 검토하여 문제를 해결하거나 다른 솔루션을 찾아 보십시오.

결론

여기에 있는 내용으로 스레딩을 이용하는 응용그러나 이렇게 하는 동안 관련된 문제를 기억하십시오. 스레딩은 제대로 사용하면 응용 프로그램의 성능과 확장성을 단일 스레드 응용 프로그램에 비해 훨씬 개선할 있지만, 올바로 사용하지 못하는 경우 정반대의 결과를 가져올 있으며 응용 프로그램이 불안정하게 있습니다.

출처: http://blog.naver.com/ansysda?Redirect=Log&logNo=19257436

이럴 때 :  신규 파일의 등록시 같은 이름의 파일에 대해, 파일 이력을 남기기 위해 이름만 수정해서 같은 폴더 內 존재해야 한다.

FileNameEditer 메소드가 있는 걸로 알고 있지만.......잘 모르니까.....

File.Move( OrgFilePath, NewFilePath )를 사용
OrgFilePath   = 이동해야 할 파일의 경로와 파일명
NewFilePath  = OrgFilePath를 옮길 경로

( NewFilePath 같은 경로를 쓰고 파일 이름이 변경 된 값을 준다면!  )

+ Recent posts