Chapter 17. Oracle 연결

Oracle Database는 기업에서 가장 많이 사용하는 상용 관계형 데이터베이스 관리 시스템(RDBMS)입니다.
금융, 공공기관, 대기업, 대학, 병원 등 대규모 데이터를 처리하는 시스템에서 널리 사용됩니다.
파이썬에서는 oracledb 라이브러리를 이용하여 Oracle Database와 연동할 수 있습니다.
- 대용량 데이터 처리에 적합하다.
- 높은 안정성과 보안성을 제공한다.
- 트랜잭션(Transaction) 처리 성능이 우수하다.
- 기업 및 공공기관에서 많이 사용된다.
- SQL과 PL/SQL을 지원한다.
- 은행 시스템
- 공공기관 업무 시스템
- 대학 학사관리
- 병원 관리 시스템
- ERP
- 그룹웨어
| Oracle | MySQL |
|---|---|
| 상용 DB | 오픈소스 DB |
| 대기업·공공기관 | 웹 서비스 |
| 대용량 데이터 | 중·소규모 서비스 |
| 고성능·고가용성 | 설치와 관리가 간편 |
Oracle Database는 공식 홈페이지에서 다운로드하여 설치할 수 있습니다. 학습용으로는 Oracle Database Express Edition(XE)을 많이 사용합니다.
- Oracle Database XE 설치
- Listener 설치
- 데이터베이스 생성
- 관리자 계정 설정
sqlplus
system
비번
sqlplus / as sysdba
show user
conn system/1234
create user hong identified by 1234;
grant connect, resource to hong;
conn hong/1234
SELECT table_name FROM user_tables WHERE table_name = '테이블명';
desc 테이블명;
commit;
exit;
- Host: localhost
- Port: 1521
- Service Name: XE 또는 FREEPDB1
- User: system 또는 사용자 계정
- Password: 설치 시 설정한 비밀번호
Oracle Database 23ai Free에서는 서비스 이름으로 FREEPDB1을 사용하는 경우가 많으며, Oracle XE에서는 XE를 사용하는 경우가 많습니다.
예를 들어 SQL Developer에서 다음과 같이 접속합니다.
- Host: localhost
- Port: 1521
- Service Name: XE
- User: system
- Password: ****
접속이 성공하면 SQL을 실행할 수 있습니다.
파이썬에서 Oracle Database를 사용하려면 oracledb 라이브러리를 설치해야 합니다.
pip install oracledb
pip show oracledb
import oracledb
import oracledb
conn = oracledb.connect(
user="system",
password="1234",
host="localhost",
port=1521,
service_name="XE"
)
print("Oracle 연결 성공")
conn.close()
Cursor는 SQL 문장을 실행하는 객체입니다.
cursor = conn.cursor()
cursor.execute("SELECT * FROM member")
drop table member;
create table member(
member_id number generated by default as identity primary key,
name varchar2(50),
age number
);
Oracle에서는 다음과 같은 자료형을 가장 많이 사용합니다.
| 자료형 | 설명 |
|---|---|
| NUMBER | 숫자 |
| VARCHAR2 | 문자열 |
| DATE | 날짜 |
| TIMESTAMP | 날짜와 시간 |
| CLOB | 긴 문자열 |
CRUD는 데이터베이스에서 가장 많이 사용하는 기능입니다.
- Create: INSERT
- Read: SELECT
- Update: UPDATE
- Delete: DELETE
콘솔로 입력받아서 삽입하는 프로그램
import oracledb
c password='oracle', host='localhost',
port=1521, service_name='xe') # 11버전
name = input("이름을 입력하세요: ")
age = int(input("나이를 입력하세요: "))
cursor = conn.cursor()
cursor.execute("insert into member (name, age) values (:1, :2)", (name, age))
conn.commit()
cursor.close()
conn.close()
print("오라클과 연결이 종료되었습니다.")
member 테이블의 모든 레코드를 조회하는 프로그램
import oracledb
c password='oracle',
host='localhost', port=1521, service_name='xe') # 11버전
cursor = conn.cursor()
age = int(input("나이를 입력하세요: "))
cursor.execute("select * from member where age >= :1", (age,))
rows = cursor.fetchall()
for row in rows:
print(row[0], row[1], row[2])
cursor.close()
conn.close()
print("오라클과 연결이 종료되었습니다.")
member 테이블의 레코드를 수정하는 프로그램
import oracledb
c password='oracle',
host='localhost', port=1521, service_name='xe') # 11버전
cursor = conn.cursor()
id = int(input("id를 입력하세요: "))
name = input("name을 입력하세요: ")
age = int(input("age를 입력하세요: "))
cursor.execute("update member set name = :1, age = :2 where member_id = :3",
(name, age, id))
conn.commit()
cursor.close()
conn.close()
print("오라클과 연결이 종료되었습니다.")
member 테이블의 레코드를 삭제하는 프로그램
import oracledb
c password='oracle',
host='localhost', port=1521, service_name='xe') # 11버전
cursor = conn.cursor()
id = int(input("id를 입력하세요: "))
cursor.execute("delete from member where member_id = :1", (id,))
conn.commit()
cursor.close()
conn.close()
print("오라클과 연결이 종료되었습니다.")
Oracle에서는 자동 증가 번호를 위해 시퀀스를 많이 사용합니다.
CREATE SEQUENCE seq_member
START WITH 1
INCREMENT BY 1;
INSERT INTO member(member_id, name, age)
VALUES(
seq_member.NEXTVAL,
'홍길동',
20
);
CREATE TABLE member(
member_id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name VARCHAR2(50),
age NUMBER
);
INSERT INTO member(name, age) # 자동으로 번호가 증가합니다. VALUES ('홍길동', 20); INSERT INTO member(member_id, name, age) # 직접 번호를 넣을 수도 있다 VALUES (100, '이영희', 30);
시퀀스(Sequence) 방식과 IDENTITY 방식 비교
| 구분 | SEQUENCE(11g, 12c이상) | IDENTITY(12c이상) |
|---|---|---|
| 생성 방식 | 별도 객체명을 create | 테이블에 포함 |
| 번호 생성 | 객체명.nextval | 자동 |
| INSERT | nextval 사용 | ID 생략 가능 |
| 여러 테이블 사용 | 가능 | 불가능(1개의 테이블에만 가능) |
| 관리 | 유연함 | 간단 |
현재 날짜를 저장할 때는 SYSDATE를 사용합니다.
import oracledb
conn = oracledb.connect(
password='oracle', host='localhost', port=1521, service_name='xe') # 11버전
title = input("제목을 입력하세요: ")
cursor = conn.cursor()
cursor.execute("""insert into board
(board_id, title, created_at)
values(board_seq.nextval, :1, SYSDATE)""",
(title,))
conn.commit()
cursor.close()
conn.close()
print("오라클과 연결이 종료되었습니다.")
| MySQL | Oracle |
|---|---|
| %s 바인드 변수 | :1, :2 바인드 변수 |
| AUTO_INCREMENT | SEQUENCE |
| INT | NUMBER |
| VARCHAR | VARCHAR2 |
| NOW() | SYSDATE |
- Oracle Database는 대규모 데이터를 처리하는 상용 RDBMS이다.
- oracledb 라이브러리를 통해 파이썬과 연동할 수 있다.
- Oracle 설치 후 기본 접속 정보를 통해 SQL Developer에서 접속할 수 있다.
- CRUD 기능을 통해 데이터베이스의 데이터를 관리할 수 있다.
- 시퀀스 방식과 IDENTITY 방식으로 자동 증가 번호를 생성할 수 있다.
- SYSDATE를 사용하여 현재 날짜를 저장할 수 있다.