반응형

#include <mysql/mysql.h>
#include <string.h>
#include <stdio.h>
#define DB_HOST "127.0.0.1"
#define DB_USER "root"
#define DB_PASS "1234"
#define DB_NAME "sungjuk"
#define CHOP(x) x[strlen(x)-1] = ' '
typedef struct {
                char name[10];
                int jumsu[3];
                float ave;
                int total;
} _sungjuk;
void input_data(_sungjuk *sungjuk);
int insert(MYSQL *, _sungjuk sungjuk);
int search(MYSQL *);
int print(MYSQL *);
int main(void)
{
    int         i, n;
    MYSQL       *connection=NULL, conn;
    MYSQL_RES   *sql_result;
    MYSQL_ROW   row;
    int         field;
    int         query_stat;
    mysql_init(&conn);
    connection = mysql_real_connect(&conn, DB_HOST, DB_USER, DB_PASS, DB_NAME, 3306, (char *)NULL, 0);
    if(connection == NULL){
        printf("connect error!\n");
        exit(1);
    }
_sungjuk sungjuk[5];
    printf("Enter the mode:\n");
    printf("1 : input mode\n");
    printf("2 : seaching mode\n");
    printf("3 : print all\n");
    scanf("%d", &n);
    switch(n)
    {
        case 1:
            for(i=0;i < 2;i++)
                input_data(&sungjuk[i]);
            for(i=0;i < 2;i++){
                printf("%p\n", connection);
                insert(connection, sungjuk[i]);
            }
            break;
        case 2:
            search(connection);
            break;
        case 3:
            print(connection);
            break;
        default :
            exit(1);
    }
    mysql_close(connection);
}




void
input_data(_sungjuk *sungjuk) { printf("input name\n"); scanf("%s", sungjuk->name); getchar(); printf("input KOREAN score\n"); scanf("%d", &sungjuk->jumsu[0]); printf("input ENGLISH score\n"); scanf("%d", &sungjuk->jumsu[1]); printf("input MATH score\n"); scanf("%d", &sungjuk->jumsu[2]);
         sungjuk->total = sungjuk->jumsu[0] + sungjuk->jumsu[1] + sungjuk->jumsu[2];
         sungjuk->ave = (float) sungjuk->total / 3.0;
}


int 
insert(MYSQL *con, _sungjuk sungjuk) { char buff[255]; sprintf(buff,
"insert into test values ('%s', '%d', '%d', '%d','%d','%f')",
sungjuk.name,
sungjuk.jumsu[0],
sungjuk.jumsu[1],
sungjuk.jumsu[2],
sungjuk.total,
sungjuk.ave); printf("%s : %p: %d\n", buff, con, mysql_query(con, buff)); } int
search(MYSQL *con) { int j; char buff2[255]; char name[20];
    MYSQL_RES *sql_result;
    MYSQL_ROW row;
    int field;
    printf("insert name : ");
    scanf("%s", name);
    sprintf(buff2, "select * from test where name = '%s'", name);
    mysql_query(con, buff2);
    sql_result = mysql_store_result(con);
    field = mysql_num_fields(sql_result);
    printf("%12s%12s%12s%12s%12s%12s","name","KREAN","ENGLISH","MATH","SUM","AVER");
    while((row=mysql_fetch_row(sql_result))){
        for(j=0; j<field; j++) printf("%12s",row[j]);
        printf("\n");
    }
}


int 
print(MYSQL *con) { int k; MYSQL_RES *sql_result; MYSQL_ROW row; int field;
        mysql_query(con, "select * from test");
        sql_result = mysql_store_result(con);
        field = mysql_num_fields(sql_result);
        printf("%12s%12s%12s%12s%12s%12s","name","KREAN","ENGLISH","MATH","SUM","AVER");
        while((row=mysql_fetch_row(sql_result))){
            for(k=0; k<field; k++)
                 printf("%12s", row[k]);
            printf("\n");
        }
}


/*by nuno*/
출처 : http://blog.naver.com/jujac?Redirect=Log&logNo=20035738613
반응형

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

MariaDB SHA2 512 방식으로 암호화 예제  (0) 2019.10.25
Mysql & MariaDB 튜닝 쉘  (0) 2019.08.14
MySQL 백업용 쉘스크립트입니다.  (0) 2010.01.18
무료 접속 툴 (Free Tool)  (0) 2009.03.06
mysql(latin1 -> euckr 변경)  (0) 2009.03.06
반응형

[keyword 부분 정리]

fields terminated by ',' -- ,(콤마)를 기준으로 구분

optionally enclosed by '"' and '"' -- " "가 있을때는 ,가 아닌 "" 부분을 하나의 필드로 인정함

trailling null cols         --  데이터 미존재시 널로 처리 

( 컬럼명1, 칼럼명2, ... 칼럼명 n)

 

컬럼명에 사용 할수 있는 형태

 

컬럼명 "함수(컬럼명)" 형태로 지정가능

 

1. 순차적으로 값 증가되어 입력하기(컬럼명 no)

no sequence(1,1) -- 1부터 1씩 증가하기

no sequence(5,2) -- 5부터 2씩 증가하기

no sequence(MAX,1) -- 현재 입력되어 있는것중 최대값에서 부터 1씩 증가하기

 

2. decode 사용예(컬럼명 bb)

bb "decode(:bb,'.000','99999.000',:bb)" -- .000일때 99999.000 으로 변환하고 .000이 아니면 본래 bb값을 입력

 

3. upper 사용예(대문자로 변환, 컬럼명 cc)

cc "upper(:cc)" -- cc의 값을 모두 대문자로 변환

 

4. 필드에 고정된 값을 넣기

tel "'011-123-1234'" -- 핸폰 번호를 모두 011-123-1234로 넣음(tel은 Varchar2 형)

ai  CONSTANT '100' -- 상수값 100 삽입 (ai는 number형)

ai integer external -- 외부데이터 파일로부터 값 삽입(ai는 number형)

inputdate sysdate -- sysdate값 입력(inputdate는 date형)

 

5.외부 데이터 파일의 위치에 따른 값 분할 저장

( a position(01:05) char,

  b position(06:10) char,

  c position(11:20) char)

외부데이터

12 4 67890 ab def hi

 2    67890 ab def hi

A         B          C

===== ======== ========

12 4    67890     ab def hi

 2       67890     ab def hi

 

6. null 필드  처리 방법들

 

( c char(10) nullif c=blanks) -- null로 입력

( c date "YY/MM/DD" nullif c=blanks) -- 날짜를 null 입력

( c integer external defaultif c=blanks) -- 정수값이null 입력

( c char "nvl(:c,'NULL')" ) -- null일때 NULL 문자 입력

 

7. 여러 파일 일기

LOAD DATA
  INFILE file1.dat
  INFILE file2.dat
  INFILE file3.dat
  APPEND
  INTO TABLE emp
  ( empno  POSITION(1:4)   INTEGER EXTERNAL,
    ename  POSITION(6:15)  CHAR,
    deptno POSITION(17:18) CHAR,
    mgr    POSITION(20:23) INTEGER EXTERNAL
  )

 

8. 필드값에 조건에 따라 테이블 지정하기

   LOAD DATA
INFILE *
INTO TABLE tab1 WHEN tab = 'tab1'
   ( tab  FILLER CHAR(4),
     col1 INTEGER
   )
INTO TABLE tab2 WHEN tab = 'tab2'
   ( tab  FILLER POSITION(1:4),
     col1 INTEGER
   )
BEGINDATA
tab1|1
tab1|2
tab2|2
tab3|3

 

8.1 값 이 널이 아닐때와 널일때 다르게 처리 하기

LOAD DATA
INFILE 'mydata.dat'
REPLACE
INTO TABLE emp
      WHEN empno != ' '
( empno  POSITION(1:4)   INTEGER EXTERNAL,
   ename  POSITION(6:15)  CHAR,
   deptno POSITION(17:18) CHAR,
   mgr    POSITION(20:23) INTEGER EXTERNAL
)
INTO TABLE proj
      WHEN projno != ' '
(  projno POSITION(25:27) INTEGER EXTERNAL,
    empno  POSITION(1:4)   INTEGER EXTERNAL
)

9. 외부데이터 첫번째 필드의 첫번째 값이 H나 T가 아니고

30에서37번째 위치한 값이 20031217이 아닌경우에 대한 처리

LOAD DATA
  INFILE  'mydata.dat' BADFILE  'mydata.bad' DISCARDFILE 'mydata.dis'
  APPEND
  INTO TABLE my_selective_table
  WHEN (01) <> 'H' and (01) <> 'T' and (30:37) = '20031217'
  (
     region              CONSTANT '31',
     service_key         POSITION(01:11)   INTEGER EXTERNAL,
     call_b_no           POSITION(12:29)   CHAR
  )
9.1 다른 예제

LOAD DATA
  INFILE  'mydata.dat' BADFILE  'mydata.bad' DISCARDFILE 'mydata.dis'
  APPEND
  INTO TABLE my_selective_table
  WHEN (01) <> 'H' and (01) <> 'T'
  (
     region              CONSTANT '31',
     service_key         POSITION(01:11)   INTEGER EXTERNAL,
     call_b_no           POSITION(12:29)   CHAR
  )
  INTO TABLE my_selective_table
  WHEN (30:37) = '20031217'
  (
     region              CONSTANT '31',
     service_key         POSITION(01:11)   INTEGER EXTERNAL,
     call_b_no           POSITION(12:29)   CHAR
  )

10 특정 필드를 SKIP 할때 사용하는 FILLER

LOAD DATA
TRUNCATE INTO TABLE T1
FIELDS TERMINATED BY ','
( field1,
  field2 FILLER,
  field3
)

 

11. 여러행을 하나의 레코드로 읽기

  • CONCATENATE - use when SQL*Loader should combine the same number of physical recordstogether to form one logical record.
  • CONTINUEIF - use if a condition indicates that multiple records should be treated as one. Eg. by having a '#' character in column 1.

     

    12 성능 향상 시키기

    DIRECT=TRUE -> RDBMS 처리에서 가장 효과적인 방법

    UNRECOVERABLE 옵션 끄기 (직접 데이터를 씀)

     

    13. 이미지,음악,문서등을 SQL LOADER로 읽기

    CREATE TABLE image_table (
           image_id   NUMBER(5),
           file_name  VARCHAR2(30),
           image_data BLOB);

    Control File:

    LOAD DATA
    INFILE *
    INTO TABLE image_table
    REPLACE
    FIELDS TERMINATED BY ','
    (
     image_id   INTEGER(5),
     file_name  CHAR(30),
     image_data LOBFILE (file_name) TERMINATED BY EOF
    )
    BEGINDATA
    001,image1.gif
    002,image2.jpg
    003,image3.jpg
    

     

    ===========================================================

     

    출처 : http://blog.naver.com/hirokorea/20020980191

     

    문법
          SQLLDR [keyword=] value  [ [keyword=] value ]...

     

    예제
          SQLLDR scott/tiger control='c:\xxx.ctl' log='xxx.log' direct=true

     

    키워드

      USERID
      오라클 사용자 이름과 암호를 지정 합니다.

      CONTROL
      콘트롤 파일 이름, SQL*Loader을 수행하기 위해서는 항상 지정해 주어야  합니다.

      LOG
      로그 파일 이름을 지정 합니다. (기본 이름은 controlfile.log)

      BAD
      거부된 레코드 모두를 저장하는 배드 파일 이름을 지정 합니다.

      DATA
      입력 데이터 파일 이름을 지정 합니다.

      DISCARD
      Load시 선택되지 않은 레코드가 저장되는 디스카드 파일(선택 사항)

      DISCARDMAX
      버림(discard)의 최대 허용 갯수를 지정 합니다.

      ERRORS
      허용하는 배드 레코드의 최대 수를 지정 합니다.

      DIRECT
      TRUE로 설정되면 SQL*Loader는 DIRECT PATH를 사용.
      반대의 경우는 기본 값인 CONVENTIONAL PATH를 사용 합니다.

      PARFILE
      추가 파라미터 파일을 지정 합니다.

      PARALLEL
      DIRECT 로드에서만 적합한 이 파라미터는 다중 병렬 DIRECT로드가
      수행되도록 지정 합니다.

      FILE
      병렬 DIRECT로드의 경우 임시 세그먼트가 생성될 파일을 지정 합니다.

    ① SAMPLE TABLE 생성
    -------------------------------------------------------------------------

    CREATE TABLE TMP(
        SEQ_NUM     VARCHAR2(10) ,
        UNIQ_KEY    CHAR(7) ,
        RECORD_NUM  NUMBER(7,0),
        ISS_TIME    DATE,
        IF_STTS     CHAR(2),
        MEMO        VARCHAR2(100)
    )
    /

     

    ② SAMPLE 시퀀스 생성
    -------------------------------------------------------------------------

    CREATE SEQUENCE TMP_SEQ
    INCREMENT BY 1
    START WITH 1
    MAXVALUE 10000000000000000
    NOMINVALUE
    CYCLE
    CACHE 20
    NOORDER
    /

     

    ③ SAMPLE 데이터 파일 생성
    -------------------------------------------------------------------------

    C:\S_DATAFILE.DAT
          120060123125959MEMO1
         2220060124125959MEMO2
        33320060125125959MEMO3

     

    ④ SAMPLE SQLLOADER CONTROLFILE 생성

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

    C:\S_DATAFILE.CTL
    Options (Rows = 1000)
    Load DATA
    INFILE     'C:\S_DATAFILE.DAT'
    BADFILE  'C:\S_DATAFILE.BAD'

    APPEND

        INTO TABLE TMP (
            --  SEQ_NUM컬럼의 최대값  +1을 대입
            SEQ_NUM            SEQUENCE(MAX,1) ,
            --  시퀀스 TMP_SEQ의 다음할당값 대입
            UNIQ_KEY            TMP_SEQ.NEXSVAL ,
            RECORD_NUM      POSITION( 1 : 7   ) DECIMAL EXTERNAL ,
            ISS_TIME             POSITION( 8 : 21 ) DATE "YYYY/MM/DD HH:MI:SS" ,
            IF_STTS               CONSTANT "00" ,
            MEMO                 POSITION( 22 : 116   ) CHAR
        )

     

    ⑤ SQLLOADER 실행

    -------------------------------------------------------------------------
    C:>sqlldr
    scott/tiger@XXXcontrol = C:\S_DATAFILE.CTL

     

     

     

    //-----------------------------------------------------------------------------

     

     

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

     

    sqlloader를 사용하기 위해서는 미리 테이블이 만들어져 있어야 함.

    sqlloader 화일 샘플

    #!/bin/csh
    if ( $#argv != 2) then
        echo "Usage: $0 <DataFile> <logFileName>"
        exit 1
    endif

    sqlldr userid=oracle/oracle control=tblmacs_tmpidrlog.ctl data=$1 log=$2.log commit_discontinued=true

    data는 raw데이타 들어갈 부분, log는 생략해도 무방..., commit으로 시작하는 부분도 생략가능

    실행방법

    sqlloader.sh "실제데이타 화일"
    ex) sqlloader.sh  SWBLS1_FWEBIDR1_ID0001_T20030603000109.DAT

    이런식으로 사용 가능(원격폴더 지정시)
    ## sqlloader.sh /bear02/macslog/20030401/SWBLS1_FWEBIDR1_ID0001_T20030401000110.DAT /bear01/brewlog/src/eshock/log/z0000

    control화일 샘플

    load data
    INFILE *
    append
    into table TBLMACS_TMPIDRLOG
    when RECORD_TYPE='R'
    (
            RECORD_TYPE position(01:01) char
           ,RECORD_SEQ  position(02:08) char
           ,SVC_TYPE    position(09:09) char
           ,CALL_NUM    position(10:20) char
           ,CHARGE_NUM  position(21:31) char
           ,CP_NO       position(32:36) char
           ,CONTENTS_NO position(37:38) char
           ,MENU_NO     position(39:40) char
           ,CALL_START  position(41:54) char
           ,DURATION    position(55:63) char
           ,PKT_CNT     position(64:72) char
           ,PHONE_TYPE  position(73:87) char
           ,BROWSER_VER position(88:102) char
    )

    position은 순서대로 1부터 1까지 자름, 그다음 2칸째부터 8칸 이후까지를 의미함.





    [ SQL*Loader 사용하기 ]
    작성일자 : 2001년 6월 11일
    작 성 자 : 조수환


    1. SQL*Loader를 이용해서 Data를 넣을 파일을 Excel에서 생성한다.
            - 파일을 *.csv로 저장을 한다.
              (SQL*Loader를 사용하기 위해서는 ,(콤마)가 필요하다)
            즉, 다음과 같은 데이타 포멧이면 된다.
                    10000,CEO,등록
                    10020,CEO CEO실,등록
                    150000,솔루션사업부문,등록
                    150010,솔루션사업부문 신프라팀,등록
                    150020,솔루션사업부문 기관영업팀,등록
                    150030,솔루션사업부문 사업지원팀,등록
                    150040,솔루션사업부문 CS팀,등록

    2. csv 파일에는 departcode, departname, gubun 의 형식을 데이타가 들어가 있다.

            Ex>        departcode,         departname,         gubun
                    ---------- ------------------------------
                       180040         경영전략부문         홍보팀
                       190000         재경부문
                       190010         재경부문         재경기획팀
                       190020         재경부문         재경팀
                       190030         재경부문         물류지원팀
                       200000         인재기획실


    3. Data를 넣을 테이블의 명세서는 다음과 같다.
            SQL> desc departinfo;
             이름       널?      유형
             ---------- -------- ------------
             ID         NOT NULL NUMBER
             DEPARTCODE              NUMBER(6)
             DEPARTNAME          VARCHAR2(40)
             CREATEDATE          DATE
             MODIFYDATE          DATE
             GUBUN               CHAR(4)
           

    4. 콘트롤 파일(abc.ctl) 을 하나 만들고, 다음과 같은 내용을 기록한다.

            LOAD DATA
            INFILE '부서코드.csv'                        -- 참조할 파일은 부서코드.csv
            replace                                        -- 테이블의 내용을 모두 삭제한 후에 입력
            INTO TABLE departinfo                        -- 데이타가 들어갈 테이블 명
            fields terminated by ','                -- ,(콤마)를 기준으로 구분한다.
            (
              id                sequence(1,1),                -- 1부터 1씩 증가시킨다.
              departcode        integer external,        -- 외부의 데이타를 가져온다.
              departname        char(40),                -- 문자열은 40
              createdate        sysdate,                -- Load를 할 때 sysdate값을 넣어준다.
              modifydate    sysdate,                -- Load를 할 때 sysdate값을 넣어준다.
              gubun        char(4)                                -- 문자열은 4
            )


    5. SQL*Loader를 실행시킨다.
            # sqldlr atomx/akstp@sysora control=abc.ctl log=0611.log
            - > 위와 같이 하면 부서코드.csv의 내용이 conrolfile의 정의와 함께
                테이블에 쭉 들어간다.



    <참조> 다른 컨트롤 파일의 내용

    1. 컨트롤 파일(bbb.ctl)의 내용
            LOAD DATA
            INFILE '사원인사.csv'
            replace
            INTO TABLE companyinfo
            fields terminated by ','
            (
              id                sequence(1,1),
              companycode        integer external,
              name                char(20),
              departcode        integer external,
              tel                char(4) nullif tel = blanks,        -- 만일 공백이면 NULL상태로 만든다.
              enteringdate        date ,
              createdate        sysdate,
              modifydate    sysdate,
              gubun        char(4)
            )


    2. sqlldr atomx/akstp@sysora control=bbb.ctl log=0611.log

    //-----------------------------------------------------------------------------------

     

     

     

    출처 : http://www.dbguide.net/dbqa/dbqa120001.jsp?mode=view&key=subject&search=Loader&divcateno=256&divcateno_=243&pg=1&idx=1

     

    SQL*Loader는 외부 화일의 데이타를 ORACLE 데이타베이스의 table에 넣기 위한 유틸리티입니다. SQL*Loader를 사용하려면 외부 데이타 화일과  컨트롤 화일이 필요합니다. 컨트롤 화일이라고 하는 것은 로드하는 데이타의  정보를 저장한 화일입니다.

    간단한 샘플 컨트롤 화일을 설명하겠습니다.

        load data                        제어 화일의 선두에는 반드시 이 말이 필요합니다.
        infile sample.dat              외부 화일을 지정합니다.
        replace                           테이블에 데이타 넣는 방법 지정
        into table TABLE_NAME   데이타를 로드하는 테이블을 지정
        fields terminated by ','     데이타 필드의 종결 문자 지정
        (a integer external,          테이블의 열, 외부 데이타 화일의 데이타 형을 지정
         b char)

        참고로 replace 외에 다음의 옵션이 가능합니다.

        replace                 테이블의 기존 행을 모두 삭제(delete)하고 insert
        append                 새로운 행을 기존의 데이타에 추가
        insert                   비어 있는 테이블에 넣을 때
        truncate                테이블의 기존 데이타를 모두 truncate 하고 insert

        SQL*Loader를 실행하면 아래의 화일이 작성됩니다.

        * 로드 작업 중 동작에 관한 통계 등을 포함한 로그 화일(확장자는 log)
        * 데이타 에러 때문에 로드가 안된 레코드를 저장한 화일(확장자는 bad)
        * 사용자의 선택 기준에 적합하지 않은 레코드를 저장한 화일(discard 화일)
          이것은 discardfile 옵션으로 별도로 지정해야 생성됩니다.

    실행 방법은 다음과 같습니다.

    $sqlldr scott/tiger control=sample.ctl data=sample.dat

    1.1 임의의 열에 변화없는 고정 문자열(값)을 입력한 경우

    테이블 구조

        create table cons_test
        (a number,
         b number,
         c number,
         d varchar(10))

    컨트롤 화일 (즉 이예에서 sample.ctl)

        load data
        infile cons.dat
        replace
        into table cons_test
        fields terminated by ','
        (a integer external,
         b integer external,
         c CONSTANT '100',
         d char)

    외부 데이타 화일 (즉, 이예에서 sample.dat)
        1,2,DATA
        2,4,DATA2

    검색결과
        SQL>select * from cons_test;

               A       B       C D
        ---------------------------------
               1       2     100 DATA
               2       4     100 DATA2

    주의사항 : 이 예에서 C열은 데이타 화일에 넣어서는 안 됩니다. COSNTANT는 그것으로 완결된 열 지정의 하나가 됩니다. integer external 데이타 형은 수치 데이타를 문자형식(ASCII CODE)로 나타낸 것입니다.


    1.2 로드한 때의 날짜를 데이타로 로드하고 싶은 경우

    테이블 구조
       create table sysdatetb
        (a number,
          b date,
          c varchar(10))

    컨트롤 화일
        load data
        infile sysdate2.dat
        replace
        into table sysdatetb
        fields terminated by ','
        (a integer external,
          b sysdate,
          c char(10))

    외부 데이타 화일
        111,STRINGS
        222,STRINGS2

    검색결과
    SQL>select * from sysdatetb;

            A B         C
    -----------------------------
          111 13-MAY-94 STRING
          222 13-MAY-94 STRING2

    주의사항 : 이 예에서는 B열은 데이타 화일에 넣어서는 안됩니다. SYSDATE는 그것으로 완결된 열 지정의 하나가 됩니다. 새로운 시스템 날짜매김은 컨벤셔널 패스에서는 실행 시에 삽입된 각각의 레코드 배열마다 또, 다이렉트 패스의 경우는 로드된 각각의 레코드의 블럭마다 사용됩니다.


    1.3 임의의 수치열에 연속 번호(sequence)를 붙이고 싶은 경우

    테이블 구조
        create table rectb
        (a varchar(10),
          b number,
          c varchar(10))

    컨트롤 화일
        load data
        infile rec.dat
        replace
        into table rectb
        fields terminated by ','
        (a char,
          b recnum,
          c char)

    외부 데이타 화일
       A,a
        B,b
       C,c

    검색결과
    SQL>select * from rectb;

       A       B C
        ---------------------
       A       1 a
       B       2 b
       C       3 c

    주의사항 : 이 예에서는 B 열은 데이타 화일에 넣어서는 안됩니다. RECNUM는 그것으로 완전한 열 지정의 하나가 됩니다. 연속번호는 1부터 차례대로 1씩 더해져서 번호가 매겨집니다. 가산된 번호를 둘씩 건너 뛰거나 하는 것은 불가능 합니다.


    1.4 임의의 수치열에 연속 번호(sequence)를 임의의 간격으로 붙이고 싶은 경우

    테이블 구조
        create table seqtb
        (a varchar(10),
          b number,
          c varchar(10))

    컨트롤 화일
        load data
        infile seq.dat
        replace
        into table seqtb
        fields terminated by ','
        (a char,
          b sequence(100,5),
          c char)

    외부 데이타 화일
        1,a
        2,b
        3,c

    검색결과
        SQL>select * from seqtb;

        A         B C
        -------------------------
        1       100 a
        2       105 b
        3       110 c

    주의 사항 : 이 예에서는 B열은 데이타 화일에 넣어서는 안 됩니다. SEQUENCE는 그것으로 완결된 열 지정의 하나가 됩니다. 초기 값 100과 늘인 값 5는 다른 수치로 변경 가능합니다.



    1.5 로드하는 논리 레코드를 구성하는 물리 레코드가 복수열로 구성된 경우
         (물리 레코드의 1바이트 째로 판단되는 경우)


    테이블 구조
        create table conti_test
        (a varchar(10),
          b varchar(10),
          c varchar(10))

    컨트롤 화일
        load data
        infile conti.dat
        replace
       continueif this
       (1) = '%'
       into table conti_test
       fields terminated by ','
       (a char,
         b char,
         c char)

    외부 데이타 화일
      %1,
      %2,
      3
      %A,B
      ,C
      %a,b
      %c
      %d
      ,ef

    검색결과
        SQL>select * from conti_test;

        A      B      C
        ---------------------
        1      2      3
        A      B      C
        a      bcd    ef

    주의사항 : 이 예의 경우 1바이트 째가 계속 행의 체크를 위해서 사용되기 때문에, 실 데이타를 1 바이트 째부터 시작해서는 안됩니다. 상기 예의 경우,  레코드의 선두 바이트가 '%'일 때 다음의 레코드가 연결됩니다.



    1.6 외부 데이타 화일의 물리 레코드가 복수 레코드로 구성된 경우
         (구성하는 물리 레코드 수가 모두 일정한 경우)


    테이블 구조
        create table con_test
        (a varchar(10),
          b varchar(10),
          c varchar(10))

    컨트롤 화일
        load data
        infile conti.dat
        replace
        --일례로 모든 논리레코드가 그 레코드로 구성됩니다.
        concatenate 2
       into table con_test
        fields terminated by ','
        (a char,
          b char,
          c char)

    외부 데이타 화일
        1,2,
        3
        a,b,
        c
        A,
        B,C

    검색결과
        SQl) select * from con_test;

        A       B       C
        -------------------------
        1       2       3
        a       b       c
        A       B       C

    주의사항 : 하나의 논리 레코드가 모두 일정한 갯수의 물리 레코드로부터 성립되는 것 같은 단순한 경우에 한합니다.



    1.7 데이타의 잘린 문자를 데이타로 로드하고 싶은 경우

    테이블 구조
        create table enc
        (a varchar(10),
          b varchar(10),
          c varchar(10))

    컨트롤 화일
        load data
         infile enc.dat
        replace
        into table enc
        fields terminated by ',' optionally enclosed by ' " ' and ' " '
        (a char,
          b char,
          c char)

    외부 데이타 화일
      "abc,d",2,3
       "a,,d",4,5

    검색결과
      SQL>select * from enc;

        A       B       C
        -------------------------
        abc,d   2       3
        a,,d    4       5



    1.8 포지션 지정 시 char 형 데이타 전후의 blank도 로드하고 싶은 경우

    테이블 구조
        create table pretb
        (a varchar(10),
          b varchar(10),
          c varchar(10))

    컨트롤 화일
        load data
        infile pre.dat
        replace
         preserve blanks
        into table pretb
        (a position(01:05) char,
          b position(06:10) char,
          c position(11:20) char)

    외부 데이타 화일
        12 4 67890 ab def hi
          2   67890 ab def hi

    검색 결과
        SQL>select * from pretb;

        A       B       C
        --------------------------
        12 4    67890   ab def hi
          2       67890   ab def hi

    결과 확인
        SQL>select length(a), length(c) from pretb;

        LENGTH(A) LENGTH(C)
        -------------------
                 5        10
                 5        10



    1.9 어떤 데이타 열의 데이타 유무와 상관없이 데이타가 없는 경우 NULL 데이타를  넣도록 하고 싶다

    테이블 구조
        create table tratb
        (a varchar(10),
          b varchar(10),
          c varchar(10))

    컨트롤 화일
        load data
        infile tra.dat
        replace
        into table tratb
        fields termintated by ','
        trailing nullcols
        (a char,
          b char,
          c char)

    외부 데이타 화일
        1,aa,
        2,bb,FF
        3,cc,

    검색결과
        SQL>select * from tratbl

        A       B       C
        ------------------------
        1       aa
        2       bb      FF
        3       cc

    주의사항 : trailing nullcols를 사용하지 않으면 1 레코드째와 3 레코드째가 데이타 에러가 됩니다. 데이타가 들어 있기도 하고 없기도 한 열의 데이타는 데이타 화일의 최후로 가져갑니다.



    1.10  CHAR 형 필드가 BLANK로 채워져 있을 때 NULL을 삽입하고 싶은 경우

    테이블 구조
        create table nulltb
        (a varchar(10),
          b varchar(10),
          c varchar(10))

    컨트롤 화일
        load data
        infile null.dat
        replace
        into table nulltb
        fields terminated by ','
        (a char,
          b char,
          c char(10) nullif c = blanks)

    외부 데이타 화일
        aa,bb, ,
        11,22, ,
        99,88,AA
        00,00,BB

    검색결과
        SQL>select * from nulltb;

        A       B       C
        -------------------------
        aa      bb
        11      22     
        99      88      AA    
        00      00      BB

    주의 사항 : 검색결과의 1 행째, 2 행째의 열 C는 블랭크가 아니라 NULL 입니다.

     

    1.11 DATE 필드가 BLANK로 채워져 있을 때 NULL을 삽입하고 싶은 경우

    **** 테이블 구조 ****
    create table nulltb2
    (a varchar(10),
    b varchar(10),
    c date)

    **** 콘트롤 화일 ****
    load data
    infile null2.dat
    replace
    into table nulltb2
    fields terminated by ','
    (a char,
    b char,
    c date "YY/MM/DD" nullif c = blanks)

    **** 외부 데이타 화일 ****
    aa,bb, ,
    11,22, ,
    99,88,92/11/11,
    00,00,94/12/12,

    **** 검색결과 ****
    SQL>select * from nulltb2;

    A       B       C
    -------------------------
    aa      bb
    11      22
    99      88      92/11/11
    00      00      94/12/12

    주의사항 : 검색결과의 1 행째, 2 행째의 열 C는 블랭크가 아니라 NULL 입니다.


    1.12 POSITION 지정 시 BLANK를 그대로 로드하고 싶은 경우

    **** 테이블 구조 ****
    create table nulltb2
    (a varchar(10),
    b varchar(10),
    c date)

    **** 콘트롤 화일 ****
    --- position 지정으로 블랭크를 그대로 입력 원하는 경우
    --- preserve blanks를 지정한다.
    load data
    infile null3.dat
    replace
    preserve blanks
    into table nulltb2
    (a position(1:2) char,
    b position(3:4) char nullif b = blanks,
    c position(5:13) date "YY/MM/DD")

    **** 외부 데이타 화일 ****
    998892/11/11
        94/12/12

    **** 검색결과 ****
    SQL>select * from nulltb2;

    A       B       C
    -------------------------
    99      88      92/11/11
                    94/12/12

    SQL>select length(a), length(b) from nulltb2;

    LENGTH(A) LENGTH(B)
    -------------------
            2         2
            2


    주의사항 : 이 경우 2 레코드째는 A에 블랭크가 들어가고 B에 NULL이 들어갑니다.



    1.13 데이타 화일의 수치 데이타 열에 BLANK가 들어가 있을 때 0을 입력하고 싶은 경우

    **** 테이블 구조 ****
    create table def2
    (a varchar(10),
    b varchar(10),
    c number)

    **** 콘트롤 화일 ****
    load data
    infile def2.dat
    replace
    into table def2
    fields terminated by ','
    (a char,
    b char,
    c integer external defaultif c = blanks)

    **** 외부 데이타 화일 ****
    11,11,123
    22,22, ,
    33,33, ,
    44,44, ,

    **** 검색결과 ****
    SQL>select * from deft;

    A       B              C
    ------------------------
    11      11           123
    22      22             0
    33      33             0
    44      44             0



    1.14 데이타가 NULL일 때 NULL이라고 하는 문자열을 넣고 싶은 경우

    **** 테이블 구조 ****
    create table ifnulltb
    (a varchar(10),
    b varchar(10),
    c varchar(10))

    **** 콘트롤 화일 ****
    load data
    infile ifnull.dat
    replace
    into table ifnulltb
    fields terminated by ','
    (a char,
    b char "nvl(:b,'NULL')",
    c char)

    **** 외부 데이타 화일 ****
    1,2,3,
    A,,B
    a,b,c

    **** 검색결과 ****
    SQL>select * from ifnulltb;

    A       B       C
    -------------------------
    1       2       3
    A       NULL    B
    a       b       c


    주의 사항 : NVL과 같은 SQL 함수는 DIRECT LOAD의 경우 SQL 인터페이스를 경유하지 않기 때문에 사용할 수 없습니다.



    1.15 어떤 열을 모두 대문자(소문자)로 변환하여 로드하고 싶은 경우

    **** 테이블 구조 ****
    create table uptb
    (a varchar(10),
    b varchar(10))

    **** 콘트롤 화일 ****
    load data
    infile upper.dat
    replace
    into table uptb
    fields terminated by ','
    (a char "lower(:a)",
    b char "upper(:b)")

    **** 외부 데이타 화일 ****
    aBcDeFg,AbCdEf
    ccDD11,ffGG22

    **** 검색결과 ****
    SQL>select * from uptb;

    A         B     
    --------------------
    abcdefg   ABCDEF
    cdd11     FFGG22



    1.16 ZONE 형 데이타를 로드하고 싶은 경우

    ZONE의 데이타 형식은 1문자 1바이트로 나타납니다.

    숫자 +123이라면

    bit     1234    5678    1234    5678    1234    5678
            1111    0001    1111    0010    1100    0011
    10진            1               2         +        3              

    최후의 8비트의 상위 4비트(부호비트)로 정부가 지정됩니다.

           1100(정) 1101(부)

    가 됩니다.

    원래는 EBCDIC코드에서

    Hex F0 to F9  →  +0 to +9
    Hex C0 to C9  →  +0 to +9(부호비트)
    Hex D0 to D9  →  +0 to -9(부호비트)

    이것을 아스키로 변환했기 때문에

    부호비트        {ABCDEFGHI}JKLMNOPQR
    ------------------------------------
    부호            ++++++++++----------
    수              01234567890123456789

    가 됩니다.

    **** 테이블 구조 ****
    create table z
    (a varchar(10),
    i number,
    j number)

    **** 콘트롤 화일 ****
    load data
    infile filename.dat
    replace
    into table z
    (a position (01) char,
    i position(02:07) zoned(6),
    j position(08:13) zoned(6))

    **** 외부 데이타 화일 ****
    A12345{12345}

    **** 검색결과 ****
    SQL>select * from z;

    A            I        J
    -----------------------
    A       123450  -123450



    1.17 decimal 형 데이타를 로드하고 싶은 경우

    decimal 데이타는 1바이트에 2개의 숫자가 지정됩니다.

    숫자 +123 이라면

    bit    1234 5678 1234 5678
           0001 0010 0011 1100
    10진      1    2    3    +

    끝의 4비트는 부호비트로 불리고

         1100(정)        1101(부)

    가 됩니다.

    **** 테이블 구조 ****
    create table dec
    (a varchar(10),
    col1 number,
    col2 number)

    **** 콘트롤 화일 ****
    load data
    infile filename.dat
    replace
    into table dec
    (a position (01:01) char,
    col1 position(02:05) decimal(7,4),
    col2 position(06:09) decimal(7,4))

    **** 외부 데이타 화일 ****
    데이타화일은 바이너리이기 때문에 more 등으로 볼 수 없습니다.

    4112 3456 7c12 3456 7d0a

    **** 검색결과 ****
    SQL>select * from dec;

    A               COL1        COL2
    --------------------------------
    A           123.4567   -123.4567


    주의 사항 :콘트롤 화일에서 decimal 형을 사용하는 것에 따라 (length, scale)을 지정합니다.



    1.18 고정 길이 레코드 데이타를 로드하고 싶은 경우

    **** 테이블 구조 ****
    create table fixtb
    (a varchar(10),
    b varchar(10))

    **** 콘트롤 화일 ****
    load data
    infile fix.dat
    "FIX 6"
    replace
    into table fixtb
    (a char(3),
    b char(3))

    **** 외부 데이타 화일 ****
    123456abcdef

    **** 외부 데이타 화일(16진) ****
    3132 3334 3536 6162 6364 6566

    **** 검색결과 ****
    SQL>select * from fixtb;

    A      B
    ---------------
    123    456
    abc    def


    주의 사항 : 데이타 화일의 끝에는 OxOa(CARRIAGE RETURN)가 들어가면  안 됩니다. OxOa도 1문자로 카운트되기 때문입니다.

  • 반응형
    반응형

    1. 환경 설정

    기본적으로 path가 필요하다.

    ===================================================

    export ORACLE_HOME=/oracle/product/102/db
    export PATH=$PATH:$ORACLE_HOME/bin
    export NLS_LANG=KOREAN_KOREA.KO16MSWIN949
    ===================================================

     

    2. CTL 파일 작성

       예) test.ctl

    3. sqlldr 실행

    sqlldr 아이디/비번@SID control=test.ctl log=test.log

     

    4. 결과조회

    에러 및 결과 완성 정보는 test.log에 남는다.!

    참고 파일 :

    반응형
    반응형

     Oracle 10g Table 데이터 삭제후 size변경관련
    Oracle>기타 1427
    정종필(miso177150) 2007-12-10 14:21:15.0

    안녕하세요.

    Oracle 10g를 사용하구있구요..특정 Table 편의를위해 "A"라고하겠습니다.

    A 테이블에 성능Data가 들어가있습니다. 2006년 6월부터 현재까지의  data가 들어가있는데

    정책변경으로 인해서,최근 3달만 보관하기로해서..2007년 8월까지의 data는 모두삭제를 했습니다.

    삭제하기전 table사이즈는 100G였고,삭제한후에도 여전히 100G입니다.

     

    Reorg를 통해서만,Table의 사이즈를 현재 data가 저장된 용량으로 만들수 있나요??

    Reorg를 하지 않고,삭제된 data만큼 table사이즈를 갱신할 수 있는 방법이 있으면 알려주시기 바랍니다.

    고수님들의 답변 부탁드리겠습니다.

    김민수(minsu74) 07/12/10
     Oracle 10g Table 데이터 삭제후 size변경관련

    Oracle 10g 를 사용하시면 Online Segment Shrink 기능을 이용하셔서

    HWM 의 조정이 가능하여 Table Size를 줄이실 수 있습니다.

    대량의 데이터를 삭제하는 것 보다는 새롭게 테이블을 Reorg 하는 작업이 더 빠르지만,

    이미 오래된 데이터를 delete 로 삭제하신 것 같네요...^^

     

    먼저 확인해야 할 사항은

    Init.ora 파라미터인 'Compatible' 값이 10.0 이상이여야 하며,

    Shrinking 하려는 대상 Segment 는 ASSM(Auto Segment Space Managed) Tablespace 내에

    존재해야 합니다.

     

    실제 실행 방법은

    1. 테이블의 row movement 기능을 활성화

     SQL> ALTER TABLE scott.emp ENABLE ROW MOVEMENT;

    2. 테이블과 HWM 를 shrink

     SQL> ALTER TABLE scott.emp SHRINK SPACE;

     

    cf) 테이블 및 관련된 인덱스를 모두 shrink

     SQL > ALTER TABLE scott.emp SHRINK SPACE CASCADE;

     

    Online Segment Shrink 적용 대상 세그먼트는

    Normal Table, Index, Lob, IOT, MView 이며,

    Segment Shrink 할 때의 Online 처리는 DML-Shared Lock 을 사용하기 때문에

    Shrink 를 처리하는 동안에도 DML 작업이 가능하지만, parallel DML 은 수행될 수 없습니다.

    또한, space-relase/HWM 조정을 하는 단계에서는 exclusive 모드로 lock 이 걸립니다.

    하지만, 이 단계는 매우 짧은 시간이 소요되므로, 객체에 대한 가용성에 미치는 영향은 최소화 됩니다.

     

    기타 자세한 사항이나 제약 사항들은 관련 메뉴얼을 참고하세요...



    출처 : http://www.dbguide.net/dbqa/dbqa111003.jsp?catenum=27&page=1&idx=8574
    반응형
    반응형

    # sqlldr oracleID/passwd@SID control=test.ctl log=test.log data=test.csv

        

        control : sqlldr 수행에 필요한 여러가지 옵션 사항을 기술한 control파일 위치 기술
        log : 작업 결과를 저장할 log파일 기술

        data : 데이터 파일 기술
     

        LOAD DATA         

            INFILE 데이터파일

            REPLACE       IMPORT방식

            INTO TABLE 테이블명   

            FIELDS TERMINATED BY '필드구분자'     

            OPTIONALLY ENCLOSED BY '"'

            (필드1, 필드2, 필드3, ... 필드9) 

     

        * IMPORT방식
           - REPLACE : 테이블의 기존행을 DELETE하고 INSERT
           - TRUNCATE : 테이블의 기존 데이타를 truncate하고 INSERT
           - APPEND : 기존 데이타의 다음부터 추가
           - INSERT 비어있는 테이블에 넣을때 사용(최초 사용시 사용)

     

    ex)

    LOAD DATA
        INFILE test.csv
        INTO TABLE TEST
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    (TEST1, TEST2, TEST3)

     

    test.csv 의 내용

    1,2,3

    3,4,5

    6,7,8

     

    결과 적으로 사용하는 방법은

     

    1. test.ctl 이라는 파일을 만듭니다.

    2. test.ctl 파일에는 위의 LOAD DATA 쿼리가 들어가게 됩니다.

    3. 데이터 파일을 위치 시킵니다.( 위의 예로 test.csv 파일을 가리킵니다. )

    4. sqlldr 명령어를 사용합니다.

    $ sqlldr  아이디/패스워드@SID control=컨트롤파일(test.ctl) data=데이터파일(test.csv)

     

    위의 방식대로 하시면 손쉽게 대량의 데이터를 오라클 DB에 insert 하실수 있으실것입니다.

     

    저는 test.ctl 파일과 test.csv 파일을 같은 디렉토리에 위치시키고 실행하였습니다.

     

    그럼 손쉬운 오라클 insert 가 되었으면 합니다.

     

    Reference URL

    http://www.cyworld.com/exodus_youngsik/196484

    반응형
    반응형

    ORA-00054: 자원이 사용중이고, NOWAIT가 지정되어 있습니다 해결 방법

    테이블명이 WOONJIN의 LOCK 걸려있는 SID와 SERIAL을 찾는다.

    select a.sid, a.serial#
    from v$session a, v$lock b, dba_objects c
    where a.sid=b.sid and
    b.id1=c.object_id and
    b.type='TM' and
    c.object_name='JOONI';


    SID SERIAL#
    --- -------
    82   8210


    alter system kill session '82, 8210';

    반응형
    반응형

    Pc에 mysql  설치한후 bin 디렉토리에서 실행또는 호스팅서버에 텔넷접속후 실행

    mysql -h ip -u id -p password  <--db 원격 접속: 

    mysql>\s

    --------------
    mysql  Ver 12.22 Distrib 4.0.16, for pc-linux (i686)

    Connection id:          1612
    Current database:
    Current user:           root@localhost
    SSL:                    Not in use
    Current pager:          stdout
    Using outfile:          ''
    Server version:         4.0.16-Max
    Protocol version:       10
    Connection:             Localhost via UNIX socket
    Client characterset:    latin1
    Server characterset:    latin1

    UNIX socket:            /var/lib/mysql/mysql.sock
    Uptime:                 9 hours 47 min 20 sec

    Threads: 6  Questions: 506708  Slow queries: 0  Opens: 16  Flush tables: 1  Open tables: 10  Queries per second avg: 14.379

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

    설정하기

    아래 euckr을 utf-8 로 변경해서 입력

    mysql> SET character_set_client = euckr;
    mysql> SET character_set_results = euckr;
    mysql> SET character_set_connection = euckr;
    mysql> ALTER DATABASE [DB명] DEFAULT CHARACTER SET euckr;
    commit;

     

    이렇게 하면 한글 잘됩니다.

    환경은 Linux + MySQL 4.1.8입니다. ^^

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

    환경설정화일에 직접 설정하기<----서버운용자가 반대할수있겠죠

    my.ini 를 열고 편집

    [mysqld]

    default-character-set=euckr
    character-set-client-handshake = FALSE
    ---------------------------------------------------------------------

    반응형

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

    MariaDB SHA2 512 방식으로 암호화 예제  (0) 2019.10.25
    Mysql & MariaDB 튜닝 쉘  (0) 2019.08.14
    MySQL 백업용 쉘스크립트입니다.  (0) 2010.01.18
    무료 접속 툴 (Free Tool)  (0) 2009.03.06
    C를 이용한 성적관리 예제  (0) 2009.03.06
    반응형

    웹페이지 상의 문서를 엑셀이나, 파워포인트, 위드 문서로 변환해 줘야 되는 경우
    만약에 엑셀 파일로 변환을 하고 싶으시면

    PHP는
    <?

    header(\"Content-Type: application/vnd.ms-excel\");

    ?>

    JSP는

    <%@ page contentType="application/vnd.ms-excel; name='My_Excel'" %>
    <%
    response.setHeader("Content-Disposition", "inline; filename=myfile.xls");
    response.setHeader("Content-Descript-xion", "JSP Generated Data");
    %>

    저 부분을 <HTML> 태그 앞에 넣으면 끝나지요.
    저 페이지가 호출이 되면 오피스가 깔려있는 사용자들은 저장할것인지 그냥 열것인지를 물어보구여, 안깔려 있는 사용자들은 파일을 다운받을수 있게 되지요.


    그럼 워드 파일은
    <?
    header(\"Content-Type: application/msword\");
    ?>

    파워포인트 역시 같은 방법으로
    <?
    header(\"Content-Type: application/vnd.ms-powerpoint\");
    ?>


    그럼 마지막으로 ASP에서는
    <%
    Response.Buffer = TRUE
    Response.ContentType = \"application/vnd.ms-excel\"
    %>


    다음은 header 내용을 변경해서 excel로 바꾸어 주는 구문입니다.

    * excel.php

    <?php

    header(\"Content-type: application/vnd.ms-excel\");

    header(\"Content-Disposition: attachment; filename=test.xls\");

    header(\"Content-Descript-xion: PHP4 Generated Data\");

    ?>

    <html>

    <body>

    <table>

    <tr>

    <td>테스트1</td>

    <td>테스트1</td>

    <td>테스트1</td>

    <td>테스트1</td>

    </tr>

    <tr>

    <td>테스트2</td>

    <td>테스트2</td>

    <td>테스트2</td>

    <td>테스트2</td>

    </tr>

    </table>

    </body>

    </html>



    실행시켜보세요. 어떻게 되죠? test.xls 이름으로 excel 화일이 다운로드 되죠.

    혹 DB내용을 excel형태로 출력해야될 때 유용할거 같습니다








    [JSP] 쿼리결과를 엑셀로 추출
    <%@ page contentType="application/vnd.ms-excel;charset=euc-kr" import="java.sql.*,java.text.*"%><%

    response.setHeader("Content-Disposition", "inline; filename=myfile.xls"); // 파일 이름 지정
    response.setHeader("Content-Descript-xion", "JSP Generated Data");

    Connection con = null ;
    Statement st = null ;
    ResultSet rs = null ;


    try{
    con = ## 컨넥션 얻기 ##
    st = con.createStatement();
    rs = st.executeQuery("## 쿼리 ##");
    ResultSetMetaData rsmd = rs.getMetaData();

    %><html>
    <body bgcolor=white>
    <table border=1>
    <tr bgcolor="#CACACA">
    <% for ( int i = 1 ; i <= rsmd.getColumnCount() ; i ++ ) { %>

    <th><%=rsmd.getColumnName(i)%></th>

    <% } %>
    </tr>
    <%
    while(rs.next()) {
    %>
    <tr>
    <% for ( int i = 1 ; i <= rsmd.getColumnCount() ; i ++ ) { %>

    <td><%

    if ( rs.getString(rsmd.getColumnName(i)) == null ) {
    out.print("");
    } else {

    out.print(rs.getString(rsmd.getColumnName(i)));
    }

    %></td>

    <% } %>
    </tr>
    <% } %>
    </table>
    </body>
    </html>
    <%


    } catch (Exception eee) {}
    finally {
    if ( rs != null ) rs.close();
    if ( st != null ) st.close();
    if (con != null ) con.close;
    }
    %>
    반응형

    'Language > JSP' 카테고리의 다른 글

    JSP 2.0 프로그래밍 소스  (0) 2011.10.12
    로딩된 CLASS 정보 보기  (0) 2011.03.10
    JSP WEB shell  (0) 2010.05.10
    JSP 파일 읽기  (0) 2009.12.03
    반응형

    예전에 Visual 계열의 프로그램은

    tab을 어떻게 하든, space를 마음껏(?) 눌러대도

    자동 정렬 기능을 쓰면 이쁘게 정렬이 된다.

    JAVA에도 그런 기능이 없을까 고민하던중

    관련 프로그램 이 있었다..

    Auto indent 지원 프로그램 ^-^

    Java Export 라는 프로그램으로

    무료 버젼이다.

    국내에는 auto indent 프로그램 없어... 뒤질란드..

    PDF 및 GIF, PNG 등 원하는 형태로 바로 바로 변환도 가능

    http://www.fileheap.com/software-java-code-export-download-9690.html

    반응형
    반응형

    3. package와 import

       

    3.1 패키지(package)


    패키지란, 클래스의 묶음이다. 패키지에는 클래스 또는 인터페이스를 포함 시킬 수 있으며, 서로 관련된 클래스들끼리 그룹 단위로 나누어 놓음으로써 클래스를 효율적으로 관리할 수 있다.
    또한 같은 이름의 클래스 일지라도 서로 다른 패키지에 존재하는 것이 가능하므로, 자신만의 패키지 체계를 유지함으로써 다른 개발자가 개발한 클래스 라이브러리의 클래스와 이름이 충돌하는 것을 피할 수 있다.
    지금까지는 단순히 클래스명으로만 클래스를 구분 했지만 클래스의 실제 이름(full name)은 패키지명을 포함한 것이다. 예를 들면, String클래스의 패키지명을 포함한 이름은 java.lang.String이다. 즉, java.lang패키지에 속한 String클래스라는 의미이다. 그래서 같은 이름의 클래스일 지라도 서로 다른 패키지에 속하면 패키지명으로 구별이 가능하다.
    클래스가 물리적으로 하나의 클래스파일(.class)인 것과 같이 패키지는 물리적으로 하나의 디렉토리이다. 그래서 어떤 패키지에 속한 클래스는 해당 디렉토리에 존재하는 클래스파일(.class)이어야 한다.

    예를 들어, java.lang.String클래스는 물리적으로 디렉토리 java의 서브디렉토리인 lang에 속한 String.class파일이다. 그리고 우리가 자주 사용하는 System클래스 역시 java.lang패키지에 속하므로 lang디렉토리에 포함되어 있다.







    String클래스는 rt.jar파일에 압축되어 있으며 아래의 그림은 압축을 풀기 전과 후의 그림이다. 클래스와 관련 파일들을 압축한 것이 jar파일(*.jar)이며, jar파일은 jar.exe이외에 알집이나 winzip으로 압축을 풀 수 있다.



    디렉토리가 하위디렉토리를 가질 수 있는 것처럼, 패키지도 다른 패키지를 포함할 수 있으며 점(.)으로 구분한다. 예를 들면 java.lang패키지에서 lang패키지는 java패키지의 하위패키지이다.


    - 하나의 소스파일에는 첫 번째 문장으로 단 한번의 패키지 선언을 허용한다.
    - 모든 클래스는 반드시 하나의 패키지에 속해야한다.
    - 패키지는 점(.)을 구분자로 하여 계층구조로 구성할 수 있다.
    - 패키지는 물리적으로 클래스 파일(.class)을 포함하는 하나의 디렉토리이다.





    3.2 패키지의 선언

    패키지를 선언하는 것은 아주 간단하다. 클래스나 인터페이스의 소스파일(.java)에서 다음과 같이 한 줄만 적어주면 된다.


    package 패키지명;



    위와 같은 패키지 선언문은 반드시 소스파일에서 주석과 공백을 제외한 첫 번째 문장이어야 하며, 하나의 소스파일에 단 한번만 선언될 수 있다. 해당 소스파일에 포함된 모든 클래스나 인터페이스는 선언된 패키지에 속하게 된다.
    패키지명은 대소문자를 모두 허용하지만, 클래스명과 쉽게 구분하기 하기위해서 소문자로 하는 것을 원칙으로 하고 있다.

    모든 클래스는 반드시 하나의 패키지에 포함되어야 한다고 했다. 그럼에도 불구하고 지금까지 소스파일을 작성할 때 패키지를 선언하지 않고도 아무런 문제가 없었던 이유는 자바에서 기본적으로 제공하는 '이름없는 패키지(unnamed package)' 때문이다.

    소스파일에 자신이 속할 패키지를 지정하지 않은 클래스는 자동적으로 '이름 없는 패키지'에 속하게 된다. 결국 패키지를 지정하지 않는 모든 클래스들은 같은 패키지에 속하는 셈이 된다.
    간단한 프로그램이나 애플릿은 패키지를 지정하지 않아도 별 문제 없지만, 큰 프로젝트나 Java API와 같은 클래스 라이브러리를 작성하는 경우에는 미리 패키지를 구성하여 적용하도록 한다.

    [예제7-9] PackageTest.java

    package com.javachobo.book;

    class PackageTest
    {
          public static void main(String[] args)
          {
                System.out.println("Hello World!");
          }
    }

    위의 예제를 작성한 뒤 다음과 같이 '-d' 옵션을 추가하여 컴파일을 한다.


    C:\j2sdk1.4.1\work>javac -d . PackageTest.java


    '-d'옵션은 소스파일에 지정된 경로를 통해 패키지의 위치를 찾아서 클래스파일을 생성한다. 만일 지정된 패키지와 일치하는 디렉토리가 존재하지 않는다면 자동적으로 생성한다.
    '-d'옵션 뒤에는 해당 패키지의 루트(root)디렉토리의 경로를 적어준다. 여기서는 현재디렉토리(.) 즉, 'C:\j2sdk1.4.1\work' 로 지정했기 때문에 컴파일을 수행하고 나면 다음과 같은 구조로 디렉토리가 생성된다.



    기존에 디렉토리가 존재하지 않았으므로 컴파일러가 패키지의 계층구조에 맞게 새로 디렉토리를 생성하고 컴파일된 클래스파일(PackageTest.class)를 book디렉토리에 놓았다.

    [참고] 만일 '-d'옵션을 사용하지 않으면, 프로그래머가 직접 패키지의 계층구조에 맞게 디렉토리를 생성해야한다.

    이제는 패키지의 루트 디렉토리를 클래스패스(classpath)에 포함시켜야 한다. com.javachobo.book패키지의 루트 디렉토리는 디렉토리 'com'의 상위 디렉토리인 'C:\j2sdk1.4.1\work'이다. 이 디렉토리를 클래스패스에 포함시켜야만 실행 시 JVM이 PackageTest클래스를 찾을 수 있다.
    [참고]클래스패스는 컴파일러(javac.exe)나 JVM 등이 클래스의 위치를 찾는데 사용되는 경로이다.

    Windows 98이하에서는 autoexec.bat파일에 다음과 같은 명령을 한 줄 추가하면 된다.


    SET CLASSPATH=.;C:\j2sdk1.4.1\work;


    Windows 2000에서는 '시스템등록정보-고급-환경변수-새로만들기'를 통해 아래의 그림과 같이 설정해 준다.



    ';'를 구분자로 하여 여러 개의 경로를 클래스패스에 지정할 수 있으며, 맨 앞에 '.;'를 추가한 이유는 현재 디렉토리(.)를 클래스패스에 포함시키기 위해서이다.
    클래스패스를 지정해 주지 않으면 기본적으로 현재 디렉토리(.)가 클래스패스로 지정되지만, 이처럼 클래스패스를 따로 지정해주는 경우에는 더 이상 현재 디렉토리가 자동적으로 클래스패스로 지정되지 않기 때문에 이처럼 별도로 추가를 해주어야 한다.
    jar파일을 클래스패스에 추가하기 위해서는 경로와 파일명을 적어주어야 한다. 예를 들어 C:\j2sdk1.4.1\work\util.jar파일을 클래스패스에 포함시키려면 다음과 같이 한다.

    SET CLASSPATH=.;C:\j2sdk1.4.1\work;C:\j2sdk1.4.1\work\util.jar;

    이제 클래스패스가 바르게 설정되었는지 확인하기 위해 다음과 같은 명령어를 입력해보자.


    C:\WINDOWS>echo %classpath%
    .;C:\j2sdk1.4.1\work;


    현재 디렉토리를 의미하는 '.'와 'C:\j2sdk1.4.1\work'가 클래스패스로 잘 지정되었음을 알 수 있다. 자, 이제 PackageTest예제를 실행시켜보자.

    [실행결과]
    C:\WINDOWS>java com.javachobo.book.PackageTest
    Hello World!

    실행 시에는 이와 같이 PackageTest클래스의 패키지명을 모두 적어주어야 한다.

    J2SDK에 기본적으로 설정되어 있는 클래스패스를 이용하면 위의 예제에서와 같이 클래스패스를 따로 설정하지 않아도 된다. 새로 추가하고자 하는 클래스를 'J2SDK설치디렉토리\jre\classes'디렉토리에, jar파일인 경우에는 'J2SDK설치디렉토리\jre\lib\ext'디렉토리에 넣기만 하면 된다.

    [참고] jre디렉토리 아래의 classes디렉토리는 J2SDK설치 시에 자동으로 생성되지 않으므로 사용자가 직접 생성해야한다.

    또는 실행 시에 '-cp'옵션을 이용해서 일시적으로 클래스패스를 지정해 줄 수도 있다.

    C:\WINDOWS>java -cp c:\j2sdk1.4.1\work com.javachobo.book.PackageTest



    3.3 import문

    소스코드를 작성할 때 다른 패키지의 클래스를 사용할 때는 패키지명이 포함된 이름을 사용해야한다. 하지만, 매번 패키지명을 붙여서 작성하기란 여간 불편한 일이 아닐 것이다.
    클래스의 코드를 작성하기 전에 import문으로 사용하고자 하는 클래스의 패키지를 미리 명시해주면 소스코드에 사용되는 클래스이름에서 패키지명은 생략할 수 있다.

    import문의 역할은 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공하는 것이다. 컴파일 시에 컴파일러는 import문을 통해 소스파일에 사용된 클래스들의 패키지를 알아 낸 다음, 모든 클래스이름 앞에 패키지명을 붙여 준다.

    [참고] import문은 프로그램의 성능에 전혀 영향을 미치지 않는다. import문을 많이 사용하면 컴파일 시간이 아주 조금 더 걸릴 뿐이다.



    3.4 import문의 선언

    모든 소스파일(.java)에서 import문은 package문 다음에, 그리고 클래스 선언 문 이전에 위치해야한다. 그리고 import문은 package문과는 달리 한 소스파일에 여러 번 선언할 수 있다.


    일반적인 소스파일의 구성은 'package문-import문-클래스선언'의 순서로 되어 있다.


    import문을 선언하는 방법은 다음과 같다.


    import 패키지명.클래스명;
    또는
    import 패키지명.*;


    키워드import와 패키지명을 생략하고자 하는 클래스의 이름을 패키지명과 함께 써주면 된다. 같은 패키지에서 여러 개의 클래스가 사용될 때, import문을 여러 번 사용하는 대신 '패키지명.*'을 이용해서 지정된 패키지에 속하는 모든 클래스를 패키지명 없이 사용할 수 있다.
    [참고] 클래스이름을 지정해주는 대신 '*'을 사용하면, 컴파일러는 해당 패키지에서 일치하는 클래스이름을 찾아야 하는 수고를 더 해야 할 것이다. 단지 그 뿐이다. 다른 차이는 없다.


    import java.util.Calendar;
    import java.util.Date;
    import java.util.ArrayList;


    이처럼 import문을 여러 번 사용하는 대신


    import java.util.*;


    위와 같이 한 문장으로 처리할 수 있다. 한 패키지에서 여러 클래스를 사용하는 경우 클래스의 이름을 일일이 지정해주는 것보다 '패키지명.*'과 같이 하는 것이 편리하다.

    하지만, import하는 패키지의 수가 많을 때는 어느 클래스가 어느 패키지에 속하는지 구별하기 어렵다는 단점이 있다.
    한가지 더 알아두어야 할 것은 import문에서 클래스의 이름 대신 '*'을 사용하는 것이 하위 패키지의 클래스까지 포함하는 것은 아니라는 것이다.


    import java.util.*;
    import java.text.*;


    그래서, 위의 두 문장 대신 다음과 같이 할 수는 없다.


    import java.*;


    [예제7-10] ImportTest.java

    import java.text.SimpleDateFormat;
    import java.util.Date;

    class ImportTest
    {
          public static void main(String[] args)
          {
                Date today = new Date();
               
                SimpleDateFormat date = new SimpleDateFormat("yyyy/MM/dd");
                SimpleDateFormat time = new SimpleDateFormat("hh:mm:ss a");

                System.out.println("오늘 날짜는 " + date.format(today));
                System.out.println("현재 시간은 " + time.format(today));
          }
    }
    [실행결과]
    오늘 날짜는 2003/01/07
    현재 시간은 01:59:53 오후

    현재 날짜와 시간을 지정된 형식에 맞춰 출력하는 예제이다. SimpleDateFormat과 Date클래스는 다른 패키지에 속한 클래스이므로 import문으로 어느 패키지에 속하는 클래스인지 명시해 주었다. 그래서 소스에서 클래스이름 앞에 패키지명을 생략할 수 있었다.
    만일 import문을 지정하지 않았다면 다음과 같이 클래스이름에 패키지명도 적어줘야 했을 것이다.


    java.util.Date today = new java.util.Date();
               
    java.text.SimpleDateFormat date = new java.text.SimpleDateFormat("yyyy/MM/dd");
    java.text.SimpleDateFormat time = new java.text.SimpleDateFormat("hh:mm:ss a");


    import문으로 패키지를 지정하지 않으면 위와 같이 '이름없는 패키지'에 속한 클래스를 제외한 모든 클래스이름 앞에 패키지명을 반드시 붙여야 한다.
    지금까지 System과 String 같은 java.lang패키지의 클래스들을 패키지명 없이 사용할 수 있었던 이유는 모든 소스파일에는 묵시적으로 다음과 같은 import문이 선언되어 있기 때문이다.


    import java.lang.*;


    java.lang패키지에는 매우 빈번히 사용되는 중요한 클래스들이 속한 패키지이기 때문에 따로 import문으로 지정하지 않아도 되도록 한 것이다.

     

    출처 : http://kin.naver.com/open100/db_detail.php?d1id=1&dir_id=10106&eid=PRkOvR1lMBu/xAgOgb4ka1KrOj9CeukU

    반응형

    + Recent posts