728x90

Changing the Listener Port Number for Database Connection Requests

If you change the listener port number for database connection requests, you must ensure that all future database connection requests use the new port number. This means that connection requests such as those discussed in"Connecting Remotely with SQL Command Line" must explicitly include the port number.

For example, if you change the port number for database connection requests to 1522, subsequent SQL Command Line (SQL*Plus) connect statements must be similar to the following (assuming a connection from Oracle Database Express Edition Client):

connect system/mypassword@myhost.mydomain.com:1522

Example: Changing Listener Port Number for Database Connection Requests

Assume that your Oracle Database XE host computer is named myhost.mydomain.com and that you want to install a new software package on this computer that requires TCP port number 1521. Assume also that the port number for that software package cannot be configured, and that you must therefore resolve the port number conflict by reconfiguring Oracle Database XE. You decide to change the listener port number for database connection requests to 1522.

To change the listener port number for database connection requests to 1522:

  1. Stop the listener.

    See "Stopping and Starting the Listener" for instructions.

  2. Open the fillistener.ora with a text editor.

    Table 4-3 shows the location of this file on each platform.

    Table 4-3 Location of the listener.ora File

    PlatformLocation

    Linux

    /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/admin/

    Windows

    c:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN\


  3. Locate the following section of the file:

    LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
          (ADDRESS = (PROTOCOL = TCP)(HOST = myhost)(PORT = 1521))
        )
      )
    

    Note that the line indicated in bold may or may not be present in the file.

  4. Change the text (PORT = 1521) to (PORT = 1522).

  5. Save the modified listener.ora file.

  6. Start the listener.

    See "Stopping and Starting the Listener" for instructions.

  7. Start SQL Command Line and connect to the database as user SYSTEM.

    See "Connecting Locally with SQL Command Line" for instructions. You must supply the SYSTEM password. You set this password upon installation (Windows) or configuration (Linux) of Oracle Database XE.

  8. Enter the following two commands:

    ALTER SYSTEM SET LOCAL_LISTENER = "(ADDRESS=(PROTOCOL=TCP)(HOST=myhost.mydomain.com)(PORT=1522))";
    ALTER SYSTEM REGISTER;
    
  9. Exit SQL Command Line and run the lsnrctl status command to verify the port number change.

    The new port number should be displayed in the Listening Endpoints Summary section of the status report, and the report should include the following lines:

    Service "XE" has 1 instance(s).  Instance "XE", status READY, has 1 handler(s) for this service...

    reference : http://download.oracle.com/docs/cd/B25329_01/doc/admin.102/b25107/network.htm#BHCCDEIH

728x90
728x90

db가 생성된 후에는,  startup upgrade후에 다음과 같은 작업을 해야합니다.

디비의 버전을 업그레이드 했지만, 이미 만들어진 객체들, 테이블, 패키지등은 아직 구버전 그대로 이기때문에,

테이블, 패키지등을 새로운 버전으로 업그레이드 하는 작업이 필요한데,  이것이  아래의 작업입니다.

 

사실은, 디비가 생성된 후에 패치 하지 마시고,  가능하면 디비 엔진만 설치 된 후에 패치하고,

그리고 디비 생성하는것이좋습니다.    그러면 아래같은 작업을 하지 않아도 됩니다.

 

아래와 같이 작업해도,  시간이 많이 걸리고, 진행이 안되고 멈추는 경우도 있었습니다. 

디비가 운영중일때는, 이런 패치작업은가능하면 안하는 것이 좋고, 

하더라도 디비 모든 내용(디비엔진, 데이터파일등 몽땅)을 다른곳에 백업을 받아놓고 하는것이 안전합니다. 

 

( 아래 내용은 패치안에 포함된 readme.html에 있는 내용을 편집한것입니다. 

  자세한 것은 readme.html을 참조하시기 바래요.)

Note:

If you do not run the catupgrd.sql script as described in this section and you start up a database for normal operation, then ORA-01092: ORACLE instance terminated. Disconnection forcederrors will occur and the error ORA-39700: database must be opened with UPGRADE optionwill be in the alert! log.

  1. Enter the following SQL*Plus commands:

    SQL> STARTUP UPGRADE
    SQL> SPOOL patch.log
    SQL> @?/rdbms/admin/catupgrd.sql  <- 이부분 실행
    SQL> SPOOL OFF
    
  2. Review the patch.log file for errors and inspect the list of components that is displayed at the end of catupgrd.sqlscript.

    This list provides the version and status of each SERVER component in the database.

  3. If necessary, rerun the catupgrd.sql script after correcting any problems.

  4. Restart the database:

    SQL> SHUTDOWN IMMEDIATE
    SQL> STARTUP
    
    1. Run the utlrp.sql script to recompile all invalid PL/SQL packages now instead of when the packages are accessed for the first time. This step is optional but recommended.
    2. SQL> @?/rdbms/admin/utlrp.sql <-이부분 실행
      
    1. Note:
    When the 10.2.0.4 patch set is applied to an Oracle Database 10g Standard Edition database, there may be 54 invalid objects after the utlrp.sql script runs. These objects belong to the unsupported components and do not affect the database operation.

    Ignore any messages indicating that the database contains invalid recycle bin objects similar to the following:

    BIN$4lzljWIt9gfgMFeM2hVSoA==$0

    1. Run the following command to check the status of all the components after the upgrade:

      SQL> select comp_name, version, status from sys.dba_registry;
      

      In the output of the preceding command, the status of all the components should be VALID for a successful upgrade.

    728x90
    728x90

    클래스패스와 환경 변수, 그것이 알고 싶다. 
    김세곤 
    2001년 4월 17일 


    서론 
    초보 자바 프로그래머를 괴롭히는 큰 문제 중에 그놈의 클래스패스는 빠지지 않는다. 클래스패스는 사실 이렇게 하나의 글로 설명하기조차 매우 부끄러운 사소한 것인데, 초보 자바 프로그래머에게는 절대 사소하지 않은 것이 현실이다. 더군다나, 가슴 아프게도 대부분의 자바 관련 서적은 클래스패스에 지면을 할애할 만한 형편도 안되고, 대부분의 저자들이 별것도 아닌 것에 공들여 설명하려 하지 않기 때문에, 당연히 클래스패스에 대해서는 많은 독자들이 제대로 이해하지 못한 채 끙끙댄다. 한편으로는, 이것은 기초를 제대로 다지지 않은 독자들의 책임이 크다. 클래스패스를 잘 설정해서 자바 프로그램을 컴파일하고 실행하는 기술은 자바 언어의 첫번째 단추이고, 이 내용은 대부분의 자바 책(자바 관련 서적이 아닌 자바 그 자체를 설명하는 책)에서는 설명이 되어 있기 때문이다.

    필자는 JSP Bible이라는 책을 집필하고 독자로부터 많은 질문을 받았는데, 거짓말 보태지 않고 50% 이상의 독자가 클래스패스로 골머리를 썩고 있었다. JSP로 웹 개발을 시도하려 한다면 자바 언어의 첫번째 단추인 클래스패스와 컴파일 정도에는 문제가 없어야 하는데, 아쉽게도 이 첫번째 단추를 못 껴서 진도를 못 나가다니 가슴 아픈 현실이 아닐 수 없다. 

    가장 좋은 방법은 역시 자바 언어를 제대로 공부하고 나서 JSP, Servlet, EJB 등 그 다음 단계의 공부를 진행하는 것이다. 그런데, 이유야 어찌 됐건, 대부분의 독자들은 자바에 대한 기초없이 응용 단계인 JSP, Servlet, EJB 등으로 마구 앞질러 나간다. 그리고, 막히면 다시 자바 언어를 체계적으로 공부하지 않고, 끙끙거리며 당장 진도를 나가려고 발버둥친다. 이 대목에서 찔리는 독자 여러분들이 분명히 많을 것이다. 

    솔직히 말해서, 필자는 JSP Bible 집필 당시에 자바의 생기초라 할 수 있는 클래스패스 설정하기 및 컴파일하기 등에 대해서 이렇게 많은 독자들이 모르리라고 예상하지 못했다. 그리고, 끊임없이 클래스패스에 대한 질문을 받으면서, 같은 답변을 계속 하다보니 이제는 클래스패스에 대한 질문만 만나면 경기가 난다. 

    필자는 이 글로 더 이상 클래스패스나 환경 변수 혹은 컴파일하기 등에 관련된 질문이 없기를 간절히 기대한다. 더 나아가서 많은 자바를 공부하고자 하는 개발자들이 제발 자바 언어에 대해서는 탄탄하게 기초를 다졌으면 한다. 

    클래스 이름과 패키지 
    갑돌이가 A.java 라는 자바 프로그램을 만들었다고 하자. 그리고, 자신의 컴퓨터 C 드라이브의 myClass라는 폴더에 A.java를 컴파일한 A.class를 넣어 두었다고 치자. 그리고는 A.class를 잘 사용하다가 어느날 똑순이가 만든 클래스를 사용할 일이 있어서 똑순이의 클래스들을 건네 받았는데, 그 중에 A.class라는 같은 이름의 클래스가 있다는 사실을 알았다. 갑돌이는 갑자기 답답해졌다. 자, 어찌 하면 갑돌이가 만든 클래스 A와 똑순이가 만든 클래스 A를 구별할 수 있을까? 

    해답은 바로 패키지이다. 

    갑돌이의 회사는 gabdol이고, 똑순이의 회사는 ddogsun이므로, 이 이름을 클래스 이름 A에 붙여쓰면 구별이 될 수가 있는 것이다. 갑돌이의 클래스 A의 이름을 gabdol.A로 똑순이의 클래스 A의 이름을 ddogsun.A로 사용하면 고민이 해결된다는 말이다. 그런데, 덕팔이의 회사 이름이 갑돌이의 회사 이름과 같다면 또 이름이 충돌하게 된다. 그렇다면 전세계에서 유일한 이름을 클래스 이름 앞에 붙여주면 아주 간단해진다. 전세계에서 유일한 이름으로는 머리속에 팍 떠오르는 것이 회사의 도메인 명이다. 갑돌이네 회사가 www.gabdol.com이라는 도메인 이름을 소유하고 있다면, 갑돌이네 회사에서 만드는 모든 클래스의 이름을 com.gabdol.A와 같은 식으로 만들면 문제가 해결된다. 바로, 이 com.gabdol이 클래스 A의 패키지 이름이 되는 것이다. 만일, 갑돌이네 회사가 두 개의 자바 소프트웨어를 개발했는데, 둘 다 A.java라는 클래스가 있다면 이를 또 구별해야 한다. 이런 경우라면 com.gabdol 뒤에 임의로 갑돌이네 회사가 알아서 패키지 이름을 만들면 된다. 두 개의 소프트웨어 이름이 sw1, sw2라고 하면 com.gabdol.sw1.A, com.gabdol.sw2.A 식으로 클래스 이름을 사용하는 것이다. 

    이렇게 패키지를 사용하게 되면 이름 충돌의 문제도 해결할 수 있을 뿐만 아니라, 클래스를 분류하기도 쉽다. 예를 들어, 갑돌이네 회사에서 고객에 관련된 클래스들의 패키지 이름을 com.gabdol.client로 하고, 상품에 관련된 클래스들의 패키지 이름을 com.gabdol.product로 정하면 클래스들의 성격을 패키지 이름만 보고도 쉽게 파악할 수 있는 것이다. 

    클래스의 위치 
    이제, 갑돌이가 만드는 클래스의 이름이 com.gabdol.sw1.A로 정해졌다고 하자. 그렇다면 이 클래스는 어디에 위치해야 할까? com.gabdol.sw2.A와 같은 폴더에 존재하면 안 되므로, 패키지 이름에 따라 클래스의 위치가 유일하게 구별될 수 있어야 한다. 갑돌이는 자신의 클래스르 모두 C:\\myClass라는 폴더에 두고 있으므로, com.gabdol.sw1.A 클래스는 C:\\myClass\\com\\gabdol\\sw1 폴더에 두고, com.gabdol.sw2.A 클래스는 C:\\myClass\\com\\gabdol\\sw2 폴더에 두면 두 클래스가 충돌하지 않을 것이다. 이렇게 하면, 소스 파일과 컴파일된 클래스 파일이 다음처럼 위치하게 된다. 

    C:\\myClass\\com\\gabdol\\sw1\\A.java 
    C:\\myClass\\com\\gabdol\\sw1\\A.class 
    C:\\myClass\\com\\gabdol\\sw2\\A.java 
    C:\\myClass\\com\\gabdol\\sw2\\A.class 


    이제, 패키지의 이름에 따른 클래스의 위치에 대해서 감이 오는가? 

    패키지 선언과 임포트 
    com.gabdol.sw1.A 클래스의 패키지는 com.gabdol.sw1이고 com.gabdol.sw2.A 클래스의 패키지는 com.gabdol.sw2이다. 이 정보는 당연히 두 소스 코드 내에 들어가야 한다. 방법은 간단하다. C:\\myClass\\com\\gabdol\\sw1\\A.java 코드의 첫머리에 다음의 한 줄만 쓰면 된다. 


    package com.gabdol.sw1; 


    여기서, com.gabdol.sw1.A 클래스가 com.gabdol.sw2 패키지에 들어있는 클래스들을 사용하고 싶다고 하자. 어떻게 해야 할까? 방법은 두 가지이다. 

    첫번째는 클래스의 이름을 완전히 써 주는 것이다. 다음처럼 말이다. 


    package com.gabdol.sw1; 
    ... 
    com.gabdol.sw2.B b = new com.gabdol.sw2.B(); 
    ... 


    이렇게 하면 클래스 B가 com.gabdol.sw2 패키지 내에 있는 것이 드러나므로 컴파일 시에 문제가 없다. 

    두번째는 패키지를 임포트(import)하는 것이다. 다음처럼 하면 된다. 


    package com.gabdol.sw1; 
    import com.gabdol.sw2.*; 
    ... 
    B b = new B(); 
    ... 


    위의 코드의 import com.gabdol.sw2.*; 부분은 com.gabdol.sw1.A 클래스가 com.gabdol.sw2 패키지 내의 클래스들을 사용하겠다는 뜻이다. 이렇게 하면 자바 컴파일러가 B b = new B(); 부분을 컴파일하면서 B라는 클래스를 com.gabdol.sw1.A가 속해있는 com.gabdol.sw1 패키지와 임포트한 com.gabdol.sw2 패키지 내에서 찾게 된다. 만일, com.gabdol.sw1과 com.gabdol.sw2 패키지에 모두 B라는 이름의 클래스가 있다면 당연히 컴파일러는 어떤 것을 써야할지 모르므로 에러를 낸다. 이 경우에는 다음처럼 하는 수밖에 없다. 


    package com.gabdol.sw1; 
    import com.gabdol.sw2.*; 
    ... 
    com.gabdol.sw1.B b1 = new com.gabdol.sw1.B(); 
    com.gabdol.sw2.B b2 = new com.gabdol.sw2.B(); 
    ... 


    import com.gabdol.sw1.*과 같이 *를 사용하면 com.gabdol.sw1 패키지 내의 모든 클래스를 사용하겠다는 뜻이고, com.gabdol.sw1.B 클래스만 사용한다면 import com.gabdol.sw1.B라고 명시하면 된다. 

    클래스패스 
    이제, 갑돌이는 C:\\myClass\\com\\gabdol\\sw1\\A.java 파일을 컴파일하려 한다. 갑돌이는 C:\\myClass\\com\\gabdol\\sw1\\ 폴더로 이동해서 다음처럼 할 것이다. 

    javac A.java 


    결과는 당연히 클래스 B를 찾을 수 없다는 에러 메시지이다. com.gabdol.sw1.B 클래스가 컴파일된 바이트코드인 B.class가 도대체 어디에 있는지 자바 컴파일러로서는 알 길이 없기 때문이다. 이 때 필요한 것이 클래스패스이다. 갑돌이가 다음처럼 하면 컴파일이 성공적으로 이루어진다. 

    javac -classpath C:\\myClass A.java 


    여기에 "-classpath C:\\myClass" 부분은 자바 컴파일러에게 C:\\myClass폴더를 기준으로 패키지를 찾으라는 뜻이다. 즉, com.gabdol.sw1.B 클래스는 C:\\myClass 폴더를 시작으로 C:\\myClass\\com\\gabdol\\sw1 폴더에서 찾고, com.gabdol.sw2.B 클래스는 C:\\myClass\\com\\gabdol\\sw2 폴더에서 찾는 것이다. 

    그런데, 갑돌이는 돌쇠에게 건네 받은 클래스들을 C:\\otherClass 라는 폴더에 저장하고 있었는데, 이 중에 일부 클래스를 A.java에서 사용할 일이 생겼다. 돌쇠가 건네 준 클래스는 com.dolsse.ddol 이라는 패키지에 포함되어 있고, 이 클래스들은 C:\\otherClass\\pr\\com\\dolsse\\ddol 폴더에 있다면, 돌쇠가 준 클래스들은 C:\\otherClass\\pr 폴더를 시작으로 찾아야 한다. 따라서, 돌쇠의 클래스를 사용하는 A.java 파일을 컴파일하기 위해서는 다음처럼 해야 한다. 

    javac -classpath "C:\\myClass;C:\\otherClass\\pr" A.java 


    이렇게 하면 C:\\myClass 폴더에 저장되어 있는 com.gabdol.sw1.A, com.gabdol.sw2.B 클래스와 C:\\otherClass\\pr 폴더에 저장되어 있는 com.dolsse.ddol.* 클래스들을 자바 컴파일러가 제대로 찾을 수 있게 되는 것이다. 

    A.java를 컴파일해서 얻어진 클래스를 직접 실행하려면 자바 가상 머신을 구동해야 하는데, 이 때에서 당연히 A.class가 사용하는 다른 클래스를 자바 가상 머신이 찾을 수 있어야 한다. 따라서, 역시 컴파일할 때와 마찬가지로 클래스패스가 필요하다. A.class를 실행하려면 다음처럼 해야 한다. 

    java -classpath "C:\\myClass;C:\\otherClass\\pr" com.gabdol.sw1.A 


    실행할 때에는 실행하고자 하는 클래스의 패키지 이름까지 명시해야 한다. 왜냐하면, 자바 가상 머신이 클래스를 실행할 때에는 지정된 이름이 패키지 이름을 포함한 것으로 생각하기 때문이다. 만일, 다음처럼 한다면, 

    java -classpath "C:\\myClass;C:\\otherClass\\pr" A 


    자바 가상 머신은 C:\\myClass\\A.class 혹은 C:\\otherClass\\pr\\A.class를 찾으려고 할 것이다. 

    클래스패스란 여러 폴더에 산재한 클래스들의 위치를 지정해서 패키지에 따라 클래스를 제대로 찾을 수 있게 해 주는 값이다. 

    환경 변수 
    매번, 컴파일할 때와 실행할 때에 classpath 옵션에 클래스패스를 명시하는 것을 불편하다. 한 번의 설정으로 이런 문제를 해결하기 위해서 환경 변수라는 것을 사용한다. 많은 독자들이 역시 환경 변수가 무엇인지, 어떻게 설정하는지 모르는 경우가 많으므로 여기서 잘 정리해 보겠다. 

    환경 변수는 말 그래로 변수에 어떤 값을 저장시키되 이를 환경에 저장하는 것이다. 환경에 저장한다는 말은 그 환경 내의 모든 프로그램이 그 변수의 값을 알 수 있게 된다는 뜻이다. 여러분이 윈도우 95/98/Me의 도스창 혹은 윈도우 NT/2000의 명령창을 실행시키면, 그 명령창 내에서 각종 프로그램을 구동할 수가 있는데, 이 때, 그 명령창의 환경에 변수 값을 설정하면 그 명령창 내에서 구동되는 프로그램들은 환경 변수 값을 얻을 수가 있게 된다. 

    명령창 내에서 환경 변수를 설정하는 방법은 간단하다. 

    C:\\> SET 변수이름=값 


    혹은 

    C:\\> SET 변수이름="값" 


    처럼 하면 된다. 여러분의 명령창 또는 도스창을 띄워서 다음처럼 해 보자. 

    C:\\> SET myname="Hong Gil Dong" 


    이렇게 하면 환경 변수 myname에는 "Hong Gil Dong"이 설정된다. 제대로 설정이 되었는지 확인해 보기 위해서는 다음처럼 하면 된다. 

    C:\\> echo %myname% 
    "Hong Gil Dong" 


    첫 번째 줄은 환경 변수 myname의 값을 출력하라는 명령이고, 두 번째 줄은 그 결과가 나온 것이다. 

    환경 변수는 메모리가 허락하는 양만큼 설정할 수 있다. 즉, 다음처럼 복수 개의 환경 변수를 설정할 수 있다는 말이다. 

    C:\\> SET myname="Hong Gil Dong" 

    C:\\> SET yourname="Kim Gap Soon" 


    자, 이번에는 이 명령창을 종료하고 다른 명령창을 띄워 보자. 그리고, 다음처럼 myname 환경 변수의 값을 출력해 보자. 

    C:\\> echo %myname% 
    %myname% 


    두 번째 줄과 같은 결과가 나온다. 조금 전에 설정했던 값을 온데간데 없다. 왜 그럴까? 이유는 간단하다. 환경 변수는 그 명령창 내에서만 존재하기 때문이다. myname 변수를 설정한 명령창을 종료했기 때문에, 이와 동시에 myname 환경 변수가 사라진 것이다. 또, myname 변수를 설정한 명령창을 종료하지 않았다고 해도, 다른 명령창에서는 myname 변수 값을 공유하지 않는다. 오로지, 변수를 설정한 그 명령창 내에서만 그 변수는 의미가 있게 되는 것이다. 

    이렇게 환경 변수가 명령창 내에서만 의미가 있기 때문에, 온갖 프로그램에서 공유하기 위해서는 명령창에서 환경 변수를 설정하는 방법 외에 다른 방법을 사용해야 한다. 윈도우 95/98/Me라면 autoexec.bat 파일을 사용하고, 윈도우 NT/2000이라면 글로벌 환경 변수를 설정하는 별도의 방법이 존재한다. 

    우선, 윈도우 NT/2000이라면 다음처럼 한다. 

    1. 바탕화면의 "내 컴퓨터"를 오른쪽 클릭한다. 

    2. "고급" 메뉴를 택한다. 

    3. 가운데 "환경 변수" 메뉴를 택한다. 

    4. 두 창이 나오는데 위 쪽은 특정 로그인 사용자에 대한 환경 변수를 설정하는 것이고, 아래 쪽은 모든 사용자에게 적용되는 환경 변수를 설정하는 것이다. 관리자(Administrator) 권한을 갖고 있다면 아래 시스템 변수의 값을 설정할 수 있다. 상황에 맞게 선택하면 된다. 

    5. 버튼이 "새로 만들기", "편집", "삭제"가 있는데, 새로운 환경 변수를 만드는 경우에는 "새로 만들기"를 클릭하고, 기존 변수 값을 수정하고자 한다면 "편집"을 누른다. "삭제"는 물론 변수를 아예 없애는 경우에 클릭한다. 

    6. "새로 만들기"나 "편집"을 클릭하면 변수 이름과 값을 설정하게 되어 있는데 여기에 원하는 이름과 값을 입력하면 된다. 


    윈도우 95/98/Me라면, autoexec.bat 파일을 편집기로 열어서 "set 변수이름=값"을 아무데나 추가하면 된다. 

    자, 이제는 글로벌 환경 변수에 클래스패스 변수를 설정해 보자. 

    윈도우 NT/2000이라면 위의 단계를 차례로 실행한 후에, 이미 CLASSPATH 혹은 classpath 변수가 있다면 이를 편집하고, 없다면 새로 만들기를 하면 된다. 지금까지 예로 든 대로라면 다음의 값을 입력하면 된다. 

    C:\\myClass;C:\\otherClass\\pr 

    <김상욱 주: 이렇게만 하면 한 디렉토리에서 방금 만들어진 클래스파일 즉 현재 디렉토리의 클래스파일을 찾지 못하기 때문에 현재 디렉토리를 나타내는 . 을 추가한다.> 

    <즉, .\\C:\\myClass;C:\\otherClass\\pr 이렇게 입력하여야 합니다.> 


    윈도우 95/98/Me라면 autoexec.bat 파일을 열어서, 다음의 한 줄을 추가한다. 

    set CLASSPATH="C:\\myClass;C:\\otherClass\\pr" 

    <김상욱 주: 마찬가지 이유로 set CLASSPATH=".;C:\\myClass;C:\\otherClass\\pr" 로 입력되어야 합니다.> 


    그렇다면, 자바 컴파일러와 자바 가상 머신은 이렇게 설정한 환경 변수와는 어떤 관계가 있을까? 자바 컴파일러와 자바 가상 머신은 -classpath 옵션을 지정하지 않으면 환경 변수 CLASSPATH 혹은 classpath의 값을 시스템으로부터 얻어서 이를 클래스패스로 사용한다. 클래스패스의 값을 환경 변수로부터 얻을 수 있도록 애초부터 만들어진 것이다. 

    jar 파일과 클래스패스 
    jar 파일은 클래스들을 묶어 놓은 것이다. 즉, 갑돌이는 자신이 만든 com.gabdol 이하의 모든 클래스를 하나의 파일인 gabdol.jar 파일로 묶을 수가 있다. 이렇게, gabdol.jar 파일을 C:\\gg\\cc 폴더 아래에 두었다면 이 압축 파일 내의 클래스를 역시 자바 컴파일러와 자바 가상 머신이 찾을 수 있도록 해야 한다. 이 때에는 파일 이름까지 포함해서 클래스패스에 추가해야 한다. 다음처럼 말이다. 

    set CLASSPATH=C:\\gg\\cc\\gabdol.jar;C:\\myClass;C:\\otherClass\\pr 


    마치며 


    지금까지 자바 프로그램의 가장 기초라고 할 수 있는 클래스패스에 대해서 알아 보았다. 필자는 이 글로 더 이상의 클래스패스에 대한 질문이 사라졌으면 하는 바램이다. 독자 여러분이 클래스패스를 고민하는 것도 시간 낭비이고, 저자가 이에 대해서 일일이 답변해 주는 것도 시간 낭비라고 생각된다. 만일, 독자 여러분이 클래스를 찾지 못한다는 에러를 만난다면 100% 클래스패스 설정 잘못이므로, 이 글을 잘 읽어서 근본적으로 클래스패스에 대해서 이해한 후에 문제를 해결하는 노력을 기울이도록 하자. 

    728x90

    '용어' 카테고리의 다른 글

    2단계 커밋  (0) 2010.03.02
    ERP (enterprise resource planning)  (0) 2010.01.21
    DBMS의 종류  (0) 2010.01.04
    OLE DB에 대한 이야기  (0) 2009.12.17
    아카이빙(Archiving) 과 백업(Backup) 의 차이점  (0) 2009.11.12
    728x90

    DBMS의 종류



    대표적 상용 DBMS의 간략히 소개하고자 한다.

    ① Oracle

     Oracle사의 대표적인 제품으로써 전 세계적으로 가장 많은 수요자 층을 확보하고 있는 제품이다. 현재 Oracle10g버전이 출시되어 있다. 유닉스, 리눅스, 윈도우 버전이 따로 있으며 리눅스 버전의 경우에는 홈페이지에서 다운로드 받아 개발용으로 사용할 수 있다.


    Oracle Korea 홈페이지 (http://www.oracle.co.kr)

     

     

    ② Microsoft SQL Server

     마이크로소프트의 대표적인 데이터베이스 시스템이다. 윈도우 환경에서 가장 많이 사용되고 있으며 비주얼 베이직과의 직접적인 프로그래밍도 가능하다. Windows 2000 서버나 Windows 2003 서버를 사용하는 시스템에서 활용되고 있으며 SQL Server2005까지 출시되었다.


    Microsoft의 SQL Server 홈페이지 (http://www.microsoft.com/sql/


     

    ③ DB2

     IBM의 DB2(Data Base 2)는 1983년에 발표된 상업용 관계 데이터 베이스 관리 시스템으로서 MVS/XA와 MVS/370 운영체제에서 사용되며, SQL을 데이터 언어로 사용하여 다수의 사용자들이 여러 개의 관계 데이터 베이스를 동시에 접근할 수 있는 대형 데이터 베이스를 위한 시스템이다. 현재 DB2 9까지 출시 되었다.


    IBM DB2 소개 홈페이지 (http://www-306.ibm.com/software/data/db2/v9/)

    ④ Sybase

     Sybase는 엔터프라이즈 정보시스템 구축을 위한 Client/Server 환경에서 가장 강력한 데이터베이스 관리시스템 소프트웨어로, 데스크탑 환경에서뿐만 아니라 엔터프라이즈 컴퓨팅에 이르기까지 토탈 솔루션 제공한다. 기존에 RDBMS 들의 단점을 보완한 Client/Server 아키텍처를 기본 사상으로 개발되어, 하드웨어 플랫폼과 무관한 개방형 시스템 구조로 확장성과 상호 운용성, 신뢰성 및 가용성을 최대의 장점으로 부각된 제품이다.


    Sybase 홈페이지 (http://www.sybase.com)

    ⑤ Informix

     Informix사의 Informix DBMS는 객체지향기술을 접목하여 Image, Audio, Video, TimeSeries 등 비정형 Data의 탁월한 통합처리를 보장하며 OLTP에서부터 DataWare Housing, Data Marts, Internet / Intranet / Extranet, GIS, Entertainment산업에 이르는 모든 Application을 지원하는 시스템이다.


    Informix 홈페이지 (http://www.informix.com/

    ⑥ Microsoft Access

     마이크로소프트의 대표적인 개인용 데이터베이스 관리 시스템이다. Office 프로그램에 제공되며, 비주얼 베이직에서 기본적으로 활용하는 데이터베이스이다. MDB라는 확장자를 가지고 저장되며, 윈도우에만 사용이 가능하다.

    728x90
    728x90

    오라클의 adump, bdump, udump, 리스너 로그, 아카이브 로그 등을 백업할 수 있으면 백업하는 것을 권장한다. 하지만 대부분의 경우 백업의 필요성이 절실하지 않기 때문에 삭제한다.

     

    각종 로그의 자동관리를 위하여 첨부한 파일과 같이 CRONTAB에 등록하여 관리하면 편리하다.
    각각의 로그관리에 대한 정책이 필요하다.

    정책 예시)
    1. alert 로그       : 월별로 로그를 관리. 영구 보관하는 것이 좋다.
                          compress 명령으로 압축하여 보관.
    2. adump audit 파일 : 180일 정도 유지, 매일 180일이 지난 trc파일을 삭제
    3. bdump trace 파일 : 90일 정도 유지, 매일 90일이 지난 trc파일을 삭제
    4. udump trace 파일 : 90일 정도 유지, 매일 90일이 지난 trc파일을 삭제
    5. 리스너 로그      : 리스너를 로깅하도록 설정했을 경우 월별로 로그를 관리.

                          180일이 지난 파일은 삭제.
                          compress 명령으로 압축하여 보관.
    6. 아카이브로그 파일 : 기본적으로 1주일에 1번 이상 FULL BACKUP을 받을 경우
       백업 툴에서 아카이브로그를 관리해 주지 않을 경우 등록하여 사용
       7일전 아카이브로그 파일 삭제.

    쉘 예시) 쉘 스크립트 작성 시 오타에 주의할 것
    #######################################################
    #### alert.log                                     ####
    #######################################################
    nDate=`date +%Y%m%d`
    cp $ORACLE_BASE/admin/TESTDB/bdump/alert_TESTDB.log $ORACLE_BASE/TESTDB/bdump/alert_TESTDB.log.$nDate
    cat /dev/null > $ORACLE_BASE/admin/TESTDB/bdump/alert_TESTDB.log
    compress -vf $ORACLE_BASE/TESTDB/bdump/alert_TESTDB.log.$nDate

     

    #######################################################
    #### listener.log                                  ####
    #######################################################
    nDate=`date +%Y%m%d`
    cp $ORACLE_HOME/network/admin/listener.log $ORACLE_HOME/network/admin/listener.log.$nDate
    cat /dev/null > $ORACLE_HOME/network/admin/listener.log
    compress -vf $ORACLE_HOME/network/admin/listener.log.$nDate

     

    #######################################################
    #### audit                                         ####

    #######################################################
    # 1주일이 지난 *.aud를 찾아 삭제
    find $ORACLE_BASE/admin/TESTDB/adump \( -ctime +7 -name '*.aud' \) -exec rm -f {} \;

     

    #######################################################
    #### .trc                                          ####
    # 30일이 지난 *.trc를 찾아 삭제                    ####
    #######################################################
    find $ORACLE_BASE/admin/TESTDB/bdump \( -ctime +30 -name '*.trc' \) -exec rm -f {} \;
    find $ORACLE_BASE/admin/TESTDB/udump \( -ctime +30 -name '*.trc' \) -exec rm -f {} \;

     

    #######################################################
    #### archive log                                   ####
    #######################################################
    # 3일이 지난 *.arc를 찾아 삭제
    find /archive_log \( -ctime +3 -name '*.arc' \) -exec rm -f {} \;

     

    #########################################################
    # 특정 디렉토리가 70%이상이면 3일지난 *.arc를 찾아 삭제 #
    #########################################################
    #!/usr/bin/ksh
    A=`df -k /archive_log | grep -v "용량" | awk '{print $5}' | sed 's/%//'`
    if [ $A > 70 ] ;
    then
        find /archive_log \( -ctime +3 -name '*.arc' \) -exec rm -f {} \;
    fi

    728x90
    728x90

    Oracle 에서 Informix 로 Porting 하는 가이드

    A Discussion of the Application Porting Issues
    Informix Dynamic Server Version 7.3x

    CHAP 1. 소개

    CHAP 2. DDL

    2.1 식별자(Identifiers)

    식별자는 데이터베이스, 테이블, 컬럼, 인덱스, 뷰, 프로시저 등의 데이터베이스 오브젝트를 나타내는 이름이다.

    2.2 데이터베이스 (Databases)

    ※ ANSI 데이터베이스의 특징
    트랜잭션이 암시적(implicitly)으로 정의되므로 begin work 문장이 필요없이 모든 문장이 트랜잭션안에 들어간다.
    데이터베이스의 모든 오브젝트는 소유자(owner)의 이름을 필요로 한다.
    Grant to public 개념이 없으므로 각각의 사용자에게 권한을 부여해야 한다.

    2.3 테이블 (Tables)

    ※ constraint 정의 구문 예제

    ※ Informix의 alter table 구문은 좀 더 풍부한 기능을 제공한다
    - 컬럼 추가 및 삭제, 컬럼명 변경, next size변경, lock mode변경 등

    2.4 자료형 (Data types)

    ※ NULL , 공백 문자열
    오라클의 빈(empty) varchar 컬럼은 null로 간주한다.
    공백이 들어간 문자열의 비교에서 오라클을 공백을 문자열 간주하고 인포믹스는 공백을 무시한다, 즉 오라클은 "abc" != "abc " 이고, 인포믹스는 "abc" = "abc " 이다.

    2.5시퀀스 (Sequences)

    2.6 인덱스 (Indexes)

    2.7 뷰 (Views)

    2.8 스토어드 프로시저 (Stored Procedures)

    2.9 오라클 확장형 (oracle extensions)

    CHAP 3. DML

    3.1 SQL

    3.1.1 selects
    데이터를 읽어오는데 가장 적합한 방법을 옵티마이저가 어떻게 결정하느냐에 의해 질의가 실행 된다. 오라클과 인포믹스 7.3버전 이후 서버는 select문에서 옵티마이저 힌트를 사용할 수 있다.

    3.1.2 Optimizer Directives
    인포믹스 7.3이후 부터 오라클과 흡사한 옵티마이저 지시자(directives)를 제공한다.
    질의가 수행될 때의 첫번째단계는 질의에 대한 최적화 경로를 찾아 컴파일하고 두번째 단계로 결과값을 출력한다.

    인포믹스의 옵티마이저 지시자는 오라클의 옵티마이저 힌트와 구문과 동작에서 호환성이 있다.
    지시자는 '+'기호가 따라오는 주석(comment)안에서 사용된다.
    예)
    select {+ ORDERED AVOID FULL(e)} * from employee e, department d 
    where e.dept_no = d.dept_no;

    오라클의 직접적인 힌트외에 인포믹스는 유일하게 negative directives 의 개념을 제공한다. 즉, 옵티마이저가 피하는 (avoid) 최적화 방법을 지시할 수 있다. 또한 set explain 의 출력결과에서 옵티마이저 지시자에 대한 모든 정보를 알 수 있어 지시어의 의미 또는 구문 에러를 표시할 수 있다.

    옵티마이저 지시자는 다음과 같은 최적화 프로세스를 제어할 수 있다
    · Access methods: 인덱스 또는 전체 스캔.
    · Join Methods: hash join 또는 nested loop joins.
    · Join Order: 지정한 테이블 순서에 의해 join
    · Goal: first rows 또는 all rows (최초 응답시간 대 전체 산출 결과).

    3.1.3 Inserts
    INSERT INTO…SELECT 구문을 사용할 때 인포믹스는 select절에 union 을 사용할 수 없고, INSERT INTO…VALUES 에서 수식이나 select절을 사용할 수 없다. 이러한 경우 select에 대한 결과를 INTO TEMP 절을 사용하여 임시테이블을 생성하고, INSERT INTO…SELECT 절 구문을 임시테이블로 부터 읽어와서 입력하도록 재작성해야한다.

    3.1.4 Deletes

    오라클의 DELETE table_name 구문은 DELETE FROM table_name 구문으로 고쳐야한다

    3.1.5 Temporary Tables
    인포믹스와 오라클의 temporary table은 개념에 있어서 많이 다르다. 
    오라클의 temporary table은 하나의 필드를 포함하는 배열과 같이 구현되어 있다.
    인포믹스의 temporary table은 일반 테이블과 동일하게 구현되어 생성, 변경, 삭제 등의 작업을 할 수 있지만, 세션안에서만 유효하다.

    3.1.6 Joins
    오라클의 outer join 구문 + (조인 테이블의 컬럼에 부합하지 않는 값을 가진 컬럼의 뒤에 붙는다) 는 인포믹스의 OUTER 구문과 동일하다. OUTER 키워드는 테이블명 앞에 붙는다. 오라클과는 달리 괄호로 그룹화되어 복합(multiple) outer join을 허용한다.

    오라클의 INTERSECT와 MINUS 오퍼레이터는 UNION과 비슷하다. INTERSECT는 인포믹스에서 WHERE EXISTS 나 WHERE … IN으로 교체할 수 있고, MINUS는 WHERE NOT EXISTS 또는 WHERE … NOT IN으로 교체할 수 있다.

    인포믹스의 UNION은 대응되는 select 리스트의 자료형이 일치해야한다. 
    만약 그렇지 않을 경우 컬럼 리스트를 변경하거나 자료형을 바꿔야한다.

    3.1.7 Order by, Group by
    인포믹스에서는 ORDER BY절 또는 GROUP BY절에 사용하는 컬럼 리스트가 반드시 select리스트에 나타나야 한다.

    3.1.8 Sorts
    오라클에서의 NULL값을 가장 높은 값이고 인포믹스에서는 가장 낮은 값이다. 
    그러므로 오름차순으로 정렬을 할 경우 인포믹스에서는 NULL값이 먼저 출력된다.
    이를 오라클과 동일한 순서로 변형시키기 위해서는 NULL값을 가장 높은 값으로 만들어 정렬할 수 있도록 stored procedure를 작성하고, 정렬이 끝나고 출력될 때 다시 NULL으로 교체하도록 하여야 한다.

    3.1.9 Exceptions
    하드 코딩된 오라클의 에러코드 값은 인포믹스의 에러 코드 값으로 교체해야한다.

    3.1.10 Correlation Names
    UPDATE나 DELETE의 메인 테이블에 대해 correlation name을 사용할 수 없다.

    3.1.11 Aliases
    테이블에 alias 를 주면 원본 테이블명을 select 리스트나 where절에서 사용할 수 없다.

    3.1.12 Hierarchical Queries
    인포믹스는 B-트리 형태의 계층적으로 구성된 질의 결과를 만들지 않는다.
    오라클은 START WITH 와 CONNECT BY PRIOR 절을 사용하여 구현한다.
    START WITH 는 루트 노드의 행을 지정하고, CONNECT BY에서 부모 노드와 자식 노드의 관계를 서술 한다. 이때 PRIOR 수식을 가장 먼저 확인한다.

    다음 예는 JOB이 PRESIDENT인 직원을 루트 노드로 하여 그 아래 모든 하위 노드를 출력하는 질의어이다.

    SELECT ename, empno,
                  mgr, job 
    FROM emp 
    START WITH 
    job = 'PRESIDENT' 
    CONNECT BY PRIOR 
    empno = mgr
    

    오른쪽 테이블은 위의 질의 결과를 도식화하여 나타낸 것이다. 위와 같은 기능을 인포믹스에서 사용하려면 stored procedure나 function을 작성하여 cursor 또는 array를이용해야 한다. 인포믹스의 global array가 도움이 될 것이다.

    3.2 호스트 변수 (Host Variables)

    데이터 형에 따라 호스트 변수의 포맷을 변경할 필요가 있을 수 있다. 
    예를 들어 number나 date같은 자료형은 인포믹스에서 동일한 포맷으로 지원되지 않으므로 SQL문장안에서 포맷을 정의하는 절차를 거쳐야 한다.

    예를들어 오라클 함수 TO_CHAR는 날짜와 숫자 값의 포맷을 사용한다. 
    비슷한 방식으로 인포믹스는 7.3 버전 이후 TO_DATE와 TO_CHAR 함수를 추가하였다. 
    또한 ESQL/C에서는 오라클의 날짜 포맷에 대응하여 인포믹스 날짜 포맷을 출력하는 ifx_to_gl_datetime() 함수를 가지고 있다.

    위의 경우 포맷은 인포믹스에서 제공하는 값을 사용해야하며 오라클의 모든 포맷을 반 드시 포함하고 있는것은 아니다.

    3.3 날짜 및 시간 함수 (Date and Time Functions )

    현재 날짜를 처리하기 위하여 오라클은 SYSDATE를 사용하는데, 인포믹스에서는 다음과 같이 자료형에 따라 다르게 표현한다.

    SQL문으로 현재 시스템 날짜를 얻기 위하여 SELECT DISTINCT TODAY FROM SYSTABLES 
    와 같이 사용한다. 또한 ESQL/COBOL의 ECO_TDY()함수나 ESQL/C의 rfmtdate()함수에서도 제공된다.

    인포믹스의 날짜 처리 형태로 변환해야할 오라클 함수

    · ADD_MONTHS(date,months), 
    · LAST_DAY(date)
    · MONTHS_BETWEEN(date1, date2)
    · NEW_TIME(date,current_timezone,new_timezone)
    · NEXT_DAY(date,char)
    · ROUND(date,format)
    · SYSDATE
    · TRUNC(date,format)

    오라클의 TO_CHAR, TO_NUMBER, TO_DATE 함수에 대한 포맷은 다음 표를 참조한다.

    3.3.1 number format

    3.3.2 date format

    3.3.3 RR format
    RR 포맷을 YY 포맷과 유사하지만 서로 다른 세기(century)의 날짜값을 구분하기 위하여 사용한다

    3.4 집계 함수 (Aggregagte Functions )

    3.5 수학 함수 (Mathematical Functions )

    인포믹스는 오라클의 수학함수 CEIL, FLOOR, SIGN, COSH, SINH, TANH를 지원하지 않는다. ROUND함수에서 round factor -32 에서 32까지의 값을 사용할 수 있다.

    3.6 스트링 함수 (String Functions)

    3.7 기타 오라클 함수

    인포믹스는 다음과 같은 오라클 함수를 지원하지 않는다.

    · CHARTOROWID 
    · CONVERT
    · DUMP 
    · GREATEST 
    · GREATEST_LB 
    · HEXTORAW 
    · LEAST 
    · LEAST_UB 
    · RAWTOHEX 
    · ROWIDTOCHAR 
    · TO_LABEL 
    · TO_MULTI_BYTE 
    · TO_SINGLE_BYTE 
    · UID 
    · USER 
    · USERENV(OSDBA/ LABEL/ LANGUAGE/ TERMINAL/ SESSIONID/ ENTRYID) 
    · VSIZE

    3.8 매크로(Macros)

    인포믹스는 오라클의 macro를 지원하지 않으므로 코드에서 제거해야하고 관련된 로직은 인포믹스에서 동일하게 구현될 수 있다.

    3.9 Pseudo-Columns

    Pseudo-columns 은 테이블에는 존재하지만 SELECT * FROM table_name 과 같은 질의에서는 나타나지 않는 컬럼이다. 인포믹스에서 pseudo-column은 일반적으로 DBMS엔진에 의해 사용되므로 이러한 컬럼을 어플리케이션에서 직접적으로 사용하지 않는것이 향후 어플리케이션 이식성이나 어플리케이션 변경에 도움이 된다.

    3.9.1 LEVEL 
    오라클에서 hierarchical query를 할때 pseudo-column LEVEL 은 루트노드에 대하여 1을 리턴하고 그 루트노드의 자식 노드는 2를 노드 2가 부모인 자식 노드는 3을 등등.. 이러한 형태로 출력된다. 
    질의에서 hierarchical 관계를 정의하려면 START WITH CONNECT BY 문을 사용한다. 
    인포믹스는 hierarchical 질의를 지원하지 않으므로 LEVEL 컬럼을 사용하지 않는다.

    3.9.2 ROWID 
    오라클의 ROWID 컬럼은 각 데이터 행의 주소를 나타낸다. 
    출력되는 ROWID는 다음과 같은 정보를 가지고 있다.

    · 데이터파일에서 데이터 블럭의 정보 
    · 데이터블럭에서의 행의 정보 (첫번째 행이 0) 
    · 데이터파일 정보 (첫번째 파일이 1)

    대부분 데이터베이스에서 한 행을 나타내는 ROWID는 유일한 값을 가지지만 서로 다른 테이블에서 동일한 클러스터안에 저장된 행은 동일한 ROWID를 가진다. 
    ROWID 컬럼의 값은 오라클의 ROWID 자료형으로 저장된다.

    ROWID는 새로 지워지고 새로 입력되면 새로운 값이 할당되므로 이 컬럼을 테이블의 primary key로 사용하지 말아야 한다. 또, ROWID 컬럼값은 입력,수정,삭제 될 수 없다.

    SELECT ROWID, ename 
    FROM emp 
    WHERE deptno = 20
    

    오라클의 ROWID는 인포믹스의 ROWID와 거의 동일하게 동작한다. 하지만 저장되는 
    자료형은 서로 다르다.

    3.9.3 ROWNUM 
    오라클에서 ROWNUM 컬럼값은 선택된 결과 레코드의 순서를 나타낸다. 
    다음과 같은 질의는 첫번째 9개 행을 출력한다.

    SELECT * FROM emp WHERE ROWNUM < 10

    이런 ROWNUM을 이용하여 테이블의 각 행에 유일한 값을 할당할 수 있다.

    UPDATE tabx SET col1 = ROWNUM

    오라클은 각 행을 읽어온후 ROWNUM을 할당하고 ORDER BY절에 의해 정렬되므로 ORDER BY에 의한 순서와 ROWNUM 순서가 다를 수 있다. 그러나 ORDER BY절에 사용되는 컬럼이 인덱스를 사용한다면 순서가 같아진다. 다음과 같은 질의는 아무런 행도 리턴하지 않는다.

    SELECT * FROM employee WHERE ROWNUM > 1

    첫번째 행을 가져와서 ROWNUM을 1로 할당하므로 조건에 맞지 않아 출력되지 않는다. 
    두번째 행이 출력되기 위해서는 ROWNUM이 1로 다시 할당되는 이때도 조건에 맞지 않기 때문에 출력되지 않고 이후의 모든 행이 마찬가지 상태가 된다.

    인포믹스는 ROWNU과 동일한 컬럼을 가지고 있지는 않지만 FIRST N 구문을 이용하여 구현할 수 있다.

    인포믹스는 다음과 같은 복합적인 경우에는 사용할 수 없다.

    · subqueries 
    · into temp 문 
    · view 정의 
    · stored procedure 
    · union 질의

    ORDER BY 없이 FIRST N구문을 사용하면 의미없는 순서로 데이터가 출력될 것이다.

    /* 월급이 가장 많은 10명을 출력 */ 
    SELECT FIRST 10 name, salary FROM emp ORDER BY salary; 
    /* 10개의 최고 월급 출력 */ 
    SELECT FIRST 10 DISTINCT salary FROM emp ORDER BY salary;

    인포믹스 7.3은 "FIRST"란 이름으로 컬럼명을 사용할 수 있다. 따라서 "FIRST" 뒤에 양의 정수가 따라 오지 않는 경우는 테이블의 컬럼명으로 생각한다. 
    N값은 1에서 231 - 1 까지 사용할 수 있다.

    UPDATE tabx SET col1 = ROWNUM

    위와 같은 오라클의 ROWNUM을 할당하는 구문의 경우 ESQL/C 로 아래와 같이 구현한다.

    int counter = 0;
    EXEC SQL declare c1 cursor for
    	SELECT col1, col2 
    	  INTO :col1, :col2 
    	  FROM table 1 
    	 WHERE col1 = "XX";
    EXEC SQL open c1;
    while (SQLCODE == 0) {
    	EXEC SQL fetch c1;
    	counter++;  /* Increment counter for each row fetched */
    	if (counter >= 5)	{
    		break;
    		/* logic... */
    	}  /* End if */
    }  /* End while */

    3.10 커서를 이용한 수정 (Update Using Cursors )

    인포믹스와 오라클의 커서는 약간의 차이가 있다. 
    오라클과는 달리 인포믹스에서는 FOR UPDATE 커서가 여러 테이블을 조인하는 경우에는 사용할 수 없으므로 WHER CURRENT OF 문장을 테이블 조인상태에서 사용할 수 없다. 
    따라서 테이블을 조인해야할 경우는 동일한 커서 루프에서 WHERE CURRENT OF 문장을 제거하고 UPDATE문장을 분리하여야 한다.

    인포믹스에서 commit 또는 rollback 문은 트랜잭션안에서오픈된 모든 커서를 닫는다. 
    커서를 닫지 않고 commit 또는 rollback을 실행하여야 할 경우 HOLD 커서를 선언할 수 있다. 그러나 HOLD커서는 FOR UPDATE 문에서 사용될 수 없다. 
    따라서 오라클에서 fetch 루프안에서 업데이트하거나 commit하는 어플리케이션은 인포믹스의 형태로 변환해야한다. 커서는 HOLD를 사용하여 선언하고 업데이트 문장은 WHERE CURRENT OF 문장 없이 사용한다. WHERE CURRENT OF 문장의 의미를 나타내기 위하여

    WHERE ROWID = fetch된 rowid값 또는 
    WHERE primary key 컬럼 = fetch된 primary key 컬럼값

    형태로 작성한다.

    오라클의 트랜잭션 내의 fetch 루프를 구현하기 위하여 BEGIN WORK 문장이 COMMIT WORK 나 ROLLBACK WORK 문장에 바로 따라 올 수 있도록 한다.

    3.11 시스템 테이블(System Tables )

    오라클의 시스템 테이블 참조는 이에 대응되는 인포믹스의 시스템 카타로그 테이블 차조로 교체할 수 있다.

    3.12 스토어드 프로시저 (Stored Procedures)

    3.12.1 Size 
    인포믹스의 stored procedure는 대략 64K의 한계가 있다. 
    오라클의 64K가 넘는 procedure는 좀더 작은 단위로 쪼개고 필요한 매개변수와 리턴값을 서로 주고 받을 수 있도록 한다.

    3.12.2 Packages 
    오라클의 stored function과 stored procedure는 인포믹스의 stored procedure로 교체할 수 있다. 그러나Package body는 stored procedure와 stored function의 그룹을 포함하고 있고 package는 stored procedure와 stored function의 리스트를 가지고 있다. 
    모든 package body는 인포믹스의 개별적인 stored procedure로 재작성해야 하고 package 레벨의 변수는 인포믹스의 global 변수로 대응시켜야 한다.

    3.12.3 Exceptions
    오라클은 CURSOR_ALREADY_OPEN, NO_DATA_FOUND, ZERO_DIVIDE 등과 같이 미리 정의되거나 사용자 정의된 exception label을 가지고 있다. 
    EXCEPTION 구조를 사용한 BEGIN/END 블럭에서 하나의 exception 만 허용되고 보통 END 문 바로 앞에 EXCEPTION 처리문이 위치 한다.

    인포믹스 또한 미리 정의되거나 사용자가 정의한 exception을 지원하지만 표현 방식이 label형태가 아니고 숫자로 나타난다. 모든 exception은 stored procedure의 control block에서 체크되고, 각 control block의 상단부에 EXCEPTION문으로 명시적으로 선언해야한다.

    오라클에서는 exception 처리가 global하게 처리된다. 
    인포믹스에서는 블럭단위로 exception처리가 제한된다.

    3.12.4 Error Handling 
    SQLCA 구조체는 stored procedure에서 완벽하게 지원하지 않는다. SQLCODE 변수 체크는 불가능하다. 대신 DBINFO 함수를 사용해 sqlca.sqlerrd1과 sqlca.sqlerrd2 값을 추출해 낼 수 있다. 이 함수는 커서가 열린FOREACH 문안에서 사용될 수 있다.

    3.12.5 Cursors
    오라클의 global 커서는 인포믹스에서 temporary 테이블을 통하여 구현한다.
    오라클 procedure에서는 커서를 명시적으로 선언하고 오픈하지만 인포믹스에서는 procedure안에서 명시적으로 커서를 선언할 필요 없다. 따라서 오라클의 procedure 커서는 인포믹스의 FOREACH 구조로 변환할 수 있다.

    3.12.6 Flow Control
    오라클에서는 GOTO 와 EXIT 

    3.12.7 Variable Declaration and Assignment
    오라클은 FOR 루프안에서 암시적(implicit) 변수 선언이 가능하다.

    Out_customer_name := customer.name;

    위의 out_customer_name은 customer테이블의 name 컬럼과 동일한 자료형을 가진다

    인포믹스는 각각의 control block 상단에 모든 변수를 선언해야한다.

    DEFINE out_customer_name LIKE customer.name;
    DEFINE counter INTEGER;

    따라서 오라클의 암시적 변수 선언은 인포믹스에서 control block 앞에 명시적(explicit) 변수 선언으로, 오라클의 할당 연산자 := 은 LET 키워드와 등호(=) 표시로 교체해야 한다.

    3.12.8 Boolean
    오라클의 BOOLEAN 자료형 변수는 char(1) 또는 정수형의 변수로 교체하고 프로그램적으로 제어하도록 한다.

    3.12.9 Binary Data Types
    오라클에서 binary형은 RAW로 사용하고 선언부에서 명시적으로 최대 길이를 정의한다. 
    인포믹스에서는 REFERENCES BYTE 로 선언하고 단지 BLOB에 대한 포인터만을 관리한다.

    3.12.10 Dynamic SQL
    인포믹스에서는 procedure안에서 dynamic SQL을 지원하지 않는다. 이러한 종류의 처리는 ESQL/C 프로그램을 통하여 구현할 수 있다.

    3.12.11 Compiler
    오라클과는 달리 인포믹스의 procedure 컴파일러는 데이터베이스와 독립적으로 procedure를 생성할 수 있도록 하므로 컴파일단계에서는 에러가 상대적으로 적고 메시지가 상세하지 않지만 실행단계에서 데이터베이스 오브젝트의 유효 여부를 판단한다.

    3.13 트리거 (Triggers)
    오라클은 하나의 트리거에서 동시에 여러 이벤트 (insert, update, delete 등)를 처리할 수 있다. 
    인포믹스는 하나의 트리거에서는 오직 하나의 이벤트만을 처리한다.

    인포믹스는 오라클에 없는 몇가지 constraint를 제공하는데, EXECUTE PROCEDURE … INTO 구문을 사용하여 트리거가 insert나 update 이벤트 발생시 단지 한 행이나 한 컬럼에 대해서만 영향을 미치도록 할 수 있다.

    인포믹스 7.3 이전에는 INSERT나 UPDATE 이벤트나 발생했을 때 트리거를 발생시키는 컬럼에 변경을 줄 수 없었다. 인포믹스 7.3버전 이후 reentrant UPDATE / INSERT 트리거의 기능이 EXECUTE PROCEDURE … INTO 구문을 통해 가능해졌고 이러한 기능으로 동일한 트리거 또는 다른 트리거를 cascade 하게 부르지 못하게 할 수 있다.

    다음 예는 reentrant UPDATE / INSERT 트리거의 예이다.

    create table foo (
          x int default NULL,
          y int default NULL,
          z int default NULL
    );
    create procedure reentrant()
    	returning int;
    	return 56;
    end procedure;
    create trigger reentrant_trigger insert on foo for each row (
    execute procedure reentrant() into z
    );
    insert into foo values (1, 2, 3);
    select * from foo;
    x           y           z
    1           2          56

    오라클에서는 트리거의 본문에 SQL문과 stored procedure, 그리고 logical statement를 사용할 수 있다. 인포믹스는 stored procedure와 SQL문만이 가능하므로 logical statement는 procedure 안으로 옮겨 넣어야 한다.

    3.14 Constraints
    오라클과 인포믹스는 트랜잭션 안에서 constraint를 enable 또는 disable 시킬 수 있다. 차이점이 있다면 오라클 어플리케이션은 항상 트랜잭션을 사용하고 있고 인포믹스는 명시적으로 지정한 위치에서 트랜잭션을 사용하도록 되어 있다.
    다음 constraint 구문은 인포믹스에서 사용가능하다

    SET {CONSTRAINTS/INDEXES/TRIGGERS} FOR table_name {ENABLED/DISABLED}
    SET CONSTRAINTS comma_separated_constraint_names {ENABLED/DISABLED}
    SET INDEXES comma_separated_index_names {ENABLED/DISABLED}
    SET TRIGGERS comma_triggers_constraint_names {ENABLED/DISABLED}
    SET CONSTRAINTS {ALL/constraint_name} {IMMEDIATE/DEFERRED}

    마지막 문장은 DBA권한이 없는 일반 사용자가 사용할 수 있는데, DEFERRED절을 사용하면 모든 constraint 위반 사항을 트랜잭션이 commit되거나 rollback되는 시점에 검사한다.

    3.15 DUAL TABLE
    오라클의 DUAL 테이블은 dummy 컬럼을 한 행 가지고 있는 시스템 테이블이다.
    주로 다음과 같은 경우에 사용된다.

    어떠한 상수값을 가져와서 호스트 변수에 저장할 때

    SELECT TO_CHAR(SYSDATE) INTO :date_var FROM DUAL;

    어떠한 변수값을 다른 변수에 할당할 때

    SELECT TO_CHAR(SYSDATE) INTO :date_var FROM DUAL;

    호스트 변수값과 일반 질의의 결과를 union할 때

    SELECT col1, col2, col3 FROM table_name
    UNION
    SELECT :host_var1, :host_var2, :host_var3 FROM DUAL;

    DUAL 테이블을 변환하는 방법은 DUAL 테이블의 용도에 따라 여러 방법이 있다.
    단지 상수값을 할당하는 문장은 인포믹스의 변수값 할당 문장으로 교체할 수 있고 좀 더 복잡하게 사용하는 경우 DUAL 이란 이름으로 temporary 테이블을 만들어 사용할 수 있다.

    CHAP 4. Embedded SQL

    오라클의 embedded SQL 제품은 Pro*C, Pro*COBOL 이고 이와 관련된 인포믹스 제품은 ESQL/C, ESQL/COBOL이다.

    4.1 호스트 변수 (Host Variables)

    4.1.1 Declaration Override

    4.1.2 Arrays
    오라클에서는 배열 변수에 값을 할당하기 위하여 SQL문의 루프에서 배열처리를 할 필요가 없지만 인포믹스에서는 fetch 루프가 필요하다.

    4.1.3 Formatting 
    인포믹스에서 DECIMAL, MONEY, DATE, 또는 DATETIME 값을 읽어 호스트 변수에 넣을 때 출력할 포맷을 지정하는 과정을 거친다.

    …
    dec_t	dec_host_var;
    char	formatted_dec[40];
    EXEC SQL SELECT DEC_COLUMN INTO :dec_host_var FROM TABLE_NAME;
    rfmtdec(&dec_host_var, "&&&&&&&.&&&", formatted_dec);
    printf("The Decimal Value is %s\n", formatted_dec);
    …

    4.2 SQL구조체 (SQL Structures)

    4.2.1 SQLCA

    오라클 에러 메시지를 얻기 위하여 대개 SQLCA요소 중 SQLERRMC를 이용한다. 인포믹스에는 SQLERRM은 같은 기능을 하고HP와 Solaris에서는 SQLERRM대신rgetmsg 함수를 사용할 수도 있다.

    4.2.2 SQLDA
    오라클의 SQLDA구조는 인포믹스와 상당히 많이 다르다. 오라클의 SSQLALD 함수는 인포믹스의 ALLOCATE DESCRIPTOR문으로 변경되야 하는 등 많은 부분 변경이 필요하다.

    만약 오라클 어플리케이션이 SQLDA 구조체를 직접 사용하지 않고 simple dynamic SQL 메소드를 사용했다면 indicators/placehoder는 인포믹스에서 '?로 교체할 수 있다.

    4.2.3 ORACA
    오라클의 ORACA구조체는 인포믹스에서 지원하지 않는다. 이 구조체는 오라클에서만 특정부분 사용되므로 어플리케이션에서 제거하여야 한다.

    4.3 Pre-Compiler Options

    어플리케이션에서 EXEC ORACLE OPTION문으로 시작되는 오라클 옵션은 제거한다. 이 문장은 성능과 관련될 수 있는 내용이므로 어플리케이션 로직에 영향을 미치지 않는다.

    4.4 Embedded PL/SQL

    오라클에서는Pro*C나 Pro*COBOL 코드 안에 프로시저 PL/SQL을 EXEC SQL EXECUTE와 END-EXEC 문 사이에서 포함할 수 있다. 인포믹스에서는 이러한 블럭을 동일한 기능을 하는 ESQL/C나 ESQL/COBOL코드로 변환해야 한다.

    4.5 ODBC

    Oracle Call Interface(OCI)를 사용하여 작성된 어플리케이션은 인포믹스의 Call Level Interface (CLI)로 재 작성해야 한다.

    4.5.1 Database Library Calls
    오라클의 OCI와 인포믹스 CLI의 가장 큰 차이점은 전체적인 데이터구조와 데이터베이스 라이브러리 호출을 처리하는데 사용되는 메카니즘이다.
    오라클은 데이터베이스 서버로 direct connection을 사용하고 인포믹스는 ODBC connection을 사용한다.

    4.5.2 Global Area Processing
    또다른 차이점으로 세개의 global 영역을 가리키는 pointer 사용에 있다.
    오라클이 사용하고 있는HAD (Handle Data Area), LDA (Logon Data Area), CDA (Cursor Data Area 포인터는 인포믹스에서HENV (Environment Area), HDBC (Database Connection Area), HSTMT (Statement Area) 포인터로 변환해야 한다.

    4.5.3 Fetch cycle
    오라클의 fetch cycle은 커서 데이터 영역안에서parsing, binding, defining, fetching executing 단계를 거치는데, 인포믹스는 "for each" 안에서 preparing, binding, executing, binding, fetching 단계를 가진다.

    4.5.4 Raw Binary Data Type Processing
    오라클의 RAW 바이너리 자료형은 pointer-to-BLOB REFERENCES BYTE 형으로 고쳐야 한다.

    4.5.5 Parameter Binding
    오라클에서 파라매터의 muliple output binding은 ODEFIN() 호출에서 OUTPUT 형으로 선언된다. 인포믹스에서는 SQLBindCol() 호출로 변환한다.
    오라클과 인포믹스에서 input/output binding에 차이가 있는데, 오라클에서는 ODEFIN() 호출안에서 INPUT/OUTPUT 형으로 선언한다. 인포믹스에서는A=B, B=C, C=A 처럼 세개의 변수를 사용하여 라운드로빈 형태로 접근한다.

    4.6 Embedded SQL for C

    4.6.1 VARCHAR
    오라클 Pro*C의 VARCHAR 자료형은 프리컴파일 이후 두 개의 요소, 즉 unsigned short len 과 unsigned char arr[size]로 나뉘어진다. 
    인포믹스에서는 VARCHAR 형은 C의 CHAR와 동일하다.

    4.6.2 Host Variables
    오라클의 EXEC SQL TYPE은 C언어의 typedef 와 같다.

    4.7 Embedded SQL for COBOL

    4.7.1 VARCHAR
    Pro*COBOL의 VARYING 절은 프리컴파일 이후 variable-name-LEN PIC S9(4) COMP 와 variable-name-ARR PIC X(size)로 확장된다. 
    인포믹스에서는 이러한 개념을 지원하지 않으므로 variable-name-LEN 은 모두 제거하고variable-name-ARR 은 variable-name 으로 수정하며VARYING 절도 제거해야 한다.

    4.7.2 Level 88
    인포믹스 ESQL/COBOL 7.2 이후 부터 호스트 변수 선언부안에서 COBOL level 88의 기능을 지원한다

    4.7.3 SQLDA
    ESQL/COBOL 에서는 SQLDA 구조체가 허용 되지 않는다. SQLDA 데이터를 다루기 위해서는 ALLOCATE DESCRIPTOR, DESCRIBE, GET DESCRIPTOR, SET DESCRIPTOR 같은 인포믹스 매크로를 사용해야 한다.

    4.7.4 REDEFINDES
    인포믹스 ESQL/COBOL 7.2 이후 부터 REDEFINES 구문을 지원한다.

    4.7.5 Tips
    프리컴파일 할 때IF [ELSE IF … ] END-IF 또는 EVALUATE END-EVALUATE 또는 PERFORM END-PERFORM 블럭안에서 SQL문장을 만나면 SQL 문장뒤에 마침표가 있는지 상관하지 않고 생성된 COBOL 문장뒤에 마침표(period)를 찍는다. 이러한 동작은 COBOL 규칙에 어긋나 구문에러를 발생시킨다. 이런 문제를 피하기 위해 각각의 SQL 문장은 새로운 문단으로 이동시켜서 그룹화 한 뒤 수행되도록 한다.

    CHAP 5. Application Architecture

    5.1 트랜잭션 처리 (Transaction Processing)

    다음 예에서ws-dbenviron 은 데이터베이스 이름, ws-connect-nm 은 사용자 이름ws-identity-nm 은 패스워드enp 와 connection-name 은 연결(connection) 이름이다.

    5.1.1 Simple Connect

    5.1.2 Named Connect with Literal

    5.1.3 Named Connect 

    5.1.4 Savepoints 
    오라클은 PL/SQL안에서 savepoint는 허용한다. PL/SQL 블럭안에서 COMMIT 또는 ROLLBACK을 SAVEPOINT A, SAVEPOINT B.. 등으로 표시한 곳까지의 범위에 한정시킬 수 있다. 이러한 savepoint는 stored procedure와 같이 생각될 수 있는데, 전체 트랜잭션에 영향없이 호출한 procedure만 실행되던지(commit) 아니면 실패(rollback)될 수 있다. 
    인포믹스는 stored procedure 안에서 savepoint 기능을 지원하지 않는다.

    5.2 일관성 (Concurrency)

    5.3 사용자 인증 (User Authentication)

    CHAP 6. Environment

    6.1 스크립트 (Scripts)

    오라클에서는 '&'가 붙는 치환(substitution) 변수를 사용자 정의할 수 있다. 명령어 중에서 치환변수를 만나면 변수 자체가 아닌 변수에 값을 대입하여 실행하게 된다.
    이러한 치환변수는 SQL이나 SQL*Plus 명령 어느 곳에서도 사용될 수 있다.
    SQL*Plus에서 값이 정의 되지 않은 치환 변수를 만나면 값이 입력되기를 기다린다.
    인포믹스의 dbaccess는 이러한 기능을 제공하지는 않지만, 쉘 스크립트를 이용하여 변수 치환을 할 수 있다.

    위의 예제 스크립트에서는 decode 파일에 두가지 컬럼을 가진 행이 있는데,

    oldval newval

    다음과 같은 명령을 실행하여

    subvals.ksh decodefile chgfile

    chgfile 에 나타나는 oldval 을 newval 로 교체한다.
    이 쉘 스크립트는 standard output으로 기록하는데, 출력 결과는 redirect될 수 있다. 이렇게 redirect된 파일은 dbaccess의 입력 파일로 실행될 수 있다.

    6.2 유틸리티(Utilities)

    질의의 성능 향상을 위하여 EXPLAIN 유틸리티를 통해 SQL문의 어떻게 데이터베이스에 접근하는지 그 경로를 알 수 있다. 이 유틸리티는 SET EXPLAIN on 문장으로 시작하여 SET EXPLAIN OFF문장으로 종료하고 실행결과는 SQEXPLAIN.OUT파일에 저장된다.
    전체 시스템 성능은 onSTAT 유틸리티를 이용하여 모니터링 할 수 있다.

    6.3 시스템 카타로그 (System Catalog)

    인포믹스시스템 카타로그 테이블내의 모든 오브젝트는 소문자로 저장되고 소유자는 'informix' 이다. Systables 안에서 모든 테이블은 시스템에 의해 tabid가 부여 되고 이것은 다른 시스템 카타로그 테이블과 primary / foreign key로 사용된다.

    APPENDIX A. Planning Guide

    아래 체크리스트는 오라클 특성을 인포믹스로 얼마나 변환해야 할지 결정하기 위해 유용하게 사용 될 수 있다. 각 항목의 난이도 및 변환에 필요한 노력이 얼마나 필요한지는 1 에서 5단계로 표시된다.




    APPENDIX B. Syntax

    APPENDIX C. Database Concept

    APPENDIX D. ANSI Reserved Words

    APPENDIX E. Informix Logic

    E.1 CONCAT

    CREATE PROCEDURE concat (str1 VARCHAR(255), str2 VARCHAR(255)) 
    	RETURNING VARCHAR(255);
    	return str1 || str2;
    END PROCEDURE;

    E.2 INSTR

    E.3 LTRIM

    CREATE PROCEDURE ltrim (str VARCHAR(255), mask CHAR(1) DEFAULT ' ') 
    RETURNING VARCHAR(255);
      	IF str IS NULL THEN
        		RETURN NULL;
      	ELSE
        		RETURN TRIM(LEADING mask from str);
      	END IF;
    END PROCEDURE;

    E.4 RTRIM

    CREATE PROCEDURE rtrim (str VARCHAR(255), mask CHAR(1) DEFAULT ' ') 
    RETURNING VARCHAR(255);
      	IF str IS NULL THEN
       		RETURN NULL;
      	ELSE
        		RETURN TRIM(TRAILING mask from str);
      	END IF;
    END PROCEDURE;

    E.5 TO_CHAR (For Non-Date/Datetime

    CREATE PROCEDURE TO_CHAR(i INT)
    RETURNING VARCHAR(12);
    	RETURN I;
    END PROCEDURE;

    E.6 YYYYMMDD

    CREATE PROCEDURE yyyymmdd (str VARCHAR(10)) RETURNING varchar(8);
      	DEFINE retstr VARCHAR(8);
      	IF str IS NULL THEN
        		RETURN NULL;
      	ELSE
        		LET retstr = str[7,10] || str[1,2] || str[4,5];
        		RETURN retstr;
      	END IF;
    END PROCEDURE;

    제공 : DB포탈사이트 DBguide.net

    728x90

    'Informix > informix reference' 카테고리의 다른 글

    informix version 확인  (0) 2010.06.01
    ONBAR  (0) 2010.05.26
    테이블을 특정 시점으로 복구하는 기능  (0) 2010.05.24
    [TIP] embedding SQL in UNIX Script  (0) 2009.12.29
    DB size  (0) 2009.12.28
    728x90

    우선 게시판 성격에 맞지 않는 글을 올려서 죄송합니다. devel이나 튜토리얼쪽에는 쓰기권한이 없어서 정보를 공유하고자 여기에 올립니다.


    DB내의 쿼리를 쓰면서 Shell 에서도 유용하게 쓸 수 있는 Script 작성 방법을 알려드리고자 합니다. 다 아시다시피 Scipt는 컴파일 할 필요도 없고 어떤 시스템에서도 구동할 수 있다는 장점이 있어서 많은 시스템 관리자들이 유용하게 사용들을 하고 있죠. 이런 Script 내에서 SQL문을 삽입하여 사용을 할 수 있는 방법이 있습니다.


    다음의 4가지 예제를 통하여 확인해보시고 각자에 맞게 확장된 script를 만들어서 유용하게 사용하시기 바랍니다.

    아래의 예제는 informix의 가장 기본적인 sample인 stores_demo를 이용해서 만들어졌습니다.


    1. 직접입력(Redirecting input)


    #!/bin/sh

    dbaccess <<SQLSTMT

        database stores_demo;

        select customer_num, fname, lname, company from customer;

    SQLSTMT


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

    sql문을 실행함으로 결과값을 얻을 수 있는 간단한 shell 입니다. 여기서 보이고 있는 SQLSTNT는 단순한 입력 한자리 단어로 마음에 드는 것으로 바꾸어 사용해도 잘 실행이 됩니다. 주의할 점은 sql문 시작시와 끝날때 꼭 같이 넣어주어야 한다는 것입니다.



    2. 직접출력(redirecting output)


    #!/bin/sh


    dbaccess 2>error.log <<SQLSTMT

        database stores_demo;

        select customer_num, fname, lname, company from customer;

    SQLSTMT

    } | more


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

    error.log 라는 필드를 넣음으로 shell 실행 시 발생되는 messages를 저장할 수 도 있고 { } 를 사용한 이후 pipe를 이용하여 more 같은 unix의 다른 프로그램 사용도 가능합니다.



    3. Shell변수이용(Using Shell Variable)


    #!/bin/sh

    echo "Enter company name (use * for wildcard matches) to find"

    echo "Company : \c"

    read comp

    dbaccess 2>error.log <<SQLSTMT

        database stores_demo;

        select customer_num, fname, lname, company from customer

        where company matches "$comp";

    SQLSTMT


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

    Shell의 변수들을 이용하여 값을 얻어낼 수 도 있습니다. shell 상에서 comp에 값을 입력해주면 where 구문에서 변수값으로 받아 찾아낸 값을 출력해주는 방식입니다. 이런 정도만 사용하는 곳이라면 복잡하게 프로그램 짜거나 일일히 db에 접속하지 않고 단순히 shell만 돌려도 되겠죠?



    4. Unix 프로그램에 Shell을 이용해 얻어낸 Data 사용(Getting Data into Shell Variables)


    #!/bin/sh 

    today=`date +%m/%d/%y` # get today's date 


    dbaccess 2>error.log <<SQLSTMT 

        database stores_demo; 

        output to pipe "pr -t" without headings 

        select customer_num, fname,lname,company from customer; 

    SQLSTMT 

    } | while read line # pipe the output to while read 

    do 

    if [ "$line" ] # check if line is not NULL 

    then 

        # First parse the line into words/variables using set 

        set $line # assign the line to positional variables 

        name="$2 $3" # get the second and third variable for name 

        # company name may include spaces, $4 is only the first word 

        # so we discard the first 3 positions and assign the 

        # rest of the line to the comp variable 

        shift 3 # discard the first three variables 

        comp="$*" # let all remaining variables = the company 

        ## Start of simple form letter` 

        echo "Date: $today" 

        echo "To: $name" 

        echo " $comp" 

        echo "Thank you for your business" 

        echo " "

    fi 

    done 

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

    output이라는 sql내의 명령문을 이용해서 unix의 다른 프로그램으로도 연결할 수 있습니다. 이 예제는 메일머지에 사용된 예제입니다. 다음은 결과입니다.


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

    Date : 03/07/08

    To : Chris Putnum

    Putnum's Putters

    Thank you for your business

    Date : 03/07/08

    To : James Henry

    Total Fitness Sports

    Thank you for your business

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



    머.. 이 간단한 예제를 더욱 발전시켜서 여러분들의 환경에 잘 써보시기 바랍니다. 아참, 이것은 제가 만든것이 아니고 IIUG의 memeber중의 한명이 Lester Knutsen이 만든것입니다. 다음은 원문입니다.


    Simple shell scripts play a role in small programs and very complex applications.

    One of the advantages of Unix and Linux is the ability to use scripts for developing systems and programs. I’ll introduce you to using shell scripts with embedded SQL to access your database. Shell scripts are easy to write, they don’t need to be compiled, and are great for small batch programs.

    Shell scripts do have their limits. They don’t provide a nice GUI interface and, because they aren’t compiled, everyone gets to see the source code. These limitations, though, are minor trade-offs.

    In these examples, I use an Informix database and the Informix SQL command interpreter dbaccess. However, the examples will also work with Informix isql — and should work with any database that lets you redirect standard input and output. The basic items I’ll explore are: redirecting input and output, passing shell variables to SQL, and setting shell variables with the results of SQL commands.

    Redirecting Input

    One way to include SQL commands in a shell script is to redirect standard input to dbaccess from within the shell script. The example shell script in Listing 1 takes an SQL statement and redirects the SQL so that it is executed by dbaccess.

    When dbaccess starts, it expects a database name and SQL script name as its arguments; if they’re not available, dbaccess will display menus and prompt you for them. The two dashes (- -) indicate to dbaccess that the database and commands will come from standard input. The << indicates to the shell that standard input is redirected and that everything between the two occurrences of SQLSTMT is to be passed to dbaccess as standard input. This is called a “here document” in Unix shell scripts.

    The program dbaccess treats these lines as if you had typed them in from the keyboard. This is like typing dbaccess - - < filename, where filename is a file with the SQL commands. You don’t have to use SQLSTMT, but you do need two identical words to mark the beginning and end of input redirection. Running this script will start dbaccess and process SQL commands. The first command will open the stores_demo database and the next command will display the name and company of all the customers. You can use any valid SQL command that dbaccess will execute.

    Redirecting Output

    If you have a large customer table, the output will scroll off the screen. Like most Unix programs, Informix dbaccess will send output to two standard devices that are normally defined as your terminal window. Data goes to standard output, and processing messages go to standard error. In Listing 1, the names and companies are sent to standard output and the two messages (Database selected and 99 row(s) retrieved) are sent to standard error. These can be redirected to a file by changing line 2 in Listing 1 to:

    dbaccess - - >cust.rpt 2>error.log <<SQLSTMT

    The first > sends standard out (data) to a file cust.rpt and the 2> sends standard error (messages) to an error.log.

    What’s more useful is to send data to a paging program (such as more) and messages to a log file (see Listing 2).

    Notice that I’ve removed the first > and added a pair of { }. The pair of { } instruct the shell to execute the enclosed statements as a group. This instruction is useful to pipe the output to another program, such as more.

    Using Shell Variables

    You can use shell variables and prompts with SQL. The example in Listing 3 prompts for a company name and passes the variable to SQL for use in the SELECT statement. Entering an A* at the prompt would select all companies whose names begin with the letter A.

    Getting Data Into Shell Variables

    The results of an SQL command can be inserted into shell variables. The following is a simple example of a mail-merge program, selecting names and companies from a database, setting shell variables, and merging that data with some text. There are better ways to do this with the programming tools that come with a database, but this example illustrates the power of embedding SQL in shell scripts (see Listing 4).

    In this example, the output is sent to a WHILE loop. The WHILE loop reads each line of output until it’s done. Each line is broken apart into words by the set command. The first word is assigned $1, the second $2, and so on. name=”$2 $3” gets the name of the person. The company name is more difficult because it may contain spaces. The name “Big Company” would be broken into to two variables. The command shift 3discards the first three variables, and what was $4 becomes $1. All remaining variables are assigned to the company name with comp=$*.

    Mastering Complexity

    I’ve just scratched the surface of what you can do with embedded SQL in shell scripts. Many complex applications, such as billing and scheduling systems, are built using SQL in shell scripts. Now you have the tools to put this technique to use.


    Lester Knutsen is president of Advanced DataTools Corp., an IBM Informix consulting and training partner specializing in data warehouse development, database design, performance tuning, and Informix training and support. He is president of the Washington D.C. Area Informix User Group, a founding member of the International Informix Users Group, and an IBM gold consultant.


    LISTING 1. A shell script for redirecting SQL to dbaccess. 


    #!/bin/sh

    dbaccess <<SQLSTMT

        database stores_demo;

        select customer_num, fname, lname, company from customer;

    SQLSTMT

     


    LISTING 2. A shell script to send data to a paging program and messages to a log file. 


    #!/bin/sh


    dbaccess 2>error.log <<SQLSTMT

        database stores_demo;

        select customer_num, fname, lname, company from customer;

    SQLSTMT

    } | more

     


    LISTING 3. Using a shell variable with SQL. 


    #!/bin/sh

    echo "Enter company name (use * for wildcard matches) to find"

    echo "Company : \c"

    read comp

    dbaccess 2>error.log <<SQLSTMT

        database stores_demo;

        select customer_num, fname, lname, company from customer

        where company matches "$comp";

    SQLSTMT

     


    LISTING 4. Setting shell variables and merging data with text. 


    #!/bin/sh 

    today=`date +%m/%d/%y` # get today's date 


    dbaccess 2>error.log <<SQLSTMT 

        database stores_demo; 

        output to pipe "pr t" without headings 

        select customer_num, fname,lname,company from customer; 

    SQLSTMT 

    } | while read line # pipe the output to while read 

    do 

    if [ "$line" ] # check if line is not NULL 

    then 

        # First parse the line into words/variables using set 

        set $line # assign the line to positional variables 

        name="$2 $3" # get the second and third variable for name 

        # company name may include spaces, $4 is only the first word 

        # so we discard the first 3 positions and assign the 

        # rest of the line to the comp variable 

        shift 3 # discard the first three variables 

        comp="$*" # let all remaining variables = the company 

        ## Start of simple form letter` 

        echo "Date: $today" 

        echo "To: $name" 

        echo " $comp" 

        echo "Thank you for your business" 

    fi 

    done 

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

    EXAMPLE OUTPUT: 

    Date: 11/15/93 

    To: Frank Lessor 

    Phoenix University 

    Thank you for your business

    728x90

    'Informix > informix reference' 카테고리의 다른 글

    informix version 확인  (0) 2010.06.01
    ONBAR  (0) 2010.05.26
    테이블을 특정 시점으로 복구하는 기능  (0) 2010.05.24
    Porting from Oracle to Informix  (0) 2009.12.29
    DB size  (0) 2009.12.28
    728x90

    안녕하세요. 정상규입니다.

     

    database size를 출력하는 스크립트입니다.

    (사용법 : sh dbsize.sh DBNAME)

     

    그리고 IDS instance의 개별 database size를 출력하는 쿼리를 첨부하였으니 확인해보시길 바랍니다.

    (dbsize.txt)

     

     

    참조사이트)

    http://www.informix.kr/xe/1177

    http://database.sarang.net/?inc=read&aid=2500&criteria=informix&subcrit=qna&id=&limit=20&keyword=&page=4

    728x90

    'Informix > informix reference' 카테고리의 다른 글

    informix version 확인  (0) 2010.06.01
    ONBAR  (0) 2010.05.26
    테이블을 특정 시점으로 복구하는 기능  (0) 2010.05.24
    Porting from Oracle to Informix  (0) 2009.12.29
    [TIP] embedding SQL in UNIX Script  (0) 2009.12.29
    728x90
    $onstat - 
    IBM Informix Dynamic Server Version 9.40.UC4     -- on-Line -- Up 7 days 16:45:20 -- 2812948 Kbytes

    온라인 상태를 확인한다. 그런데 스크립트 실행시 쿼리 응답이 없을 경우
    운영체제 계정의 패스워드를 확인해 볼 필요가 있다.
    패스워드에 expiration이 정해져 있는지 확인하고 재설정하면 문제가 해결된다.
    728x90
    728x90

    이 강좌는 윈도우 2000 을 기준으로 작성하고 있기에... 그리고, 초급을 대상으로 하기는 하지만... 조금은 중급적인 부분도 사이사이 다루고 있기에... 조금은 내용이 깊어질 것도 같습니다... ^^

    예를 들면 이번 강좌가 그러한 부분중에 하나이지요.. 조금은 중급적인 요소가 없지않은....

    해서 이번 강좌는 OLE DB와 UDA(Universal Data Access) 에 대한 이야기부터 한번 해볼까 합니다.. 또한,이 부분을 좀 더 구체적으로 설명하기 위해서2001년 3월말에 나올 taeyo's Advanced ASP 책의 일부를 편집하여 사용할 것이기도 합니다. 히힛... (은근한 책 광고임다... ^-^) 국내 ADO, MTS, COM+의 대가인 최현진 사장(인브레인)님의 감수를 거친 부분이라.... 내용면에서도 조금은 흡족하지 않을까 하는 기대를 가져봅니다... ^^ 기대기대...

    우리는 저번 강좌에서 Ms Access와 MS SQL 서버의 경우에 데이터베이스를 ODBC 세팅하는 부분까지 이야기해 보았습니다... 그렇다면 복습의 차원에서 여쭤보겠습니다... 왜??? 무엇땜시.. 우리는 ODBC를 세팅했던 것이었나요? 왜? 그렇게 하지 않으면 안되는 것이었던 것일까아아아아요....~~~~~

    그 이유는... 데이터베이스로의 접근 때문이었습니다. 예전의 데이터베이스들은 폐쇄적이었기에.. 데이터베이스 자체에서 제공하는 클라이언트가 없다면 데이터베이스 서버로 접근할 수가 없었습니다.. 하지만, 그러다보니 서로 다른 데이터베이스간에 데이터를 공유하기에 어려움이 있었지요.. 해서, 이러한 폐쇄적인 것들을 개방적으로 오픈할 방법을 생각해 냈는데 그게 바로 ODBC 랍니다. Open Database Connectivity 라는 ODBC를 말이죠....

    해서 우리는 웹쪽의 ASP나 Win32 어플리케이션들에서 특정 데이터베이스를 접근하기 위해서.. 그 연결통로라 볼 수 있는 ODBC 를 잡아야 했던 것입니다요... 그리고나면, 우리는 소스중에서 그 연결문자인 DSN 을 이용해서 해당 데이터베이스로 접근이 가능하게 되거든요.... ^^ 그래서 이전 강좌에서 열심히 ODBC를 잡았던 것입니다. ASP 에서 데이터베이스와 연동하기 위해서도 역시나 ODBC 의 연결이 필요하니까요

    하지만, 그사이 세상은 놀랄만큼 바뀌고, 발전했지요. 그러니, 그 사이에 ODBC 를 능가할만한 것이 또한 등장할만도 하다는 느낌이 사정없이 들죠? 그렇습니다. 마이크로소프트는 그 사이에 이 방법을 구체하시켜서 ODBC 보다 뛰어난 성능을 가진 OLE DB 라는 것을 등장시켰습니다. 오옷... 대단한 MS (아부성은 아닙니다.)

    그리고, MS는 ASP나 Win32 에서 ODBC나 OLEDB와 같은 연결통로를 통해서 데이터를 넣고, 조회하는 등의 작업을 하기 위해서 데이터를 핸들링 할 수 있는 기술을 또한 발전시켜 왔는데.. 그것은 바로 ADO 라는 것입니다. 이미 게시판을 어느정도 만들어 보신 분은 이미 만나보셨겠지만  ADODB.Connection, ADODB.RecordSet, ADODB.Command 등이 그것이랍니다.

    다시 설명드리자면.. OLE DB는 RDBMS 에 접근할 수 있는 통로를 제공하는 역할을 담당하는 기술이구요..
    (게다가, OLE DB 는 RDBMS 외에 비 관계형 데이터들에게도 접근이 가능합니다.)
    ADO는 사실상의 데이터를 처리하는 역할을 하는 담당하는 기술입니다. OLE DB. 이름은 어디선가 자주 들어본 것... 좀 더 알아봅시다.진정코 OLEDB 그것은과연 무엇일까요? 이것은 마이크로소프트의 UDA라는 전략을 구현하는 기술중의 하나입니다...

    어라? 그럼 또 UDA는 뭐야? 뭐가 이리 복잡해... -.- 라고 하실만도 합니다.  저도 그랬으니까요.. 하지만, 알고보면 무지 간단한 전략입니다. (단순하게 생각하면요) 하지만, 실제 이 전략에 의해 구현되는 기능들은 가히 몸서리쳐질만 하지요.. (물론, 못 느끼시는 분도 있을 수 있고, "그게 뭐...대단해?" 하시는 분도 있을 수 있습니다)
    그렇다면, 알아봅시다. UDA 라는 것.. 그리고 그를 이루는 근간이 되는 OLE DB를 말이죠

    UDA 란? UDA는 Universal Data Access를 나타내는 말입니다.

    이것은 광범위한 데이터들을 접근할 수 있도록 하는 마이크로소프트의 기술로 UDA 전략이라고도 표현하죠. UDA라는 말은 일종의 개념적이며, 기술 전략적인 이름일 뿐이고, 실제로 이를 구현하는 것은 ADO와 OLE DB 입니다.뒤집어 이야기하면, ADO와 OLE DB를 사용하여 광범위하게 위치한 데이터들을 처리하게 하는 기술을 UDA라고 표현할 수 있을 것입니다.

    그렇다?? 그렇다면 OLEDB는 무엇일까요?

    여러분들도 어디선가 들어는 본 듯한 말일 것이기는 합니다. 하지만, 여러분들은 OLEDB 라는 단어보다는 아마도 ODBC에 더욱 친숙함을 느끼고 있을 겁니다. 지금까지 대부분의 프로젝트를 ODBC를 통해서 구현해 왔을터이니 말이져. 

    그렇다면, 여러분이 프로젝트에서 사용한 ODBC의 역할은 무엇이었을까요?

    다시금 이야기하자면 이기종의 데이터베이스를 접근할 수 있게 해주는 표준적인 방법으로 였을 겁니다. 거의 모든 관계형 데이터베이스를 접근할 수 있게 해 주는 것이 ODBC였으니 말이죠. 저의 경우도 인포믹스와 오라클에 대해서 ODBC를 이용하여 프로젝트를 수행해 본 경험이 있습니다. 인포믹스 때는 ODBC 가 안 잡혀서 죽는줄 알았습니다. .. 우찌우찌 성공하기는 했지만요... -.-  어쨋든 ODBC는 실로 멋진 기술임에 틀림없슴다.

    그러나, OLEDB의 화려한 등장으로 인해 ODBC의 세상은 조금 흔들리고 있습니다. OLE DB는 ODBC보다 한층 이상을 뛰어넘는 모습을 보여주고 있으니 말입니다. 

    놀라지나 마세요.... OLEDB는 말입니다.  이 녀석을 사용하면 말이죠. 그게 말입니다.... 두 - - 둥.....

    이기종의 관계형 데이터베이스뿐 아니라, 비 관계형 데이터들에게도 접근할 수 있습니다.... 즉, SQL서버나, 오라클과 같은 RDBMS 뿐 아니라.. 메일폴더, 각각의 메일자체, 디렉토리, 웹 사이트등등.. 그러한, 비 관계형인 계층 구조적인 데이터들에게도 접근할 수 있게 한다는 것이지요.... 저의 경우 OLE DB란 단어를 처음 만난 것은 3~4년전 이었던 것으로 기억되는데요...  사실 그 때도 OLEDB를 통해서 관계형 데이터베이스 이외의 데이터들에게까지 접근할 수 있다는 이야기는 들었었지만, 어떻게 그것이 가능한지에 대해서는 그다지 많은 정보를 얻을 수 없었었던 기억이 있슴다.  하지만, 이제 ADO 2.5에 들어서며 이를 가능하게 하는 편리한 방법들이 등장하였다는 것이죠. 놀라시지 않나요? 전 무지하게 놀랬는데... 흠...

    그렇다면, 놀래고 싶은 분들은 조금 놀래보시구요...
    (진짜로 안 놀래다니.. 흠.. 일부러라도 놀라는 척 해주지..... -.-)
    어쨋든 우리는 이제 OLE DB를 통해서데이터베이스외의 자료들에 대한 접근도 가능하게 된다는 것은  기억해 두시기 바랍니다. 물론, 앞으로도 대부분의 경우는 데이터베이스로의 접근을 위해 사용되겠지만, 기회는 열려져 있다는 것이죠. (익스체인지 서버관련 솔루션을 개발할 때는 100% 필수입니다. 이거..)

    사실, 현재 2001년에 태오에게 주어진 임무가 바로 그러한 작업인데요.... Exchange 2000 Server 를 이용해서 웹 메일 시스템과 그룹웨어, 전자결재, KMS 를 구현하는 작업입니다. 그러다보니 데이터베이스가 아닌 메일 시스템에 접근할 방법이 필요하구요.. 저는 이를 OLEDB와 ADO2.5를 통해서 가능하게 하고 있답니다... ^^ 물론, MSDN을 참고해서요

    자..... 다음의 그림은 UDA 아키텍쳐(Architecture) 입니다.

    그림에서 볼 수 있는 것처럼 UDA 기술은 ADO와 OLE DB를 사용하여 SQL 데이터뿐 아니라 비 SQL적인 데이터들(메일, 텍스트, 디렉토리서비스등)에도 접근을 가능하게 하구요. 데이터를 처리할 수 있게 합니다. 또한, OLE DB를 통해서 기존의 ODBC를 통한 데이터의 연결도 이용할 수 있게 되어 있답니다. 이처럼 OLE DB를 통한 접근은 기존의 ODBC가 부족했던 점을 완전히 메꾸고 있구요... ODBC 때에 비해서 접근 속도도 많은 향상을 가져왔습니다. ..

    그렇다고, 이 OLEDB 기술이 ODBC를 없애버리고 세상을 바꾸자는 의도를 가지고 있는 것은 아닙니다. 기존의 기술을 더욱 발전시키자는 데에 목적을 두고 있는 것이 OLEDB 기술인 것이랍니다. 유식하게 말하면, 온고지신(溫故知新)의 개념인 것이져.. 온고지신... 태오 한문도 쫌 함다...

    잠깐 !! 잘모르겠는디요. ADO, ODBC, OLEDB 뭐가 무엇을 하는것이죠?

    그렇습니다. 분명 혼란함을 느끼시는 분들이있을 것입니다. 
    이 즈음에서 간단하게만 정리하고 계속나아가고자하는데요. 
    ADO는 데이터를 다루는 개체이며, ODBC, OLEDB는 데이터의 제공자격입니다. 
    무슨 말인지 잘 이해가 안 된다면 다음 예를 보도록 하세요. (이것은 단지 예일 뿐이기는 합니다)

    우리에게는 동시통역기가 하나있다고 가정해 봅시다요. 
    이를 동작시키면 외국말들이 자동으로 알아들을 수 있게 나온다고 가정합니다.
    또한, 우리가 이야기하면 자동으로 번역해서 말을 전해주기도 하고 말이죠. 
    대신에 그러한 기능을 사용하기 위해서는 그 통역기에는 통역하고픈 각각의 나라용 칩을 
    기계에 추가해 주어야 합니다.

    기본적으로 미국, 러시아, 일본의 칩은 제공된다고 가정합시다. 
    이제 외국사람들을 만나는 것은 겁나지 않을 것입니다. 
    만나면 즉시 이 자동통역기를 동작시키면 되니 말이죠. 하하.. 이젠 외제를 만나도 걱정없을 검다...
    그런데, 갑작스럽게 남아프리카 사람을 만나게 되었습니다. 이 때도 걱정이 없슴다. 
    남아프리카용 통역 칩을 사서 기계에 장착하면 되니 말이죠. 돈만 있으면... 하하

    이 동시통역기가 바로 ADO라고 볼 수 있으며, 각 나라용 칩은 ODBC 라고 볼 수 있습니다. 
    그리고 각각의 외국인들은 데이터베이스들이라고 볼 수 있고 말이죠. 이해가 가시죠?

    그런 어느날, 기존의 통역기능을 좀 더 효과적으로 사용할 수 있으면서도, 
    동물의 언어까지도 통역이 가능한 기술이 개발되었으니 그것이 바로 OLEDB 기술이라 
    하더라는 말씀입니다.

    주의할 것은 이렇게 원본 데이터를 우리가 사용할 수 있게 제공해주는 역할을 하는 것이 
    ODBC, OLEDB 기술이구요. 이렇게 제공받은 데이터를 처리하는 기술이ADO라는 것.

    어때요? 쏙쏙 들어오죠???


    이제 여러분은 OLE DB 라는 것을 사용하면 뭔가 상당한 이익이 있을 것이라는 막연한 기대를 가지게 되었을 것입니다. 하지만, 그것은 막연한 기대로 끝나지만은 않을 겁니다... 실제로 상당한 성능의 향상을 가져다 주니까요... 그렇다면, OLE DB 라는 것은 어떻게 사용할 수 있을까를 여러분이 이제 충분히 궁금해 하실 시간이 되었네요..

    ODBC 를 잡은 것을 여러분이 ASP 코드에서 사용하기 위해선, 이미 해보신 분들은 알겠지만.. 다음과 같은 코드를 통해서 가능합니다... ADO의 Connection 개체를 통해서 말이지요.


    Dim adoCn
    Set adoCn = Server.CreateObject("ADODB.Connection")

    adoCn.Open "DSN=MyDB" 'Access일 경우
    (혹은adoCn.Open"DSN=MySQLDB;uid=xx;pwd=xx" 'SQL 서버일 경우 )



    소스에서 사용한 DSN은 이전 강좌에서 여러분이 세팅한 ODBC의 DSN 값을 사용해서 이루어집니다.  ODBC를 사용할 경우는 위와 같은 방법으로 접근해야 하지요.. 하지만, OLE DB를 사용할 경우는 ODBC와 같은 세팅은 필요치 않습니다.. 코드에서 단지 연결문자열만으로 아주 쉽게 사용할 수가 있게 되지요... 즉, OLE DB 를 사용하게 된다면 위와 같은 코드는 다음과 같은 코드로 바꾸어 사용할 수 있게 됩니다.


    Dim strConnect, adoCn
    Set adoCn = Server.CreateObject("ADODB.Connection")

    str = "Provider=SQLOLEDB;Data Source=(local);Initial Catalog=pubs;user ID=xx;password=xx;"
    adoCn.Open strConnect


    중요한 부분은 소스중에서 커넥션 객체의 Open 메소드에 사용하는 연결문자열인데요..  소스중에 Provider=SQLOLEDB;Data Source=(local);Initial Catalog=pubs;user ID=xx;password=xx; 라고  되어져 있는부분이 그것입니다.

    즉, OLE DB를 사용하기 위해서는 이 연결문자열만 잘 구성하면 그것으로 OK 라는 이야기가 되지요. 그렇다면, 이제 여러분이 외워야 할것은 이 연결 문자열임을 알 수 있습니다.  그렇다면, 이 연결문자열이 의미하는 것을 이제조목 조목 알아봅시다...  문자열 내에서 각각의 정보는 세미콜론인 ; 로써 구분이 되는데요...

    첫번째 정보는 프로바이더 정보입니다.

    Provider가 바로 그것이지요....  만일, SQL 서버를 사용한다면 SQLOLEDB 라는 문자열을 사용해야지만 SQL 서버용 OLEDB를 이용할 수 있게됩니다.  만일, ORACLE를 사용하려 한다면 MSDAORA 라는 OLEDB 프로바이더를 지정해야 하지요... ^^  이러한 각각의 OLE DB 프로바이더 이름이나, OLE DB 프로바이더는 각각의 데이터베이스 업체에서 제공합니다.  이것은 MS 에서 제공하는 것이 아닙니다. 즉, 여러분의 회사가 Informix 를 사용하고 있는데...  OLE DB 를 사용하고 싶어졌다면 인포믹스 측에 연락해서 OLE DB 용 프로바이더를 제공해 달라고 부탁하시면 됩니다. 
    현재즈음이면 대부분의 데이터베이스 업체가 OLE DB 공급자를 제공해 주고 있을 겁니다. 아마도..말이죠. 그리고, 그것을 받아서 서버에 설치하시면 해당 데이터베이스 서버용 OLE DB를 사용할 수가 있게 되는 것이지요. 기본적으로 Windows 2000 에서 제공하는 것은 MS의 제품관련 OLE DB 들이라는 것을 기억하세요... ^^ 
    여기서는 SQL 서버에 접속하려 하기에 Provider=SQLOLEDB 라는 것을 지정하였던 것이죠...  중요... 이 문자열은 다닥다닥 붙여쓰셔야 합니다. ^^

    두번째 정보는 Data Source 입니다.

    물론, 정보를 지정하는데에 특별한 순서가 있는 것은 아닙니다만... 일반적으로 이런 순서로 지정합니다. 기분 나쁘시다면 순서는 여러분 맘대로 하셔도 돼요... ^^  Data Source=(local) 이것은 사용하고자 하는데이터베이스 서버가 설치된 서버의 이름을 지정하는 것입니다. (local)이라고 지정하면 현재의 자신의 서버에 데이터베이스 서버가 설치되어져 있을 경우에 가능하구요...  네트웍의 다른 서버에 데이터베이스 서버가 있을 경우는...  그 서버의 서버이름을 기입해 주시면 됩니다. 예를 들어 네트웍 상의 Sony 라는 서버에 데이터베이스 서버가 있다면  이 부분을 Data Source=Sony 라고 주시면 된 답니다. 어렵지 않죠?

    세번째 정보는 사용할 데이터베이스 정보입니다.

    데이터베이스 서버안에 존재하는... 여러 데이터베이스중에 어떤 데이터베이스를 사용할 것인지 정하는 것이지요.... 하지만, 인자이름이 조금은 외우기 부담스러운...  Initial Catalog 이네요.. 어쨋든 외워야 합니다...  해서 소스에서는 Initial Catalog=pubs 라고 하였습니다. SQL 서버에서 기본적으로 제공되는 Pubs 데이터베이스를 사용하겠다고 지정한 것이죠...

    네번째, 다섯번째의 인자는 User ID와 password 입니다. 이것은 SQL 서버의 해당 데이터베이스로 접근할 수 있는 계정 아이디와 비밀번호를 적어주면 됩니다...  중요한 것은 위의 문자열들은 띄워쓰기를 꼭 지켜주어야 한다는 것입니다. User ID에서 User 라는 단어와 ID라는 단어사이에는 꼭 한칸을 띄워주어야 합니다.  
    Initial Catalog 도 마찬가지 이구요. 대, 소문자는 구분하지 않아도 에러가 안 나지만...  띄워쓰기는 반드시 지켜주어야 합니다. ^^ 반드시, 꼭, 기필코, 여하튼, 결사코, 겁나게. 

    어렵지 않죠??? 그럼 지금부터 30초 드리겠습니다. 이 문자열을 외우시기 바랍니다.... 
    어어... 스크롤바 내리지 말고 위로 올려서 어서 외우세요.. 어~~ 외우라니깐요...

     

    흠....

    외우기가 어렵다구요..??? 조금은 그럴 수 있죠. 하지만, 외우셔야 합니다. 
    하지만, 아무리 외워도 또 시간이 지나면 까먹죠... 그렇기에 쉽게 이 OLE DB 연결문자열을 만들 수 있는 방법을 알려드리겠습니다. 이 방법은 꼭 외워두세요...

     

    1. 먼저 바탕화면에 새로운 텍스트 파일을 하나 만듭니다. 그리고, 그 파일의 이름을 바꾸시는데 그 이름을  
        OLEDB.UDL 이라고 지정합니다. 파일 이름은 뭐라해도 상관없지만 확장자는 반드시 UDL이어야 합니다. 
        그러면 다음 그림과 같이 아이콘이 바뀔 것입니다.

    2. 그 아이콘에 마우스 우측 클릭해서 등록정보로 갑니다. 그러면 아래 그림처럼 Provider이라는 탭이 나올텐데, 그 탭으로 가면 현재 여러분의 시스템에서 지원되는 모든 OLE DB 공급자들이 나올겁니다. 우리는 여기서 SQL Server 을 사용할 것이기에 아래의 그림처럼 그것을 선택하시구요.  다음 탭인 Connection 탭으로 이동하세요 (혹은 Next >> 버튼을 누르세요)

    3. Connection 탭으로 이동하시면 다음과 같은 화면이 나올 것입니다. 그림에도 표시해 두었지만 먼저 1번 칸에
        는 접근할 데이터베이스 서버의 이름을 기입해 주세요. 만일, 로컬 서버에 데이터베이스 서버가 설치되어져 
        있다면 (local)이라고 하셔도 됩니다. 2 번 칸에는 해당 DB 서버로 접근할 수 있는 계정 아이디와 비밀번호를 
        기입하시면 됩니다.

    위와 같이 설정하시고 나면 3번의 "Select the database on the Server" 의 콤보박스를 클릭할 경우 여러분이 기입한 내용을 기반으로 해당 데이터베이스 서버에 지정한 계정 아이디와 비밀번호로 접근을 자동으로시도합니다... 만일, 위의 그림에서 지정한 부분중 틀린 부분이 있다면 다음과 같은 에러가 날 수도 있습니다.

    이 에러화면은 계정의 아이디가 없거나, 비밀번호가 일치하지 않을 경우 입니다. 이런 경우는 계정을확인하시면 됩니다. ^^  만일, 모든 것이 잘 맞아 떨어졌다면 다음 그림처럼 위의 윈도우는 현재 DB 서버가 가지고 있는 데이터베이스들이 나온답니다.

    4. 이렇게 디비들이 마구 나온다면... 접근이 제대로 된 것입니다. ^^ 성공축하....추카추카

    그러면, 우리가 사용할 MyDataBase 를 선택하고 바로 밑의 버튼인 Test Connection 을 꼭 누르세요. 
    그럼 현재까지 지정한 것들을 가지고 다시금, 완전히, 실제로 OLE DB 접근 테스트를 합니다.
    그리고, 성공하면 다음과 같은 메시지가 나오지요. 꼭 이거 나와야 합니다.

    오홋홋... 마치 ODBC 잡을때와 비슷한 절차를 거치고 있네요.. ^^ 하지만, 이 작업은 반드시 해야하는 작업이 아닙니다.. OLE DB 연결 문자열을 도저히 외울수 없는 분들에게 유용한 방법이지요....

     

    이렇게 세팅을 끝내고 난 다음에는 뭘 어떻게 하느냐?

    5. 이제 세팅이 끝난 뒤, 바탕화면에 존재하는 OLEDB.UDL 을 "메모장"으로 로딩을 합니다. 
        그림과 같이 말이지요.. ^^

    그러면, 메모장에는 다음과 같이 OLEDB 연결 문자열이 만들어져 있는 것을 볼 수 있을 것입니다.

    비밀번호는 제가 일부러 *** 처리했음을 양해바랍니다.... ^^  또한, Persist Security Info=False; 라는 부분은 우리에게 필요없는 부분이기에.. 그림에서는 그 부분을 지우고 보여드림도 양해바랍니다. 원래의 결과에서는 Persist Security Info=False; 라는 부분이 있을 겁니다. 하지만, 우리에게는 그것이 필요없으니 지우셔도 무방합니다. 있어도 무방하구요..  ^^

    고로, OLE DB 연결문자열을 외우시기 싫거나, 자체 CPU가 딸려서 잘 외워지지 않는 분들은... 이러한 방법으로 언제나 연결 문자열을 만들어 내면 되는 것입니다.... ^^ 어때요? 쉽죠??

    자... 조금은 길었지만...

    OLE DB를 통해서 데이터베이스를 접근하는 방법을 이제 장려해야 하겠다는 생각이 들으셨을 것이라 생각하구요.. OLE DB를 사용하기 위해서는 연결 문자열만을 외우면 된다는 것도아셨을 겁니다.

     

    그리고, 윈도우 2000에서는 ODBC 보다는 OLE DB를 사용하는 것이... 훨씬 낫다는 것을 기억하세요... 여러가지 장점이 있으니까요... ^^ 그중에 하나는 ODBC의 경우 ASP에서 여러 개의 데이터베이스를 접근하기 위해선, 각각의 데이터베이스를 모두 ODBC잡아야 하는 반면, OLE DB 연결 문자열을 사용하면... 그러한 것이 하나도 없이 ASP 내부에서 여러 데이터베이스로 자유자재로 접근이 가능하게 됩니다. ^^

     

     

     

    자... 이것으로 OLE DB 에 대한 이야기도 어느정도 이야기가 되었네요.. 더욱 궁금하신 것은 2001년 4월 초에 출시되는(된) 태오의 심혈의 대작... 두~~둥 

    "taeyo's Advanced ASP to be professional"을 참고하세요

    ^^ 조금은 더 깊은 이야기가 있습니다. (과연 속아줄것인가?....)  그럼.. 이제 이러한 지식을 기반으로...  다음 강좌에서부터는 ASP에서 OLE DB를 이용해서 게시판을 만들어나가기 시작하겠습니다. 글 올리기를 시작으로 해서 말이지요... ^^  기대가 사정없이 되지요.. 크핫핫.... ...

    그럼 다음 강좌에서..... 다시... 10000 나요~!


    PS :Ms Access를 OLE DB로 연결하고 싶다면 Microsoft.Jet.OLEDB.4.0을 사용하심 됩니다. 해서, Ms Access 경우때의 연결문자열은 다음과 같이 만들어 사용하고는 합니다.

    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\temp\Nwide.mdb"

    여기서의 Data Source 는 데이터베이스 파일의 경로를 적어주시면 됩니다. 반드시 물리적인 경로를요



    출처 : http://www.taeyo.net/Columns/View.aspx?SEQ=224&PSEQ=15&IDX=3

    728x90

    + Recent posts