Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
PHẦN I : CÁC KHÁI NIỆM CƠ BẢN
CHƯƠNG I : GIỚI THIỆU OCI VÀ NHỮNG ĐẶC TÍNH CỦA NÓ
I-Oracle Call Inteface(OCI)
SQL là ngôn ngữ lập trình không có cấu trúc . Chương trình viết trong nó dùng tập dữ liệu để
hoạt động nhưng sẽ không xác đònh những hoạt động gì được thực thi , hoặc những hoạt động
đó thực thi như thế nào . SQL dễ học và dễ dùng để giải quyết CSDL . Nó cụng là một ngôn
ngữ chuẩn dùng để truy cập và thao dữ liệu trong các quan hệ hiện đại và quan hệ hướng đối
tượng trong các hệ thống CSDL .
Tuy nhiên hầu hết các ngôn ngữ có cấu trúc như C , C++ thì việc thực thi của hầu hết các câu
lệnh phụ thuộc vào những câu lệnh trước đó hoặc những câu lệnh lồng bên trong nó và những
câu lệnh điều khiển như lặp , rẽ nhánh mà không có trong SQL . Những ngôn ngữ có cấu trúc
phức tạp hơn SQL nhưng chúng mềm dẻo và mạnh hơn SQL .
OCI cho phép phát triển những ứng dụng mà trong đó có sự liên kết khả năng truy cập dữ liệu
của SQL và C . OCI hổ trợ tất cảcác đònh nghóa dữ liệu SQL , thao tác dữ liệu , truy vấn , các
điều khiển thuận lợi mà đã có sẳn trong Oracle8 Server .
PL/SQL cũng có nhiều thuận lợi vì nó là mở rộng từ Oracle theo thủ tục đến SQL . Theo đó
các ứng dụng có thể phát triển mềm dẻo và mạnh hơn các ứng dụng chỉ viết bằng SQL . Vì
vậy OCI cung cấp các thuận lợi trong việc truy cập và thao tác các đối tượng trong Oracle 8
Server .
OCI là một phần mềm giao tiếp cho phép thao tác dữ liệu và sơ đồ CSDL Oracle . Hình 1-1
cho thấy việc dòch và liên kết một chương trình OCI tương tự như việc dòch và liên kết một ứng
dụng không phải là CSDL . Không cần bước xử lý trước hoặc dòch trước .
Hình 1-1 : Quá trình phát triển OCI
Chú ý : Trong một số phần cứng chuẩn cần một số thư viện khác thêm vào thư viện OCI để
liên kết các chương trình OCI đúng đắn hơn . Cần kiểm tra tài liệu về hệ thống Oracle của bạn
để biết cần phải thêm những thư viện nào cần thêm vào.
II- Các phát biểu SQL
Trang
1
Source
file
Hast Language
compiler
Object File
Hast Linker
Application
OCI Library
Oracle8
Server
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
Một trong những việc chính của SQL là xử lý các phát biểu . Các phát biểu khác nhau cần
những bước xử lý khác nhau . Điều này rất quan trọng trong việc mã hoá ứng dụng OCI .
Oracle8 thừa nhận 8 loại phát biểu sau :
ª Ngôn ngữ đònh nghóa dữ liệu (DDL)
ª Các phát biểu điều khiển
ª Điều khiển thực thi
ª Điều khiển hệ điều hành
ª Điều khiển hệ thống
ª Ngôn ngữ thao tác dữ liệu (DML)
ª Truy vấn
Ghi chú: các truy vấn được phân loại như các phát biểu DML nhưng các ứng
dụng OCI xử lý truy vấn khác nhau . Vì vậy chúng phải được suy nghó một
cách riêng biệt .
ª PL/SQL
ª SQL nhúng
1 . Ngôn ngữ đònh nghóa dữ liệu
Các phát biểu DDL quản lý sơ dồ các đối tượng trong CSDL . Các phát biểu .DDL tạo ra các
bảng mới , xoá các bảng cũ , thiết lập sơ đồ các đốitượng khác . Vì vậy chúng diều khiển truy
cập đến một sơ đồ các đối tượng . Ví dụ :
CREATE TABLE employees
(name VARCHAR2(20) ,
ssn VARCHAR2(12) ,
empno NUMBER(6) ,
mgr NUMBER(6) ,
salary NUMBER(6))
GRANT UPDATE , INSERT ,DELETE ON employees TO joe
REVOKE UPDATE ON employees FROM scott
Các phát biểu DDL cũng cho phép bạn làm việc với các object trong Oracle8 Server các phát
biểu sau sẽ tạo ra một bảng các object
CREATE TYPE person_t AS OBJECT(
name VARCHAR2(30),
ssn VARCHAR2(12),
address VARCHAR2(50))
CREATE TABLE person_tab OF person_t
2 . Các phát biểu điều khiển
Các ứng dụng OCI giải quyết các điều khiển thực thi , điều khiển hệ điều hành , diều khiển hệ
thống tương tự như các phát biểu DML .
3 . Ngôn ngữ thao tác dữ liệu
Các phát biểu DML có thể thay dữ liệu trong các bảng CSDL . Chẳng hạn các phát biểu DML
dung để :
Thêm các hàng vào một bảng
Cập nhật các giá trò của các cột tồn tại trong các hàng
Trang
2
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
Xoá các hàng trong một bảng
Khoá một bảng trong CSDL
Giải quyết quá trình thực thi cho một phát biểu SQL
Các phát biểu DML có thể yêu cầu một ứng dụng cung cấp dữ liệu cho CSDL , là đầu vào
được đóng gói (binding)
Binding
Hầu hiết các phát biểu DML và một số truy vấn yêu cầu một chương trình đưa dữ liệu vào
Oracle như là một phần của các phát biểu SQL hoặc PL/SQL . Khi chương trình được dòch cần
phải biết dữ liệu là hằng hay dạng chữ . Ví dụ phát biểu SQL sau sẽ thêm một employee vào
CSDL
INSERT INTO emp VALUES
(2365,'BESTY','PROGRAMMER',2000,20)
Một phát biểu cứng nhắc như vậy sẽ có một vài hạn chế . Bạn phải thay đổi phát biểu và dòch
lại chương trình mỗi khi thêm employee mới vào CSDL . Để chương trình mềm dẻo hơn bạn có
thể viết chương trình để user nhập dữ liệu mỗi khi chương trình chạy .
Khi chuẩn bò cho một phát biểu SQL hoặc khối PL/SQL mà dữ liệu được cung cấp vào lúc
chạy . Ví dụ , phát biểu SQL có 5 nơi giữ dữ liệu đại diện cho 5 đầu vào dữ liệu (bắt đầu bằng
":")
INSERT INTO emp VALUES
(:empno,:ename,:job,:sal,:deptno)
Bạn có thể dùng nơi giữ dữ liệu đại diện cho các biến đầu vào trong các phát biểu DELETE ,
INSERT , SELECT , UPDATE hoặc khối PL/SQL ở bất kỳ vò trí nào của phát biểu , chúng có
thể là biểu thức hoặc giá trò dạng chữ . Đối với khối PL/SQL các nơi giữ dữ liệu có thể đại diện
cho các biến đầu ra . Tên của chúng không được dùng để đặt tên cho các đối tượng khác của
Oracle như table hoặc column .
đối với mỗi nơi giữ dữ liệu trong phát biểu SQL hoặc khối PL/SQL bạn phải gọi một thủ tục
OCI mà nhận đòa chỉ của biến chỉ đến nơi chứa dữ liệu . Khi phát biểu thực thi , Oracle nhận
dữ liệu mà chương trình đặt trong input , bind , biến và gởi nó đến server cùng với phát biểu
SQL đó .
4 . Các truy vấn
Truy vấn là phát biểu nhận dữ liệu từ một CSDL . Một truy vấn có thể trả về không , một ,
hoặc nhiều hàng dữ liệu . Tất cả các truy vấn bắt đầu bằng từ khóa SELECT
Các truy vấn truy cập dữ liệu trong các bảng và chúng được phân loại cùng với các phát biểu
DML . Tuy nhiên các ứng dụng OCI xử lý các truy vấn khác nhau , do vậy chúng phải được
xác đònh riêng biệt .
Các truy vấn yêu câàu chương trình cung cấp dữ liệu đến CSDL sử dụng các biến đầu vào
(bind) như ví dụ sau :
SELECT name
FROM employees
WHERE empno= :empnumber
Trong phát biểu SQL trên , :empnumber là một nơi giữ dữ liệu đại diện cho một giá trò sẽ được
cung cấp bởi ứng dụng đó .
Khi xử lý một truy vấn , một ứng dụng OCI cần đònh nghóa các biến output để nhận các giá trò
trả về . Trong phát biểu trên cần đònh nghóa một biến output để nhận giá trò name trả về .
Trang
3
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
Defining
Các phát biểu sẽ trả dữ liệu liệu về từ CSDL đến ứng dụng của bạn . Khi xử lý một truy vấn
bạn phải đònh nghóa một biến output hoặc một mảng các biến output cho mỗi phát biểu
SELECT mà bạn muốn nhận dữ liệu từ nó . Bước đònh nghóa sẽ tạo ra sự kết hợp để xác
đònh nơi chứa kết quả trả về và theo đònh dạng gì .
VD : SELECT name,ssn
FROM employees
WHERE empno=:empnum
Bạn cần phải đònh nghóa hai output , một để nhận giá trò trả về từ cột name , một để nhận
giá trò trả về từ cột ssn
5 . PL/SQL
PL/SQL là các mở rộng theo hướng thủ tục của SQL . PL/SQL xử lý các công việc phức tạp
hơn các truy vấn và các phát biểu SQL . PL/SQL cho phép nhóm một số phát biểu thành một
khối đơn và thực thi như một đơn vò . Đó là :
Một hoặc nhiều phát biểu SQL
Các khai báo biến
Các phát biểu phân công
Các phát biểu điều khiển thủ tục như : IF…THEN…ELSE , LẶP
Ngoại trừ handing
Có thể dùng khối PL/SQL trong chương trình để :
Gọi các thủ tục và hàm
Dòch các phát biểu điều khiển thủ tục cùng với các phát biểu SQL để thực thi
như một đơn vò
Truy cập các thuộc tính PL/SQL đặc biệt như record , table , con trỏ các vòng
lặp , ngoại trừ handing
Sử dụng các biến con trỏ
Truy cập và thao tác các đối tượng trong một Oracle8 server
Ví dụ PL/SQL sau cho thấy một phát biểu SQL để nhận những giá trò từ một bảng employees .
Ví dụ này giải thích cách sử dụng nơi giữ dữ liệu trong các phát biểu PL/SQL
BEGIN
SELECT ename,sal,comm INTO :emp_name,:salary,:commission
FROM emp
WHERE ename=:emp_number
END;
Với ý nghóa đó các nơi giữ dữ liệu không phải là các biến PL/SQL mà chúng chỉ tượng trưng
cho các biến đầu vào khi phát biểu được xử lý . Chúng cần để giao tiếp với các biến của C
trong chương trình của bạn .
6 . SQL nhúng
OCI xử lý các phát biểu như là các câu của văn bản mà một ứng dụng truyền đến Oracle thực
thi . Các trình biên dòch trước của Oracle (Pro*C/C++ , Pro*COBOL , Pro* FORTRAN) cho
phép lập trình viên nhúng các phát biểu SQL trực tiếp vào mã chương trình ứng dụng của họ .
Bước dòch trước là cần thiết để tạo ra một ứng dụng có thể thực thi .
Trang
4
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
III . Các từ đặc biệt của OCI
Các từ đặc biệt để chỉ các phần khác nhau của một phát biểu SQL . Ví dụ một phát biểu SQL
như sau :
SELECT customer,address
FROM customers
WHERE bus_type='SOFTWARE'
AND sales_volume=:sales
bao gồm các phần sau :
+ Một lệnh SQL : SELECT
+ Hai select-list item : customer và address
+ Một tên của bảng trong mệnh đề FROM : customers
+ Hai cột trong mệnh đề WHERE : bus_type và sales_volume
+ Một giá trò đầu vào dạng chữ trong mệnh đề WHERE : 'SOFTWARE'
+ Một nơi giữ dữ liệu tượng trưng cho một biến đầu vào trong phần thứ hai của mệnh đề
WHERE : :sales
Khi phát triển một ứng dụng OCI bạn gọi đòa chỉ của các biến vào/ra trong chương trình . Đa
chỉ của nơi giữ dữ liệu đại diện cho dữ liệu vào gọi là bind operation . Đòa chỉ của các biến để
nhận select-list items gọi là define operation . Đối với PL/SQL đều được gọi là operation .
IV. Đối tượng hổ trợ trong OCI
Oracle server có những thuận lợi để làm việc với kiểu đối tượng và các đối tượng . Một object
type là một cấu trúc dữ liệu mô tả một phần tử của thế giới thực do user đònh nhóa . Ví dụ , một
CSDL có thể chứa một đònh nghóa của đối tượng mà đối tượng đó bao gồm các thuộc tính first-
name , last-name , age mô tả những đặc trưng về đònh danh của con người trong thế giới thực .
Đònh nghóa object type là cớ sở cho việc tạo các oject mà mô tả các thực thể của object type .
Sử dụng object type như là đònh nghóa cấu trúc , một đối tượng người được tạo ra với các thuộc
tính 'Jonh' , Bonivento' , '30' . Các object type có thể chứa các method .
OCI của Oracle8 bao gồm các hàm mà có nhiều khả năng điều khiển các oject trong Oracle
server . Đặc biệt là các khả năng sau được thêm vào OCI :
+ Hổ trợ việc thực thi các phát biểu SQL thao tác dữ liệu và thông tin sơ đồ
+ Hổ trợ việc tham chiếu đến các đối tượng và thực thể như các biến đầu vào của phát biểu
SQL
+ Hổ trợ việc tham chiếu đến các đối tượng và thực thể như các biến đầu ra cho các phát biểu
SQL
+ Hổ trợ việc tham chiếu đến các đối tượng và thực thể từ một CSDL
+ Hổ trợ việc mô tả những thuộc tính của một phát biểu SQL mà nó trả về là các thực thể và
các tham chiếu
+ Hổ trợ việc mô tả các thủ tục hoặc hàm của PL/SQL mà có các tham số hoặc kết là đối
tượng .
Thêm vào đó OCI hổ trợ cho việc thao tác trên các object sau khi chúng được truy cập bởi các
phát biểu SQL
V. Các loại hàm của OCI
OCI bao gồm 4 tập hàm chính :
1. OCI relational function : quản lý truy cập dữ liệu và xử lý các phát biểu SQL
2. OCI navigational function : thao tác các đối tượng nhận được từ một Oracle8 server
Trang
5
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
3. OCI datatype mapping and munipulation function : thao tác trên các thuộc tính dữ liệu của
các kiểu Oracle8
4. OCI external procedure function : dùng để viết C gọi từ PL/SQL
VI. Những đặc tính mới của Release 8.0
R 8.0 có những đặc tính mới và những thuận lợi cho việc thực hiện :
Tăêng các chu trình client-side và giảm các yêu cầu server-side
Phát biểu SELECT trả về tập các hàng
API truy cập đến các đối tượng và dữ liệu có liên quan
Giảm số chuyến đi vòng tròn trên mạng
Có khả năng điều khiển các cột LOB
Một tập API gọi thực hiện các thao tác trên LOB và trên FILE
Cải tiến các khả năng của NLS (National Language Support)
Có sự duy chuyển đường dẫn trong OCI và có một số khả năng trộn lẫn việc gọi cũ và mới
trong một ứng dụng
Cải tiến hổ trợ cho nhiều môi trường
Các chức năng thêm vào cung cấp việc truy cập qua lại các object trong một Oracle8
server .
VII.Tại sao phải sử dụng OCI ?
Nói chung có nhiều phương pháp truy cập vào một Oracle database như sử dụng ODBC , SQL
*Plus … Nhưng OCI giúp truy cập trực tiếp vào Oracle database tiết kiệm được thời gian truy
cập . Vấn đề thời gian truy cập càng trở nên có ý nghóa đối với một database lớn .
Tuy nhiên các hàm OCI rất phức tạp(có nhiều thông số ) trở không thân thiện đối với người
dùng . Muốn sử dụng được OCI đòi hỏi người dùng phải am hiểu khá tỉ mỉ về nó . Vì thế mục
đích của đề tài này là xây dựng một giao diện lập trình thân thiện hơn mà người dùng chỉ cần
thao tác một số bước cơ bản thì có thể thực hiện truy cập nhanh chóng và dễ dàng .
VIII. Một số khái niệm
1. Database server : là khóa để giải quyết vấn đề quản lý thông tin , quản số lượng lớn dữ
liệu và cho phép nhiều user truy cập đồng thời cùng một dữ liệu
Một Oracle server bao gồm : một Oracle server instance và một Oracle database .
2. Oracle instance : là sự liên kết giữa các background process và vùng nhớ toàn cục (System
Global area) vùng nhớ dùng chung cho các dữ liệu của user .
Một Oracle instance có hai loại process :
user process : thực thi mã của chương trình ứng dụng
oracle process : thực thi các công việc của user process và background process
nhằm quản lý công việc của oracle server
3. Oracle database : là một hợp các dữ liệu được xem như một đơn vò , chứa và nhận các
thông tin có liên quan với nhau . Một oracle database có thể mở(acessable) hoặc
đóng(unacessable) .
4. Cấu trúc của Oracle database : bao gồm
Logical structure
Physical structure : có 3 loại file
+ data file : chứa dữ liệu
Trang
6
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
+ redo log file : ghi nhận các thay đổi data nhằm ngăn chặn các lỗi
+ control file : dùng để nhận diện database và redo log file
5. Cursor(hay handle) : oracle dùng các vùng dành riêng (private SQL areas) để thi hành các
câu lệnh SQL và lưu trữ thông tin của quá trình . Một cursor là một cấu trúc PL/SQL cho phép
đònh danh các vùng này và truy cập thông tin trong nó .
6. Oracle process : là các process mà sẽ được gọi bởi các process khác để thực hiện công việc
theo yêu cầu của các process khác này . Có 2 loại :
Server process : nhận các yêu cầu của các user process được nối kết đến . Nó giao tiếp với
các user process và tác động vào Oracle để mang về các kết quả theo yêu cầu cho user .
Background process : Oracle tạo một tập các background process cho mỗi instance . Nhằm
đồng bộ việc thực hiện I/O và giám sát các Oracle process từ đó làm tăng tính xử lý song
song để thực thi công việc tốt hơn .
7. Program interface :là cơ cấu mà một user process giao tiếp một server process
8. Transaction : là một đơn vò công việc luận lý bao gồm nhiều SQL statement . Một
transaction bắt đầu với SQL statement có thể thực thi đầu tiên và kết thúc khi nó được commit
hoặc rallback .
Một transaction kết thúc khi xảy ra một trong số các điều sau :
Sử dụng commit statement hoặc rallback statement
Thực thi DDL statement . Nếu transaction hiện tại chứa bất kỳ DML(such as CREATE,
DROP, RENAME, ALTER) statement nào thì đầu tiên Oracle sẽ commit transaction hiện
tại rồi thực thi và commit DDL như một transaction mới .
Disconnect từ Oracle
Một user process kết thúc không bình thường
Sau khi kết thúc một transaction SQL statement có thể thực thi tự động bắt đầu transaction tiếp
theo .
tầm quan trọng của transaction : Oracle duy trì tính nhất quán dữ liệu dựa vào các transaction .
Các transaction cho phép ta điều khiển linh hoạt khi làm việc với dữ liệu và bảo vệ sự toàn
vẹn dữ liệu ngay cả trong trường hợp gặp sự cố hệ thống .
Commit transaction : nghóa là tạo những thay đổi thường xuyên bới các SQL statement trong
transaction đó
Trước khi một transaction sữa chữa dữ liệu được commit thì xảy ra các d-iều sau :
Oracle tạo ra các rollback segment record trong vùng đệm rollback segment của
SGA(system global area) để chứa các giá trò dữ liệu cũ đã bò thay đổi bởi các SQL
statement của transaction .
Oracle đã tạo ra các redo leg trong redo log buffer của SGA . Những thay đổi này có thể
được ghi vào đóa trước khi commit transaction .
Các thay đổi được đưa đến database buffer và chúng có thể đi đến đóa trước khi một
transaction thực sự được commit .
Khi một transaction được commit xảy ra các điều sau :
Bảng transaction bên trong nối kết với các bảng ghi phân đoạn rollback(rollback segment
records) mà transaction đã được commit để ghi vào bảng unique system change
number(SCN) của transaction đó .
Trang
7
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
Process log writer ghi các redo log và SCN vào redo log file . Đây sự kiện cơ bản để thiết
lập commit transaction .
Oracle mở khóa trên các row và table .
Oracle đánh dấu transaction là "complete" .
Rollback transaction : không tạo bất kỳ thay đổi dữ liệu nào mà đã được thực hiện bởi SQL
statement trong một uncommit transaction . Oracle cho phép rollback toàn bộ một uncommit
transaction hoặc từ một savepoint .
IX. Giới thiệu Net8
Net8 là lớp phần mềm được sử dụng để giao tiếp giữa client và server hoặc giữa các server .
Các user process và server process trên các máy khác nhau giao tiếp với nhau thông qua Net8 .
Net8 là một cơ cấu các protocol thực hiện việc phân bố xử lý và phân bố database . Các
protocol đònh nghóa cách truyền và nhận data trên một mạng .
Trong đề tài này việc truy cập oracle database cũng nhờ Net8 để truyền và nhận dữ liệu .
Hình dưới là kiến trúc của Net8 và chương trình ứng dụng sử dụng thư viện OCI để truy cập
vào Oracle database .
CHƯƠNG II : CÁC BƯỚC CƠ BẢN LẬP TRÌNH OCI
I. Cấu trúc chương trình OCI
Nói chung mục tiêu của một ứng dụng OCI là nối kết đến Oracle Server , chọn trước một số
loại trao đổi data thực hiện việc xử lý data . Mỗi ứng dụng OCI được thực hiện theo trình tự các
bước như hình 2-1:
Trang
8
client program
Net8
Oracle protocol
Adapter
Protocol stack
Oracle8
ORDBMS
Net8
Oracle protocol
Adapter
Protocol stack
OCI
Library
Server
Client
Physical Network
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
Hình 2-1 : Lưu đồ chương trình OCI cơ bản
Trên đây là các bước của một chương trình OCI tổng quát . Tuy nhiên tùy thuộc vào chức năng
của chương trình (quản lý nhiều giao tiếp , sử dụng object ,…) thì có thể cần thêm một số bước .
Quá trình OCI chỉ được khởi tạo một lần , một ứng dụng có thể tạo nhiều môi trường như được
minh họa ở hình 2-2 :
Trang
9
Initialize Process
Initialize Enviroment
Allocation Handle and
Data structures
Connect to sever and
begin session
Issue SQL and process
Data
Disconnect
Free handles & Data
Structures
Initialize Process
Initialize Environment
Connect to server
andBegin Session
Connect to server
andBegin Session
Initialize Environment Initialize Environment
AllocateHandles and
Data Structures
AllocateHandles and
Data Structures
AllocateHandles and
Data Structures
Connect to server
andBegin Session
Issue SQL and
Process Data
Free Handles & Data
Structures
Free Handles & Data
Structures
Issue SQL and
Process Data
Issue SQL and
Process Data
Disconnect
Disconnect
Disconnect
Free Handles & Data
Structures
Hình 2-2 : Nhiều môi trường trong một quá trình
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
II. Các cấu trúc của data OCI
Handle và Descriptor là hai cấu trúc không trong suốt được đònh nghóa trong các ứng dụng OCI
và có thể được chỉ đònh trực tiếp thông qua các cách gọi được chỉ đònh rõ ràng , hoặc chỉ đònh
ẩn bởi các hảm OCI .
Handle và Descriptor chứa thông tin liên quan đến data , các nối kết hoặc cách thực hiện của
ứng dụng .
III. Handle
Hầu hết Oracle8 OCI gọi danh sách tham số của chúng hoặc nhiều handle . một handle là một
pointer không trong suốt trỏ đến một vùng lưu trữ được chỉ đònh bởi thư viện OCI . Một handle
có thể được sử dụng để chứa phạm vi hoặc thông tin nối kết , hoặc có thể chứa thông tin về các
hàm OCI hoặc data . Handle có thể lập trình ứng dụng dễ hơn , bởi vì có thư viện để quản lý
data này .
Hầu hết các ứng OCI cần truy cập thông tin được lưu trữ trong handle . để truy cập thông tin
này ta dùnh hai hàm OCI OCIAttrGet() và OCIAttrSet()
Bảng dưới đây đưa ra danh sách các handle được đònh nghóa cho OCI . Mỗi kiểu handle , kiểu
data C và kiểu handle hằng số được đưa ra .
Table 2-1 OCI Handle Types
C Type Description Handle Type
Trang
10
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
OCIEnv OCI environment handle OCI_HTYPE_ENV
OCIError OCI error handle OCI_HTYPE_ERROR
OCISvcCtx OCI service context handle OCI_HTYPE_SVCCTX
OCIStmt OCI statement handle OCI_HTYPE_STMT
OCIBind OCI bind handle OCI_HTYPE_BIND
OCIDefine OCI define handle OCI_HTYPE_DEFINE
OCIDescribe OCI describe handle OCI_HTYPE_DESCRIBE
OCIServer OCI server handle OCI_HTYPE_SERVER
OCISession OCI user session handle OCI_HTYPE_SESSION
OCITrans OCI transaction handle OCI_HTYPE_TRANS
OCIComplexObj
ect
OCI complex object retrieval
(COR) handle
OCI_HTYPE_COMPLEXOBJ
ECT
OCISecurity OCI security service handle OCI_HTYPE_SECURITY
1 . Chỉ đònh và hủy bỏ handle
Ứng dụng của bạn chỉ đònh các handle (trừ bind và define handle) thừa nhận môi trường handle
riêng biệt . Thông qua enviroment handle như một tham số handle chỉ đònh việc gọi . Việc chỉ
đònh handle là rõ ràng .
Bind và define handle được chỉ thò với sự thừa nhận một phát biểu handle và chứa thông tin về
phát biểu được mô tả bởi các handle đó .
Bind và define handle hoàn toàn được chỉ đònh bởi thư việc OCI
Trang
11
Enviroment
Error
handle
service
context
handle
statement
handle
Describe
handle
Security
handle
COR
handle
components of a
sevice context
Bind
handle
define
handle
server
context
handle
user session
handle
transaction
handle
Hình 2-3 : Hệ thống cấp bậc handle
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
Tất cả các handle do user chỉ đònh trừ enviroment handle phải được chỉ đònh bởi việc gọi hàm
OCIHandle() . Enviroment handle được chỉ đònh và khởi tạo bằng việc gọi hàm OCIEnvInit()
mà nó cần cho mọi ứng dụng OCI.
Một ứng dụng OCI phải giải phóng các handle khi chúng không còn cần thiết thông qua hàm
OCIHanleFree() .Khi một handle cha bò giải phóng , tất cả các handle con có liên kết với cũng
bò hủy bỏ và không được sử dụng nữa . Ví dụ , khi một phát biểu handle bò giải phóng thì bất
kỳ bind và define handle có liên kết với nó cũng bò hủy bỏ .
Handle tránh dùng biến toàn cục . Handle cũng dự đoán lỗi dễ hơn . Error handle được để trả
về các lỗi .
2 . Enviroment handle
Enviroment handle xác đònh một ngữ cảnh mà các hàm OCI được gọi trong đó . Mỗi
enviroment handle chứa một vùng cashe cho phép điều khiển vùng nhớ nhanh chóng theo một
môi trường thống nhất . Khi có nhiều tuyến dùng chung một môi trường thì chúng sẽ khóa truy
câp vùng cashe .
Enviroment handle được chuyển đến OCIHandleAllocation() như tham số parenth để chỉ đònh
tất cả các kiểu handle khác , trừ bind và define handle
3 . Error handle
Error handke được truyền như một tham số trong hầu hết việc gọi hàm OCI . Error handle quản
lý thông tin về các lỗi xảy ra trong một hoạt động của OCI .Nếu một lỗi xảy ra khi gọi hàm ,
error handle được truyền đến OCIErrorGet() để thu được thông tin thêm về lỗi xảy ra .
Chỉ đònh error handle là bước đầu tiê trong một ứng dụng OCI .
4 . Service context và associated handle
Một service context handle đònh nghóa những thuộc tính mà xác đònh ngữ cảnh hoạt động của
các lời gọi OCI đến server .
Bạn phải chỉ đònh và khởi tạo service context handle thông qua các hàm
OCIHandleAllocation() hoặc OCILogon() trước khi sử dụng nó .
Sevice context quản lý 3 handle :
Server handle : nhận dạng nguồn dữ liệu .
Trang
12
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
user session handle : đònh nghóa các vai trò , quyền của một user và ngữ cảnh hoạt động mà
các hàm được gọi thực thi
transaction handle : đònh nghóa giao dòch mà các quá trình hoạt động của SQL đïc thực
hiện . Phạm vi giao dòch bao gồm thông tin trạng thái user session , trạng thái đònh sẳn
(fetch state ) và sự đóng gói nhanh (packe instantiation ) .
Các ứng dụng chỉ điều khiển một user session cho mỗi nối kết CSDL , tại một thơi điểm có thể
gọi OCILogon() để chỉ đònh service context và associated handle của nó
Trong các ứng dụng yêu cầu quản lý session phức tạp , service context phải được chỉ đònh rõ
ràng , server handle và user session handle phải đặt rõng ràng trong service context thông qua
gọi hàm OCIServerAttach() và OCISessionBegin() riêng . Một ứng dụng tốt cần xác đònh giao
dòch rõ ràng hoặc sự giao dòch tìm ẩn được tạo ra khi ứng dụng thay đổi CSDL .
5 . Statement handle , Bind handle và define handle
Một statement handle là ngữ cảnh nhận dạng phát biểu SQL hay PL/SQL và các thuộc tính
liên kết của nó .
Thông tin về biến input đã nói trong phần bind handle . Thư viện OCI chỉ đònh một bind handle
cho mỗi phạm vi chứa bởi hàm OCIBindByName() hoặc OCIBindByPos() . User không cần
phải chỉ đònh bind handle . Chúng được chỉ đònh rõ ràng bằng lời gọi bind (bind call) .
Để lưu data trả về bởi một truy vấn được cải tiến và lưu trữ theo sự đònh rõ của các define
handle . Thư viện OCi chỉ đònh một define handle cho mỗi biến output bằng hàm
OCIdefineByPos() . User không cần chỉ đònh define handle . Chúng được chỉ đònh rõ bằng lới
gọi define .
6 . describe handle
Để sử dụng describe ta gọi hàm OCIDescribeAny() . Lời gọi này chứa thông tin về gis3n đồ
các object trong một CSDL (function , procedure) . Lời gọi này nhận một describe handle như
một tham số của nó, thông tin về object được mô tả trong đó . Khi lời gọi hoàn thành describe
handle được đònh vò với thông tin về object . Ư&1ng OCI có thể chứa thông tin mô tả thông qua
các thuộc tính của tham số mô tả
7 . Security handle
8 . Complex object retrieval (COR) handle
Được dùng cho một số ứng dụng OCI làm việc với các object trong một Oracle8 server .
Handle này chứa mô tả COR (COR Descritor ) cung cấp một số lệnh để OCI thu được các
object mà được tham chiếu bởi các object khác .
9 . Các thuộc tính handle
Tất cả các OCI handle có những thuộc tính rõ ràng . Những thuộc tính này htực hiện lưu trữ
data trong handle . Dùng hàm OCIAttrGet() để đọc những thuộc tính handle , dùng hàm
OCIAttrSet() để set thuộc tính .
Ví dụ : các phát biểu sau set username trong transaction handle bằng cách viết thuộc tính
OCI_ATTR_USERNAME .
text username[] = "scott";
err = OCIAttrSet ((dvoid*) mysessp, OCI_HTYPE_SESSION, (dvoid*) username,
(ub4) strlen(username), OCI_ATTR_USERNAME,
(OCIError *) myerrhp);
Tiếp theo việc set các tham số giải thích việc sử dụng OCIAttrGet() để đọc mã hàm của hàm
OCI cuối cùng được xử lý trong một handle (trong trường hợp này là bind handle ) .
Trang
13
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
ub4 fcode = 0;
OCIBind *mybndp;
err = OCIAttrGet( (dvoid*) mybndp, OCI_HTYPE_BIND, (dvoid*) &fcode,
(ub4) 0, OCI_ATTR_FNCODE,(OCIError *) myerrhp);
Một số hàm OCI yêu cầu các thuộc tính handle phải được set trước một giá trò trước khi hàm .
Ví dụ , khi hàm OCISessionBegin() được gọi để thiết lập việc login của user thì username và
password được đưa vào user session handle trước khi lời gọi hàm được tạo thành .
Những hàm OCI khác hữu dụng để trả về data trong các thuộc tính của handle sau khi hàm
hoàn tất . chẳng hạn khi gọi hàm OCIStmtExcute() để thực thi một truy vấn SQL thì thông tin
mô tả liên quan đến select-list items được trả về trong statement handle .
10 . Chỉ đònh vùng nhớ cho user
Kni gọi hàm OCIEnvInit() thì enviroment handle được khởi tạo đồng thời chỉ đònh handle
chung (OCIHandleAlloc())và chỉ đònh descriptor /locator (OCIDescritorAlloc()) sẽ gọi một
tham số xtramem_sz trong danh sách tham số của chúng . Tham số này được dùng để đònh rõ
tổng vùng nhớ của user sẽ được chỉ đònh cho handle đó .
Tiêu biểu , mộtứng dụng sử dụng tham số này để chỉ đònh một cấu trúc đònh nghóa ứng dụng
mà có thời gian sống như handle .
Cấu trúc này được sử dụng cho ứng dụng "bookeeping" hoặc chứa thông tin ngữ cảnh .
Sử dụng tham số xtramem_sz có nghóa là ứng dụng không cần chỉ đònh rõ và phân phối vùng
nhớ cũng như mỗi handle được chỉ đònh và được phân phối . Vùng nhớ này được chỉ đònh song
song với handle cũng như việc giải phóng handle trong các cấu trúc data của user .
IV. Descriptors and Locators
OCI descriptors và Locator là các cấu trúc data không trong suốt quản lý các thông tin data rõ
ràng . OCI có 6 loại descriptor và locator được trình bày trong bảng 2-2 cùng với kiểu data của
C và kiểu hằng của OCI mà nó chỉ đònh descriptor trong lời gọi đến hàm OCIDescriptoAlloc() .
Hàm OCIDescriptorAlloc() giải phóng các descriptor và locator .
Table 2-2 Descriptor Types
C Type Description OCI Type Constant
OCISnapshot snapshot descriptor OCI_DTYPE_SNAP
OCILobLocator LOB datatype locator OCI_DTYPE_LOB
OCILobLocator FILE datatype locator OCI_DTYPE_FILE
OCIParam read-only parameter descriptor OCI_DTYPE_PARAM
OCIRowid ROWID descriptor OCI_DTYPE_ROWID
OCIComplexObjectComp complex object descriptor
OCI_DTYPE_COMPL
EXOBJECTCOMP
OCISnapshot : được dùng trong việc thực thi các phát biểu
OCILOBLocator : được sử dụng cho LOB (OCI_DTYPE_LOB) hoặc FILE
(OCI_DTYPE_FILE) .
OCIParam : được sử dụng cho các lời gọi mô tả
OCIRowid : đïc sử dụng cho binding hoặc defining các giá trò ROWID
OCIComplexObjectComp : được sử dụng cho thu các object phức hợp
Trang
14
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
1 . OCISnapshot descriptor
Là một tham số tùy chọn để thực thi lời gọi hàm OCIStmtExcute() . Nó ngụ ý rằng một truy
vấn được thực thi tại một thời điểm tương phản với một database snapshot . Một database
snapshot mô tả trạng thái của một database tại một thời điểm .
Có thể chỉ đònh một snapshot descriptor bằng lời gọi OCIDescriptorAlloc() thông qua tham số
kiểu OCI_DTYPE_SNAP
2 . LOB Datatype Locator
Một LOB (large object) là một kiểu data của Oracle có thể lê đến 4Gbytes data dạng nhò phân
(BLOB) hoặc dạng ký tự (CLOB) . Trong một database , một cấu trúc data không trong suốt
gọi đến LOB Locator được lưu trong cột LOb của một của database hoặc thuộc tính LOB của
một object . Locator như một pointer trỏ đến giá trò LOB thực mà được chứa trong một vò trí
riêng biệt .
OCI LOB Locator được sử dụng để thực hiện các hoạt động của OCI tương ứng với một LOB
(BLOB , CLOB) . Các hàm OCI không nhận các giá trò LOB thực như các tham số , tất cả các
lời gọi hoạt động trên cơ sở LOB locator . Descriptor này , OCI Lob Locator cũng được sử dụng
trong các hoạt động trên FILE
Chú ý : hai kiều LOB locator không được hoán đổi nhau khi liên kết hoặc đònh nghóa một
BLOB hặc CLOB , ứng dụng nhận locator hợp lệ khi chỉ đònh việc sử dụng
OCI_DTYPE_LOB . Tương tự đối với BFILE , ứng dụng phải chỉ đònh locator sử dụng
OCI_DTYPE_FILE khi liên kết và đònh nghóa .
Một ứng dụng OCI có thể thu được một locator từ server bằng cách đưa ra một phát biểu SQL
chứa cột LOB hoặc thuộc thuộc tính như là một phần tử trong select-list . Trong ví dụ này OCI
đầu tiên sẽ chỉ đònh LOB locator sau đó sử dụng nó để đònh nghóa một biến output .
Tương tự , một LOB locator được sử dụng như một phần của một hoạt động liên kết để tạo một
sự kết hợp giữa một LOB và một nơi chứa (placeholder) .
Trong một phát biểu SQL :Kiểu data locator (OCI Lob Locator) là kiểu data không có hiệu lực
khi nối kết với Oracle server .
3 . Parameter Descriptor
Các ứng dụng OCI sử dụng các parameter descriptor để thu được thông tin về các cột select-list
hoặc giản đồ các object . Thông tin này được thu thông qua một hoạt động mô tả .
Parameter descriptor là một kiểu descriptor không chỉ đònh việc sử dụng
OCIDescriptorAlloc() . Bạn chỉ có thể thu được nó như một thuộc tính mô tả, phát biểu hoặc
liên kết để thu được đối tượng phức hợp thông qua đònh rõ vò trí của tham số khi gọi
OCIParametetGet() .
4 . ROWID descriptor
ROWID descriptor được sử dụng bởi các ứng dụng mà cần cần phục hồi và sử dụng các Oracle
ROWID . Kích thước và cấu trúc của ROWID đã bò thay đổi từ Oracle7 sang Oracle8 và nó
không trong suốt đối với user . Để làm việc với một ROWID sử dụng Oracle8 OCI , một ứng
dụng có thể đònh nghóa một ROWID descriptor với một vò trí trong select-list của SQL và thu
được một ROWID vào descriptor . Descriptor này sau đó được ràng buộc đến một biến input
trong phát biểu INSERT hoặc mệnh đề WHERE .
5 . Complex object descriptor
Để sử dụng các object chương trình phải được khởi tạo trong chế độ OCI_OBJECT dùng hàm
OCIInitialize().
Trang
15
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
6 . Chỉ đònh vùng nhớ cho user
Lời gọi hàm OCIDescriptorAlloc() có tham số xtramem_sz trong select-list . Tham số này được
dùng để đònh rõ vùng nhớ cho user được chỉ đònh cùng với locator hoặc descriptor .
tiêu biểu , một ứng dụng sử dụng tham số này để chỉ đònh một cấu trúc ứng dụng được đònh
nghóa có thời gian sống như descriptor hoặc locator . Cấu trúc này được sử dụng cho ứng dụng
"bookeeping" hoặc lưu trữ thông tin ngữ cảnh .
Sử dụng tham số xtramem_sz có nghóa là ứng dụng không cần chỉ đònh rõ ràng và phân phối
vùng nhớ cũng như mỗi descriptor hoặc locator phải được chỉ đònh và phân phối . Vùng nhớ
này được chỉ đònh cùng với locator hoặc descriptor cũng như giải phóng descriptor hoặc locator
khỏi cấu trúc data của user .
Hàm OCIHandleAlloc() có một tham số giống như việc sử dụng vùng nhớ cho user mà có thời
gian sống như handle .
Hàm OCIEnvInit() có một tham số giống như việc sử dụng vùng nhớ cho user mà có thời gian
sống như enviroment handle .
V. Các bước lập trình OCI
Mỗi bước bạn thực hiện trong một ứng dụng OCI được mô tả chi tiết hơn trong các phần sau .
Một vài bướclà tùy ý . Chẳng hạn bạn không cần phải mô tả hoặc đònh nghóa select-list items
nếu phát biểu không phải là một truy vấn .
Các phần sau mô tả các bước được yêu cầu đối với một ứng dụng Oracle8 OCI :
Có 3 bước chính để khởi tạo môi trường OCI :
1 . Khởi tạo một quá trình OCI
Quá trình khởi tạo OCIInitialize() phải được gọi trước khi gọi các hàm OCI khác . Tham số
mode đònh rõ ứng dụng chạy trong một môi trường liên kết (mode=OCI_THREAD) hoặc sẽ tạo
ứng dụng các objedt(mode=OCI_OBJECT) . Khởi tạo chế độ object nếu ứng dụng liên kết và
đònh nghóa các object hoặc ứng dụng sử dụng các object navigation của OCI .
Vì vậy chương trình chọn để sử dụng hoặc những thuộc tính này (mode=OCI_DEFAULT) hoặc
cả hai chọn lựa độc lập (mode=(OCI_THREAD | OCI_OBJECT)) .
User đònh rõ hàm OCIInitialize() để đònh nghóa các hàm quản lý bộ nhớ
2 . Chỉ đònh các handle và descriptor
Sử dụng hàm OCIHandleAlloc() để chỉ đònh các handle , trong trường hợp OCI đã chỉ đònh
handle thì không cần dùng hàm này(chẳng hạn dùng hàm OCIDefineByPos() thì OCI chỉ đònh
handle).
Tùy theo chức năng của ứng dụng mà một số handle trong các handle sau được chỉ đònh :
• error handle (tùy chọn)
• service context handle (bắt buộc)
• statement handle (bắt buộc)
• describe handle (tùy chọn)
• server handle (bắt buộc)
• user session handle (bắt buộc)
• transaction handle (tùy chọn)
• complex object retrieval handle (tùy chọn)
3.Khởi tạo , nối kết vào tạo session
Sau khi gọi hàm OCIInitialize() phải gọi hàm OCIEnvInit() để khởi tạo environment handle .
Lúc này có hai tùy chọn
Trang
16
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
Tùy chọn 1 : Single User, Single Connection
Ứng dụng chỉ quản lý một single user session cho mỗi nối kết database tại một thời điểm với
username và password cụ thể .
Ví dụ :
OCILogon(envhp, errhp, &svchp, "scott", nameLen, "tiger", passwdLen, "oracle8",
dbnameLen)
Kết thúc nối kết bởi hàm OCILogoff().
Trong trường hợp này service context, server và user session handles là chỉ đọc
Tùy chọn 2 : Multiple Sessions hoặc Connections
Sử dụng khi ứng dụng quản lý nhiều user session trên một nối kết database . Phải sử dụng các
hàm
OCIServerAttach() :để tạo đường truy cập nguồn dữ liệu
OCISessionBegin() : cho phép user có thể làm việc trên server đó .
4.Xử lý SQL
5.Commit hoặc Rollback
Để ghi nhận thay đổi đến database dùng hàm OCITransCommit() .Ứng dụng có thể tạo
transaction tường minh hoặc không tường minh .
Để rollback một transaction dùng hàm OCITransRollback() . Nếu ứng dụng disconnect từ
Oracle mà không phải logout và không gọi hàm OCITransCommit() thì các transaction tích cực
được tự động rollback .
6.Kết thúc ứng dụng
Phải gọi các hàm sau đây ở bước kết thúc ứng dụng OCI:
1. OCISessionEnd() : để xoá user session cho mỗi session.
2. OCIServerDetach() :xoá đường truy cập vào mỗi dữ liệu nguồn.
3. OCIHandleFree() :giải phóng các handle
Hoặc
4. Xoá environment handle(các handle liên kết với nó đực giải phóng tự động).
ƠNG III : CÁC KIỂU DỮ LIỆU
Giá trò dữ liệu được lưu bên database theo đònh dạng riêng được gọi là kiểu dữ liệu bên trong
(internal datatype). Ví dụ : CHAR , NUMBER , DATE
Chương trình ứng dụng không làm việc với kiểu dữ liệu bên trong mà chỉ làm việc với kiểu dữ
liệu của một ngôn ngữ lập trình cụ thể . Khi có sự truyền dữ liệu giữa OCI client program và
database table thì thư viện OCI sẽ chuyển đổi từ internal datatype sang external datatype .
External datatype là các kiểu dữ liệu của một ngôn ngữ lập trình , nó được đònh nghóa trong các
file header .
Table 3-1 Internal Oracle Datatypes
Internal Oracle Datatype Maximum Internal Length Datatype Code
VARCHAR2 4000 bytes 1
NUMBER 21 bytes 2
LONG 2^31-1 bytes 8
ROWID 10 bytes 11
DATE 7 bytes 12
RAW 2000 bytes 23
Trang
17
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
LONG RAW 2^31-1 bytes 24
CHAR 2000 bytes 96
MLSLABEL 255 bytes 105
User-defined type (object type,
VARRAY, Nested Table)
<N/A> 108
REF <N/A> 111
CLOB <N/A> 112
BLOB <N/A> 113
Table 3-2 External Datatypes and Codes
TYPE OF PROGRAM
VARIABLE OCI DEFINED CONSTANT NAME CODE
VARCHAR2 1 char[n] SQLT_CHR
NUMBER 2 unsigned char[21] SQLT_NUM
8-bit signed
INTEGER
3 signed char SQLT_INT
16-bit signed
INTEGER
3 signed short, signed int SQLT_INT
32-bit signed
INTEGER
3 signed int, signed long SQLT_INT
FLOAT 4 float, double SQLT_FLT
Null-terminated
STRING
5 char[n+1] SQLT_STR
VARNUM 6 char[22] SQLT_VNU
LONG 8 char[n] SQLT_LNG
VARCHAR 9 char[n+sizeof(short integer)] SQLT_VCS
ROWID 11 char[n] SQLT_RID (see note 1)
DATE 12 char[7] SQLT_DAT
VARRAW 15
unsigned char[n+sizeof(short
integer)]
SQLT_VBI
RAW 23 unsigned char[n] SQLT_BIN
LONG RAW 24 unsigned char[n] SQLT_LBI
UNSIGNED
INT
68 unsigned SQLT_UIN
LONG
VARCHAR
94 char[n+sizeof(integer)] SQLT_LVC
LONG
VARRAW
95 unsigned char[n+sizeof(integer)] SQLT_LVB
CHAR 96 char[n] SQLT_AFC
CHARZ 97 char[n+1] SQLT_AVC
ROWID
descriptor
104 OCIRowid SQLT_RDD
Trang
18
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
MLSLABEL 106 char[n] SQLT_LAB
NAMED DATA
TYPE
108 struct SQLT_NTY
REF 110 OCIRef SQLT_REF
Character LOB 112 OCILobLocator (see note 3) SQLT_CLOB
Binary LOB 113 OCILobLocator (see note 3) SQLT_BLOB
Binary FILE 114 OCILobLocator SQLT_FILE
OCI string type 155 OCIString SQLT_VST (see note 2)
OCI date type 156 OCIDate SQLT_ODT (see note 2)
Table 3-4 Format of the DATE Datatype
Byte 1 2 3 4 5 6 7
Meaning Century Year Month Day Hour Minute Second
Example
(for 30-NOV-1992, 3:17 PM)
119 192 11 30 16 18 1
Sau đây là đònh nghóa một số kiểu trong file oractypes.h
#ifndef ORASTDDEF
# include <stddef.h>
# define ORASTDDEF
#endif
#ifndef ORALIMITS
# include <limits.h>
# define ORALIMITS
#endif
#ifndef SX_ORACLE
#define SX_ORACLE
#define SX
#define ORATYPES
#ifndef TRUE
# define TRUE 1
# define FALSE 0
#endif
#ifdef lint
# ifndef mips
Trang
19
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
# define signed
# endif
#endif
#ifdef ENCORE_88K
# ifndef signed
# define signed
# endif
#endif
#if defined(SYSV_386) || defined(SUN_OS)
# ifdef signed
# undef signed
# endif
# define signed
#endif
#ifndef lint
typedef int eword;
typedef unsigned int uword;
typedef signed int sword;
#else
#define eword int
#define uword unsigned int
#define sword signed int
#endif
#define EWORDMAXVAL ((eword) INT_MAX)
#define EWORDMINVAL ((eword) 0)
#define UWORDMAXVAL ((uword)UINT_MAX)
#define UWORDMINVAL ((uword) 0)
#define SWORDMAXVAL ((sword) INT_MAX)
#define SWORDMINVAL ((sword) INT_MIN)
#define MINEWORDMAXVAL ((eword) 32767)
#define MAXEWORDMINVAL ((eword) 0)
#define MINUWORDMAXVAL ((uword) 65535)
#define MAXUWORDMINVAL ((uword) 0)
#define MINSWORDMAXVAL ((sword) 32767)
#define MAXSWORDMINVAL ((sword) -32767)
#ifndef lint
# ifdef mips
typedef signed char eb1;
# else
Trang
20
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
typedef char eb1;
# endif
typedef unsigned char ub1;
typedef signed char sb1;
#else
#define eb1 char
#define ub1 unsigned char
#define sb1 signed char
#endif
#define EB1MAXVAL ((eb1)SCHAR_MAX)
#define EB1MINVAL ((eb1) 0)
#if defined(mips)
# ifndef lint
# define UB1MAXVAL (UCHAR_MAX)
# endif
#endif
#ifndef UB1MAXVAL
# ifdef SCO_UNIX
# define UB1MAXVAL (UCHAR_MAX)
# else
# define UB1MAXVAL ((ub1)UCHAR_MAX)
# endif
#endif
#define UB1MINVAL ((ub1) 0)
#define SB1MAXVAL ((sb1)SCHAR_MAX)
#define SB1MINVAL ((sb1)SCHAR_MIN)
#define MINEB1MAXVAL ((eb1) 127)
#define MAXEB1MINVAL ((eb1) 0)
#define MINUB1MAXVAL ((ub1) 255)
#define MAXUB1MINVAL ((ub1) 0)
#define MINSB1MAXVAL ((sb1) 127)
#define MAXSB1MINVAL ((sb1) -127)
#define UB1BITS CHAR_BIT
#define UB1MASK ((1 << ((uword)CHAR_BIT)) - 1)
typedef unsigned char OraText;
#ifndef LUSEMFC
# define text OraText
#endif
Trang
21
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
#ifndef lint
typedef short eb2;
typedef unsigned short ub2;
typedef signed short sb2;
#else
#define eb2 short
#define ub2 unsigned short
#define sb2 signed short
#endif
#define EB2MAXVAL ((eb2) SHRT_MAX)
#define EB2MINVAL ((eb2) 0)
#define UB2MAXVAL ((ub2)USHRT_MAX)
#define UB2MINVAL ((ub2) 0)
#define SB2MAXVAL ((sb2) SHRT_MAX)
#define SB2MINVAL ((sb2) SHRT_MIN)
#define MINEB2MAXVAL ((eb2) 32767)
#define MAXEB2MINVAL ((eb2) 0)
#define MINUB2MAXVAL ((ub2) 65535)
#define MAXUB2MINVAL ((ub2) 0)
#define MINSB2MAXVAL ((sb2) 32767)
#define MAXSB2MINVAL ((sb2)-32767)
#if defined(A_OSF)
#ifndef lint
typedef int eb4;
typedef unsigned int ub4;
typedef signed int sb4;
#else
#define eb4 int
#define ub4 unsigned int
#define sb4 signed int
#endif
#define EB4MAXVAL ((eb4) INT_MAX)
#define EB4MINVAL ((eb4) 0)
#define UB4MAXVAL ((ub4) UINT_MAX)
#define UB4MINVAL ((ub4) 0)
#define SB4MAXVAL ((sb4) INT_MAX)
#define SB4MINVAL ((sb4) INT_MIN)
#define MINEB4MAXVAL ((eb4) 2147483647)
#define MAXEB4MINVAL ((eb4) 0)
Trang
22
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
#define MINUB4MAXVAL ((ub4) 4294967295)
#define MAXUB4MINVAL ((ub4) 0)
#define MINSB4MAXVAL ((sb4) 2147483647)
#define MAXSB4MINVAL ((sb4)-2147483647)
#else
#ifndef lint
typedef long eb4;
typedef unsigned long ub4;
typedef signed long sb4;
#else
#define eb4 long
#define ub4 unsigned long
#define sb4 signed long
#endif
#define EB4MAXVAL ((eb4) LONG_MAX)
#define EB4MINVAL ((eb4) 0)
#define UB4MAXVAL ((ub4)ULONG_MAX)
#define UB4MINVAL ((ub4) 0)
#define SB4MAXVAL ((sb4) LONG_MAX)
#define SB4MINVAL ((sb4) LONG_MIN)
#define MINEB4MAXVAL ((eb4) 2147483647)
#define MAXEB4MINVAL ((eb4) 0)
#define MINUB4MAXVAL ((ub4) 4294967295)
#define MAXUB4MINVAL ((ub4) 0)
#define MINSB4MAXVAL ((sb4) 2147483647)
#define MAXSB4MINVAL ((sb4)-2147483647)
#endif
#ifndef lint
typedef unsigned long ubig_ora;
typedef signed long sbig_ora;
#else
#define ubig_ora unsigned long
#define sbig_ora signed long
#endif
#define UBIG_ORAMAXVAL ((ubig_ora)ULONG_MAX)
#define UBIG_ORAMINVAL ((ubig_ora) 0)
#define SBIG_ORAMAXVAL ((sbig_ora) LONG_MAX)
#define SBIG_ORAMINVAL ((sbig_ora) LONG_MIN)
#define MINUBIG_ORAMAXVAL ((ubig_ora) 4294967295)
Trang
23
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
#define MAXUBIG_ORAMINVAL ((ubig_ora) 0)
#define MINSBIG_ORAMAXVAL ((sbig_ora) 2147483647)
#define MAXSBIG_ORAMINVAL ((sbig_ora)-2147483647)
#define UBIGORABITS (UB1BITS * sizeof(ubig_ora))
#define SLU8NATIVE
#define SLS8NATIVE
#ifdef SLU8NATIVE
#ifndef lint
typedef unsigned long long ub8;
#else
#define ub8 unsigned long long
#endif
#define UB8ZERO ((ub8)0)
#define UB8MINVAL ((ub8)0)
#define UB8MAXVAL ((ub8)18446744073709551615)
#define MAXUB8MINVAL ((ub8)0)
#define MINUB8MAXVAL ((ub8)18446744073709551615)
#endif
#ifdef SLS8NATIVE
#ifndef lint
typedef signed long long sb8;
#else
#define sb8 signed long long
#endif
#define SB8ZERO ((sb8)0)
#define SB8MINVAL ((sb8)-9223372036854775808)
#define SB8MAXVAL ((sb8) 9223372036854775807)
#define MAXSB8MINVAL ((sb8)-9223372036854775807)
#define MINSB8MAXVAL ((sb8) 9223372036854775807)
#endif
Trang
24
Luận án tốt nghiệp -Xây dựng giao diện lập trình OCI
GVHD :KS.Bùi Hoài Thắng
#undef CONST
#ifdef _olint
# define CONST const
#else
#if defined(PMAX) && defined(__STDC__)
# define CONST const
#else
# ifdef M88OPEN
# define CONST const
# else
# if defined(SEQ_PSX) && defined(__STDC__)
# define CONST const
# else
# ifdef A_OSF
# if defined(__STDC__)
# define CONST const
# else
# define CONST
# endif
# else
# define CONST
# endif
# endif
# endif
#endif
#endif
#ifdef lint
# define dvoid void
#else
# ifdef UTS2
# define dvoid char
# else
# define dvoid void
# endif
#endif
typedef void (*lgenfp_t)( void );
Trang
25