이수준(dislevel@newhuman.org)
|
서 론 지난 호에서는 Linux Oracle 의 설치법과 사용자 등록, 자동시작/종료를 설정하는 방법에 대해서 알아보았다. 이번 호에서는 sqlplus 의 기본 사용법, Oracle SQL 질의어, 그리고 Pro*C 에 대해 알아보고, 다음 호에서는 PHP3 와 연동을 주제로 이 글을 마칠까 한다.
가. sqlplus 를 이용한 Oracle User 로의 접속 먼저 Oracle 이 시스템에 설치되면서 자동적으로
생성되는 두 개의 특별한 사용자 계정을 알아보자. SQL*PLUS 에 연결하고 사용자를 생성한다. $ sqlplus system/manager SQL*Plus: Release 8.0.5.1.0 - Production Copyright (c) Oracle Corporation 1997. All rights reserved. Connected to: Oracle8 Server Release 8.0.5.0.0 - Production Release PL/SQL Release 8.0.5.0.0 - Production SQL> create user <user> identified by <psw> User created. SQL> grant connect, resource to <user> Grant succeeded. SQL> exit 시스템에 새로운 사용자계정을 생성하였기 때문에 새로운 계정을 가지고 시스템에 로그인 할 수 있다. Oracle 데이터베이스에 로그인 하기 위해서는 다음과 같다. $ sqlplus <user>/<password> 이제야 비로소 여러분은 Oracle 데이터베이스와 실질적인 대화를 할 수 있는 준비가 다 되었다. 여러분들은 sqlplus 를 통해서 이 일을 할 수 있다.
나. sqlplus 의 간단한 이해 sqlplus 는 다음과 같은 기능을 제공한다. 백문이 불여일견이라, 간단한 예제를 통해서 위의 사항을 정리해 보도록 하자. SQL 을 먼저 설명하느냐 sqlplus를 먼저 설명하느냐 문제는 일단 덮어놓자. (사실 Oracle 을 손대고자 한다면 기본적인 SQL 정도는 알고 있어야 하지 않을까?) 가장 많이 쓰는 예로 전화번호부 데이터베이스를 구성해보자. 전화번호부에는 사람의 이름, 주소, 전화번호 등의 필드가 필요하다. sqlplus 상에서 다음을 입력해 보자. [oracle@ora oracle]$ sqlplus dislevel/******
; 여러분이 생성한 사용자로 접속할 것!! (c) Copyright 1998 Oracle Corporation. All rights reserved. Connected to: SQL> Table created. SQL> sqlplus 를 사용해 보면 알겠지만, postgresql 의 그것보다는 훨씬 불편할 것이다. 테이블을 구성하는 필드가 몇 개 안되기에 망정이지, 수십개나 되는 필드중에서 하나라도 철자나 문법이 잘못된다면 처음부터 다시 쳐야되는 불상사가 생기리라. 당연히, 여러분들을 도와줄 좋은 방법이 있기는 한데, 바로 vi 같은 편집기를 이용하는 방법이다. sqlplus 상에서 vi 편집기를 부르려면 다음과 같이 한다. SQL> 이제 여러분들은 맘 놓고 SQL 문을 편집 할 수 있다. 비록 간단한 문장이기는 하지만 위의 SQL 문을 vi를 이용해 입력하고 저장하자. 파일 이름을 tel_list.sql 이라고 했다면, 다음과 같이 start 문을 이용한다. ~ SQL> start tel_list.sql Table created. SQL> 간단하나마, sqlplus 에서의 작업을 몇 가지 해 볼 수 있었다. 아시다시피, 데이터베이스에서의 작업은 대부분 table 의 생성과 삭제, 자료의 입력, 삭제 수정 등이다. 그 이외에 시스템 관리 적인 측면은 데이터베이스 시스템마다 조금씩 차이가 있으므로 좀 더 깊숙한 내용은 해당 매뉴얼이나 책 등을 참고하는 것이 좋다. sqlplus 에서 사용되는 몇 가지 기능을 더 살펴보자. Table 의 삭제 drop table <table_name>; Table 의 구성 요소 확인 desc table tel_list; ; tel_list
.. 역시 table_name 이다. Name Null?
Type SQL> SQL 명령 중 레코드의 변경을 발생시킬 수 있는 명령을 실행하고자 할 경우. delete, update, insert 등등, 에는 commit 명령을 해 주어야 그 즉시 효과를 볼 수 있다. commit 대신 rollback 명령을 실행하면 delete 나 update, insert 등의 문장들이 명령 취소가 된다. commit; ollback; 다음의 예제는 뭘까? 조금 독특하기는 한데 이 부분은 독자 여러분들에게 숙제로 남기겠다. select * from user_objects; sqlplus 의 종료는 다음과 같이 한다.
다. Oracle 데이터 타입 이제 sqlplus 에서 간단하나마 몇 가지 작업을 할 수 있으므로 이제는 Oracle 의 SQL 을 여러 개 짚어보기로 하자. sqlplus 에 대한 더 자세한 내용은 역시 RTFM !! Column의 유형은 매우 많은데 기본적인 데이터
유형은 문자, 숫자, DATE, RAW가 있다. SQL> select TO_CHAR(SYSDATE,’YYYY-MM-DD HH:MI:SS PM’) from DUAL; TO_CHAR(SYSDATE,’YYYY- SQL> 위 예제는 현재의 (시스템)시간을 원하는 형식대로 보여준 예이다. TO_CHAR 이라는 말은 짐작하겠지만, 자료형을 char 형으로 바꾸어 준다. 시간을 문자형으로 바꾸어 여러분들이 활용할 수 있다는 말이다.
라. Oracle SQL 언어 Oracle SQL 은 기능상 다음 3 개의 분야로 나눈다. DDL(Data Definetion Language) 오브젝트 정의 기능, 테이블 생성 CREATE 생성
(CREATE로 생성한 Table은 DROP으로 삭제한다.) DML(Data Manipulation Language) 데이타 조작 기능,행과 열에 대한 작업 SELECT 데이터
취득 DCL(Data Contorl Language) 데이타 제어 기능, 유저관리 GRANT 비록 설명은 부족했지만, 어쨌거나 여러분은 create 문을 통해 데이터베이스 사용자, table 등을 만들어 둔 상태다. (좀 전에 tel_list 라는 table 을 만들어 둔 것을 기억하자) 이것을 이용해 위의 SQL 명령어를 이해해 보자. 이 연재에서 주로 다루는 내용은 select, delete 등의 DML 명령어들이다. 먼저 아까 만들어 둔 tel_list table 에 어떤 값을 넣어보기로 하자. SQL> insert into tel_list values 1 row created. SQL> Insert 구문은 비교적 간단하다. 해당 테이블 명과 값을 차례대로 집어넣으면 된다. 여러 가지 SQL 구문의 연습을 위해 좀 더 많은 데이터를 삽입하기 바란다. 다음은 올려진 자료의 수정이다. SQL> update tel_list set phone = ‘016-223-****’ where name = ‘이수준’; 1 row updated. SQL> SQL> delete from tel_list where name=’이수준’; 1 row deleted. 마지막으로 select 구문이다. select 구문을 맨 마지막으로 한 이유는 다른 질의어와는 달리 부가적인 구문이 많기 때문이다. 이제부터 하나씩 살펴보기로 하자. 다음은 기본적인 select 구문이다. 보기 쉽게 약간 손질했다. SQL> select * from tel_list; NAME ADDR
PHONE SQL> select name, phone from tel_list; NAME PHONE SQL> select * from tel_list where name like ‘이%’; NAME ADDR
PHONE SQL> 하나씩 살펴보기로 하자. 처음 질의 문은 간단하다. tel_list TABLE 상의 모든 자료를 보여준다. 두 번째 질의 문은 원하는 자료(예로 이름과 전화번호)만을 보여준다. 세 번째 질의문은 조금 독특하다. where 절 이하에서 name 필드의 제약이 ‘like’ 로 나와있다. 이것은 검색엔진등을 구현한 때 유용한데 ‘이%’ 라는 말은 첫 글자에 ‘이’ 자가 들어가는 모든 자료를 찾아준다. 문자열 중에 ‘이’ 가 포함된다면 ‘%이%’ 일 것이다. like 까지 이해했다면 꾀나 성공한 것이다. 그런데 이것으로 끝난 것이 아니다. 계속 살펴보기로 하자. SQL> select name from tel_list; NAME SQL> select name from tel_list order by name; NAME SQL> select name from tel_list order by name desc; NAME SQL> 위의 예는 order by를 이용한 예이다. 처음 것은
order by 를 이용하지 않은 것이고 다음은 이름 순서대로 검색한
예이며 마지막은 이름의 역순이다. ADDR COUNT(*) 위의 예는 데이터의 통계를 낼 때 많이 쓰인다. 우리가 만들어둔 주소 필드가 그리 세분화되지는 않았지만 나중에 시, 군, 도 명 등을 세분화 해 둔다면 위의 예는 적절할 것이다. 설명을 하자면 주소별 사람들 수를 나타낸다고 할 수 있다. 이 외에도 많은 질의어들이 오라클에는 존재하는데, 대충 많이 쓰이는 것들을 설명해 보았다. Oracle SQL 에 대한 더 자세한 내용은 해당 문서들을 참고하기 바란다.
마. Oracle Pro*C Pro*C 툴 은 SQL문을 넣은 C 프로그램을 Oracle 데이터베이스에 있는 데이터의 엑세스와 조작을 할 수 있는 C 프로그램으로 변환하기 위한 pre-compiler 이다. Pro*C 컴파일러는 입력 프로그램 (Pro*C 파일 : *.pc) 에 있는 EXEC SQL 문을 적당한 Oracle Call 로 변환하여 출력파일(C 소스파일: *.C)을 작성한다. 프로그램 작성 순서는 다음과 같다. 1) Pro*C 소스 프로그램을 작성한다.(*.pc) 2) Pro*C를 이용하여 프로그램을 프리컴파일 한다. (*.pc --> *c) 3) C프로그램을 컴파일하여 오브젝트파일을 만든다. (*.c --> *.o) 4) 오브젝트파일에 필요한 라이브러리파일을 링크하여 실행파일을 만든다. (*.o --> 실행 가능 파일) 실제로 여러분들이 Linux Oracle 의 모든 구성을 빠짐없이 설치하였다면 다음의 디렉토리에 Pro*C 의 예제들이 있을 것이다. [oracle@ora oracle]$ ls -l app/oracle/product/8.0.5/plsql/demo -rw-r--r-- 1 oracle dba 972
Feb 12 06:59 examp7.sql acle]$ 여기서 demo_plsql.mk 가 본 예제들의 make 파일이다. 직접 컴파일 해 보려면 make -f를 이용해서 실행해 보기 바란다. 여러분의 Oracle 환경 설정에 약간 문제가 있다면 원활한 컴파일과 실행을 위해 /etc/ld.co.conf 에 다음을 추가하고 ldconfig 을 실행하라. /home/oracle/app/oracle/product/8.0.5/lib 지면 관계상 Pro*C 의 모든 구성을 설명할 수 없고 간단한 예제 하나를 통해서 Pro*C를 익혀보도록 하자. 아래 예제는 필자가 얼마 전 ‘뉴 휴먼 단’ 이라는 잡지의 검색 엔진을 샘플로 보여주기 위해 간단히 급조한 프로그램이다. 내용은 간단하지만 지금까지 글들에서 전혀 설명되지 않았던 부분이 나오므로 주의해서 보기로 하자. /* 본 프로그램에서는 두 개의 table을 이용한다. KWTIT table 은 해당 키워드의 내용이 있는 파일명과 그 글의 제목을 포함하고, TITDS 에서는 글의 제목과 그 글의 요약문이 저장되어 있다 키워드를 입력하게 되면 해당글의 제목과, 요약, 그 글로의 링크가 나타난다. */ #include <stdio.h> #include “qDecoder.c” /* Web
에서의 작동을 위해 cgiserver.net의 query 처리 cgi를 #define UNAME_LEN 20 typedef char asciiz[PWD_LEN]; EXEC SQL INCLUDE sqlca.h; /* error 처리 */ EXEC SQL TYPE asciiz IS CHARZ(PWD_LEN) REFERENCE;
/* asciiz 에 대한 정의 */ putenv(“NLS_LANG=AMERICAN_AMERICA.KO16KSC5601”);
/* Oracle 의 환경 */ qContentType(“text/html”); strcpy(username,”book”); /*
Oracle 로 연결하기 위한 */ EXEC SQL CONNECT :username IDENTIFIED BY :password; /* Oracle 로 연결 */ /* 커서 (CURSOR) 의 사용, 커서는 쿼리문을 수행할 때 이용되는 작업 영역이다. 아래 내용을 살펴보면, 우리가 필요한 자료들, 그러니까 키워드에 해당하는 글의 제목(타이틀)과 그 글의 요약문, 그 글이 저장된 파일명 들을 newhumandahn 이라는 커서로 정의하여 작업을 진행하게 된다. 그리고 설명에서 빠진 join 을 이용한 검색이 이루어지는데, join 이란 서로 다른 두 테이블에서 검색하는 방법을 말한다. */ EXEC SQL DECLARE newhumandahn CURSOR
FOR /* newhumandahn 커서 정의 */ EXEC SQL OPEN newhumandahn; /* 커서를 연다 */ EXEC SQL FETCH newhumandahn INTO :tit,
:ds, :fname; /* 원하는 자료를 */ /* 결과의 출력, HTML 로 */ printf(“<br><center><h2>
RESULT </h2></center><br>”); while(sqlca.sqlcode==0) /* 값이 더 이상
없을 때 까지 */ printf(“</td></tr><tr><td
width=600 height=25><p>”); EXEC SQL FETCH newhumandahn INTO
:tit, :ds, :fname; /* 계속 */ printf(“</table></div>”); EXEC SQL CLOSE newhumandahn; /* newhumandahn 커서 닫음 */ exit(EXIT_SUCCESS); 이상으로 sqlplus 와 Pro*C 에 대한 내용을 마칠까 한다. 제한된 장에 많은 내용을 담으려다 보니 글이 구체적이지 못한 거 같아 죄송한 마음이 든다. 더 자세한 건 매뉴얼이나 기타 Oracle 관련 홈페이지를 방문해 보기 바란다. 다음 호에서는 PHP3 와의 연동을 주제로 이 연재를 마친다. 좀 더 세련된 주제로 방명록을 만들어 볼 것이다. 기대해도 좋다. |