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
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
§ 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)
105 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 2563 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Xây dựng giao diện lập trình OCI, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
c tìm thaáy trong taäp kyù töï OTT maëc duø moät kyù töï coù hai maõ khaùc nhau trong hai taäp kyù töï .
Caùch deã nhaát ñeå baûo ñaûm raèng taäp kyù töï ñöôïc söû duïng bôûi OTT chöùa taát caû caùc kyù töï caàn thieát laø taïo noù gioáng nhö taäp kyù töï database . Tuy nhieân chuù yù raèng taäp kyù töï OTT phaûi laø sieâu taäp (superset) cuûa taäp kyù töï bieân dòch . Nghóa laø , neáu taäp kyù töï bieân dòch laø ASCII 7-bit thì taäp kyù töï OTT phaûi coù taäp ASCII 7-bit nhö laø taäp con , neáu taäp kyù töï bieân dòch laø taäp EBCDIC 7-bit thì taäp kyù töï OTT phaûi coù taäp naøy nhö laø taäp con . User ñònh roõ taäp kyù töï maø OTT söû duïng baèng caùch thieát laäp NLS_LANG (enviroment variable) hoaëc moätsoá platform-specific mechanism .
Moät khi OTT ñoïc teân cuûa phaàn töû database , noù chuyeån ñoåi teân töø taäp kyù töï OTT sang taäp kyù töï cuûa trình bieân dòch . Neáu coù moät söï chuyeån ñoåi teân trong file INTYPE thì OTT söû duïng söï chuyeån ñoåi naøy . Caùch chuyeån ñoåi teân cuûa OTT : ñaàu tieân , neáu taäp kyù töï laø taäp kyù töï nhieàu byte , taát caû caùc kyù töï nhieàu byte (multi-byte character) cuûa teân maø noù töông ñöông vôùi nhieàu byte ñôn ñöôïc chuyeån ñoåi thaønh caùc byte ñôn ñoù . Tieáp theo , teân ñöôïc chuyeån ñoåi töø taäp kyù töï OTT sang taäp kyù töï bieân dòch . Taäp kyù töï bieân dòch byte ñôn nhö laø US7ASCII . Cuoái cuøng , côû chöõ ñöôïc thieát laäp theo tuøy choïn CASE , coøn baát kyø kyù töï khoâng hôïp leä trong moät teân goïi C hoaëc khoâng coù söï chuyeån ñoåi trong taäp kyù töï bieân dòch thì ñöôïc thay baèng '_' . Neáu coù moät kyù töï maø ñöôïc thay baèng '_' thì OTT thoâng baùo loãi . Neáu taát caû caùc kyù töï cuûa teân ñöôïc thay baèng '_' thì OTT thoâng baùo moät loãi .
Söï chuyeån ñoåi kyù töï sang kyù töï khoâng thay ñoåi daáu '_' , soá hoaëc caùc kyù töï byte ñôn xuaát hieän trong taäp kyù töï bieân dòch , vì vaäy teân hôïp leä vôùi C khoâng ñöôïc thay ñoåi .
Söï chuyeån ñoåi teân , ví duï , chuyeån ñoåi caùc kyù töï byte ñôn laø troïng aâm nhö "o" hoaëc "a" sang "o" hoaëc "a" vaø coù theå chuyeån ñoåi maãu töï nhieàu byte thaønh caùc byte ñôn töông ñöông . Chuyeån ñoåi teân seõ hoûng neáu teân bao goàm nhieàu kyù töï nhieàu byte maø thieáu caùc byte ñôn töông . Trong tröôøng hôïp naøy user seõ ñònh roõ caùc chuyeån ñoåi teân trong file INTYPE .
OTT khoâng tìm ra ñöôïc söï maâu thuaãn gaây bôûi hai hoaëc nhieàu teân database ñöôïc aùnh xaï sang cuøng moät teân cuûa C , cuõng khoâng tìm ra moät teân database aùnh xaï thaønh moät töø khoùa cuûa C .
8 . Caùc haïn cheá
Moät soá haïn cheá khi söû duïng OTT
So saùnh teân file : OTT xaùc ñònh neáu hai file gioáng teân nhau trong command line hoaëc file INTYPE . Nhöng moät vaán ñeà tìm aån coù theå xaûy ra khi OTT caàn bieát neáu hai teân file cuøng chæ ñeán moät file . Ví duï , neáu file foo.h (do OTT taïo ra ) caàn khai baùo kieåu foo1.h vaø moät khai baùo khaùc /private/elias/foo1.h thì OTT seõ taïo ra moät #include neáu hai file gioáng nhau vaø hai #include neáu hai khaùc nhau . Thöïc teá hai file laø khaùc nhau vaø taïo ra hai #include .Theo ñoù neáu moät file ñöôïc ñeà caäp moät vaøi laàn treân command line hoaëc file INTYPE , moãi laàn file ñöôïc söû duïng chính xaùc .
CHÖÔNG X : CAÙC HAØM QUAN HEÄ CUÛA OCI
I.Giôùi thieäu
Chöông naøy moâ taû caùc lôøi goïi haøm OCI , bao goàm caùc haøm cô baûn vaø söï tham chieáu keát hôïp .
Danh saùch caùc haøm : CONNECT / INITIALIZE / AUTHORIZE
OCIInitialize()
Khôûi taïo moâi tröôøng xöû lyù cuûa OCI
OCIEnvInit()
Khôûi taïo moät environment handle
OCIServerAttach()
Raøng buoäc ñeán moät server, khôûi taïo context handle cuûa server
OCIServerDetach()
Thoaùt khoûi raøng buoäc cuûa server; uninitialize server context handle
OCISessionBegin()
Chaáp nhaän moät user
OCISessionEnd()
Keát thuùc moät user
OCILogon()
Ñôn giaûn hoùa single-session logon
OCILogoff()
Ñôn giaûn hoùa single-session logoff
HANDLES / DESCRIPTORS
OCIHandleAlloc()
Chæ ñònh vaø khôûi taïo moät handle
OCIHandleFree()
Giaûi phoùng moät handle ñöôïc chæ ñònh tröôùc ñoù
OCIAttrGet()
Nhaän caùc thuoäc tính cuûa handle
OCIParamGet()
Nhaän moät tham soá descriptor
OCIParamSet()
Set parameter descriptor in COR handle
OCIAttrSet()
Set an attribute of a handle or descriptor
OCIDescriptorAlloc()
Allocate and initialize a descriptor or LOB locator
OCIDescriptorFree()
Free a previously allocated descriptor
TRANSACTION MANAGEMENT
OCITransCommit()
Giao dòch uûy thaùc
OCITransDetach()
Thoaùt khoûi moät giao dòch töø moät ngöõ caûnh phuïc vuï
OCITransRollback()
Rollback moät transaction
OCITransStart()
Start a transaction on a service context
OCITransPrepare()
Chuaån bò moät giao dòch ñeå uûy thaùc
OCITransForget()
Forget a prepared global transaction
BIND
OCIBindDynamic()
Set additional attributes after bind with OCI_DATA_AT_EXEC mode
OCIBindByName
Bind by name
OCIBindByPos()
Bind by position
OCIBindObject()
Set additional attributes for bind of named data type
OCIBindArrayOfStruct()
Set skip parameters for static array bind
OCIStmtGetBindInfo()
Get bind and indicator variable names and handles
DEFINE
OCIDefineArrayOfStruct()
Set additional attributes for static array define
OCIDefineDynamic()
Set additional attributes for define in OCI_DYNAMIC_FETCH mode
OCIDefineByPos()
Define an output variable association
OCIDefineObject()
Set additional attributes for define of named data type
DESCRIBE
OCIDescribeAny()
Describe existing schema objects
PREPARE/EXECUTE
OCIStmtPrepare()
Thieát laäp moät yeâu caàu öùng duïng
OCIStmtExecute()
Send statements to server for execution
FETCH
OCIStmtFetch()
Fetch rows from a query
LOB/FILE OPERATIONS
OCILobFileClose()
Close a previously opened FILE
OCILobFileCloseAll()
Close all previously opened files
OCILobFileOpen()
Open a FILE
OCILobAppend()
Append to a LOB
OCILobCopy()
Copy a LOB
OCILobErase()
Xoùa moät phaàn cuûa moät LOB
OCILobGetLength()
Get length of a LOB or FILE
OCILobRead()
Ñoïc moät phaàn cuûa moät LOB hoaëc FILE
OCILobTrim()
Xeùn bôùt moät LOB
OCILobWrite()
Write into a LOB
OCILobAssign()
Assign one LOB locator to another
OCILobIsEqual()
Compare two LOB locators for Equality
OCILobFileGetName()
Get directory alias and file NaMe from the LOB locator
OCILobFileIsOpen()
Check if file on server is open via this locator
OCILobFileSetName()
Set directory alias and file NaMe in the LOB locator
OCILobLocatorIsInit()
Check to see if a LOB locator is initialized
OCILobCharSetID
Get character set ID from LOB locator
OCILobCharSetForm()
Get character set form from LOB locator
OCILobFileExists()
Check if a file exists on the server
OCILobLoadFromFile()
Load a LOB from a FILE
OCILobDisableBuffering()
Turn LOB buffering off
OCILobEnableBuffering()
Turn LOB buffering on
OCILobFlushBuffer()
Flush the LOB buffer
MISCELLANEOUS
OCIBreak()
Perform an immediate asynchronous break
OCIServerVersion()
Get the Oracle version string
OCIPasswordChange()
Change password
OCIErrorGet()
Return error message and Oracle error
OCIStmtGetPieceInfo()
Get piece information for piecewise operations
OCIStmtSetPieceInfo()
Set piece information for piecewise operations
OCILdaToSvcCtx()
Ñöa Lda_Def ñeán service context handle
OCISvcCtxToLda()
Ñöa service context handle ñeán Lda_Def
TYPE INFORMATION ACCESSOR FUNCTIONS
OCITypeArrayByName()
Get an array of TDOs given an array of object names
OCITypeArrayByRef()
Get an array of TDOs given an array of object references
OCITypeByName()
Get a TDO given an object name
OCITypeByRef()
Get a TDO given an object reference
Sau ñaây seõ giôùi thieäu moät soá haøm
II. Haøm OCIAttrGet()
1>Muïc ñích : nhaän moät thuoäc tính cuûa moät handle
2>Cuù phaùp :
sword OCIAttrGet ( CONST dvoid *trgthndlp,
ub4 trghndltyp,
dvoid *attributep,
ub4 *sizep,
ub4 attrtype,
OCIError *errhp );
3>Caùc thamsoá
trgthndlp(IN) : laø con troû chæ tôùi moät handle type
trghndltyp(IN): laø handle type
attripbutep(OUT) : con troû chæ tôùi vuøng chöùa giaù trò thuoäc tính .
sizep(IN) : kích thöôùc cuûa vuøng chöùa giaù trò thuoäc tính . Caùc tham soá khoâng bieát kích thöôùc thì chuùng coù giaù trò NULL . Ñoái vôùi caùc tham soá text* , moät con troû chæ tôùi ub4 ñeå nhaän chieàu daøi cuûa chuoãi .
attrtype(OUT) : kieåu cuûa thuoäc tính nhaän ñöôïc .
errhp(IN/OUT) : moät loãi handle coù theå ñöôïc ñöa ñeán haøm OCIErrorGet() ñeå döï ñoaùn thoâng tin veà loãi ñoù .
III. Haøm OCIAttrSet()
1>Muïc ñích :set moät thuoäc tính cuûa moät handle hoaëc moät descriptor
2>Cuù phaùp :
sword OCIAttrSet ( dvoid *trgthndlp,
ub4 trghndltyp,
dvoid *attributep,
ub4 size,
ub4 attrtype,
OCIError *errhp );
3>Caùc tham soá :
trgthndlp (IN/OUT) : con troû chæ tôùi moät handle maø coù thuoäc tính ñöôïc söûa chöõa
trghndltyp (IN/OUT):kieåu handle
attributep (IN) : con troû chæ tôùi chæ tôùi giaù trò thuoäc tính . Giaù trò naøy ñöôïc copy vao handle ñích . Neáu giaù trò naøy laø moät con troû thì chæ coù con troû ñöôïc copy chöù khoâng phaûi giaù trò cuûa noù.
size (IN) : kích thöôùc cuûa moät giaù trò thuoäc tính , haàu heát caùc thuoäc tính maø kích thöôùc cuûa chuùng ñöôïc gaùn baèng 0 vì thö vieän OCI ñaõ bieát kích thöôùc cuûa chuùng . Ñoái vôùi caùc thuoäc tính kieåu text* thì ub4 phaûi ñöôïc ñöa vaøo chieâu daøi cuûa chuoãi.
attrtype (IN) : kieåu cuûa thuoäc tính ñöôïc set .
errhp (IN/OUT) : moät loãi handle coù theå ñöôïc ñöa ñeán haøm OCIErrorGet() ñeå döï ñoaùn thoâng tin veà loãi ñoù .
Ví duï
Sau ñaây laø moät ví duï giaûi thích caùch söû duïng haøm OCIAttrSet() vaøi laàn ñeå baét ñaàu moät öùng duïng .
int main()
{
OCIEnv *envhp;
OCIServer *srvhp;
OCIError *errhp;
OCISvcCtx *svchp;
OCIStmt *stmthp;
OCISession *usrhp;
OCIInitialize((ub4) OCI_THREADED | OCI_OBJECT, (dvoid *)0,
(dvoid * (*)()) 0,(dvoid * (*)()) 0, (void (*)()) 0 );
OCIHandleAlloc( (dvoid *) NULL, (dvoid **) &envhp, (ub4) CI_HTYPE_ENV,
0, (dvoid **) &tmp);
OCIEnvInit( &envhp, (ub4) OCI_DEFAULT, 0, (dvoid **) &tmp );
OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &errhp, (ub4) OCI_HTYPE_ERROR, 0, (dvoid **) &tmp);
OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &srvhp, (ub4)
OCI_HTYPE_SERVER, 0, (dvoid **) &tmp);
OCIServerAttach( srvhp, errhp, (text *) 0, (sb4) 0, (ub4) OCI_DEFAULT);
OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &svchp,
(ub4) OCI_HTYPE_SVCCTX, , (dvoid **) &tmp);
/* set attribute server context in the service context */
OCIAttrSet( (dvoid *) svchp, (ub4) OCI_HTYPE_SVCCTX, (dvoid *) srvhp,
(ub4) 0, (ub4) OCI_ATTR_SERVER, (OCIError *) errhp);
/* allocate a user session handle */
OCIHandleAlloc((dvoid *)envhp, (dvoid **)&usrhp,
(ub4) OCI_HTYPE_SESSION, (size_t) 0, (dvoid **) 0);
OCIAttrSet((dvoid *)usrhp, (ub4)OCI_HTYPE_SESSION, (dvoid *)"sherry",
(ub4)strlen("sherry"), OCI_ATTR_USERNAME, errhp);
OCIAttrSet((dvoid *)usrhp, (ub4)OCI_HTYPE_SESSION, (dvoid *)"penfield",
(ub4)strlen("penfield"), OCI_ATTR_PASSWORD, errhp);
checkerr(errhp, OCISessionBegin (svchp, errhp, usrhp, OCI_CRED_RDBMS,
OCI_DEFAULT));
OCIAttrSet((dvoid *)svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid *)usrhp,
(ub4)0, OCI_ATTR_SESSION, errhp); }
IV. Haøm OCIBindArrayOfStruct()
1>Muïc ñích :caøi ñaët caùc tham soá nhaûy cho moät maûng bind tónh
2>Cuù phaùp :
sword OCIBindArrayOfStruct ( OCIBind *bindp,
OCIError *errhp,
ub4 pvskip,
ub4 indskip,
ub4 alskip,
ub4 rcskip );
3>Caùc tham soá :
bindp (IN/OUT) :quaûn lyù moät caáu truùc bind.
errhp (IN/OUT) :- moät loãi handle coù theå ñöôïc ñöa ñeán haøm OCIErrorGet() ñeå döï ñoaùn thoâng tin veà loãi ñoù .
pvskip (IN) : tham soá nhaûy cho giaù trò döõ lieäu tieáp theo-
indskip (IN) : tham soá nhaûy cho giaù trò indicator hoaëc caáu truùc tieáp theo.
alskip (IN) : tham soá nhaûy cho giaù trò chieàu daøi thöïc tieáp theo.
rcskip (IN) : tham soá nhaûy cho column-level tieáp theo traû veà maõ giaù trò.
V. Haøm OCIBindByName()
1>Muïc ñích :taïo moät lieân keát giöõa moät bieán cuûa chöông trình vaø moät nôi chöùa trong moät phaùt bieåu SQL hoaëc khoái PL/SQL .
2>Cuù phaùp :
sword OCIBindByName ( OCIStmt *stmtp,
OCIBind **bindpp,
OCIError *errhp,
CONST text *placeholder,
sb4 placeh_len,
dvoid *valuep,
sb4 value_sz,
ub2 dty,
dvoid *indp,
ub2 *alenp,
ub2 *rcodep,
ub4 maxarr_len,
ub4 *curelep,
ub4 mode );
3>Caùc tham soá :
stmtp (IN/OUT) : phaùt bieåu ñieàu khieån ñeå xöû lyù phaùt bieåu SQL hoaëc PL/SQL.
bindpp (IN/OUT) : moät ñòa chæ cuûa moät bind handle ñöôïc chæ ñònh bôûi lôøi goïi haøm naøy . Bind handle quaûn lyù taát caû thoâng tin veà bind cho töøng giaù trò ñaàu vaøo . Handle ñöôïc giaûi phoùng hoaøn toaøn khi statement handle bò deallocate . Giaù trò ñaàu vaøo phaûi laø pointer chæ NULL hoaëc bind handle coù hieäu löïc .
errhp (IN/OUT) : moät loãi handle coù theå ñöôïc ñöa ñeán haøm OCIErrorGet() ñeå döï ñoaùn thoâng tin veà loãi ñoù .
placeholder (IN) : moät nôi chöùa caùc thuoäc tính ñöôïc chæ ñònh baèng teân neáu haøm CIBindByName() ñöôïc goïi .
placeh_len (IN) :chieàu daøi teân nôi chöùa ñöôïc ñònh roõ trong nôi chöùa.
valuep (IN/OUT) : moät ñòa chæ cuûa giaù trò döõ lieäu hoaëc moät maûng caùc giaù trò döõ lieäu ñöôïc ñònh roõ trong tham soá dty.Moät maûng caùc giaù trò döõ lieäu coù theå ñöôïc ñònh roõ ñeå aùnh xaï vaøo moät baûng PL/SQL hoaëc ñeå cung caáp döõ lieäu cho caùc hoaït ñoäng SQL nhieàu doøng . Khi moät maûng caùc giaù trò bind ñöôïc cung caáp thì haøm naøy goïi moät maûng bind trong OCI term .
Ñoái vôùi SQLT_NTY hoaëc SQLT_REF tham soá valuep bò phôùt lôø. Caùc con troû chæ ñeán caùc vuøng ñeäm OUT ñöôïc set trong tham soá pgvpp vaø ñöôïc khôûi taïo bôûi haøm OCIBindObject().
value_sz (IN) : kích thöôùc cuûa giaù trò döõ lieäu . Trong tröôøng hôïp maûng bind thì kích thöôùc lôùn nhaát coù theå cuûa moät phaàn töû laø kích thöôùc thaät ñöôïc ñònh roõ trong tham soá alenp .
Ñoái vôùi descriptor, locator, hoaëc REF thì kích thöôùc cuûa chuùng khoâng ñöôïc bieát bôûi öùng duïng client söû duïng kích thöôùc cuûa caáu truùc do baïn aán ñònh , chaúng haïn sizeof (OCILobLocator *).
dty (IN) : kieåu döõ lieäu cuûa giaù trò ñöôïc quy ñònh . Teân caùc kieåu döõ lieäu (SQLT_NTY) vaø REF (SQLT_REF) coù hieäu löïc neáu öùng duïng ñöôïc khôûi taïo trong cheá ñoä object . Ñoái vôùi caùc teân kieåu döõ lieäu hoaëc REF thì phaûi goïi theâm moät soá haøm vôùi bind handle ñöôïc caøi ñaët caùc thuoäc tính coù kieåu ñöôïc ñònh roõ .
indp (IN/OUT) : con troû chæ ñeán moät bieán indicator hoaëc maûng . Ñoái vôùi taát caû kieåu döõ lieäu ngoaïi tröø SQLT_NTY thì tham soá naøy laø moät con troû troû ñeán sb2 hoaëc maûng sb2 .
Ñoái vôùi SQLT_NTY thì pointer bò phôùt lôø vaø con thöïc troû ñeán caáu truùc indicator hoaëc maûng caùc caáu truùc indicator ñöôïc khôûi taïo sau khi goïi haøm OCIBindObject() . Tham soá naøy bò phôùt lôø ñoái vôùi caùc bind ñoäng (xem chöông 2) .
alenp (IN/OUT) : con troû troû ñeán maûng caùc chieàu daøi thöïc cuûa maûng caùc phaàn töû . Moãi phaàn töû trong alen coù chieàu daøi döõ lieäu phuø hôïp vôùi phaàn töû trong maûng giaù trò bind tröôùc vaø sau khi thöïc thi . Tham soá naøy bò phôùt lôø ñoái vôùi caùc bind ñoäng
rcodep (OUT) : con troû troû ñeán maûng column level traû veà maõ . tham soá naøy bò phôùt lôø ñoái vôùi caùc bind ñoäng .
maxarr_len (IN) : soá phaàn töû lôùn nhaát cuûa kieåu dty trong moät Pl/SQL bind . Tham soá nay khoâng ñöôïc yeâu caàu ñoái caùc non-PL/SQL bind .Neáu maxarr_len khaùc 0 thì haøm OCIBindDynamic() hoaëc OCIBindArrayOfStruct() ñöôïc söû duïng ñeå caøi ñaët caùc thuoäc tính bind phuï.
curelep(IN/OUT) : moät con troû troû ñeán soá caùc phaàn töû thöïc . Tham naøy khoâng ñöôïc yeâu caàu ñoái vôùi caùc PL/SQL bind.
mode (IN) : caùc cheá ñoä coù hieäu löïc cho tham soá naøy laø :
OCI_DEFAULT : ñaây laø cheá ñoä maëc ñònh .
OCI_DATA_AT_EXEC :khi cheá ñoä naøy ñöôïc choïn thì tham soá value_sz xaùc ñònh kích thöôùc lôùn nhaát cuûa döø lieäu coù theå ñöôïc cung caáp vaøo thôøi gian chaïy. ÖÙng duïng phaûi saún saøng cung caáp cho thö vieän OCI thôøi gian chaïy caùc vuøng ñeäm döõ lieäu IN vaøo baát kyø thôøi ñieåm naøo vaø coù soá laàn baát kyø . Thôøi gian chaïy döõ lieäu ñöôïc cung caáp theo hai caùch :
+ Goïi laïi (callback) caùc haøm do user ñònh nghóa maø noù ñöôïc ghi sau khi goïi haøm OCIBindDynamic().
+ Moät kyõ thuaät polling söû duïng caùc lôøi goïi ñöôïc cung caáp bôûi OCI . Cheá ñoä naøy giaû söû khoâng coù söï goïi laïi haøm ñöôïc ñònh nghóa naøo .
4>Lôøi bình
Haøm naøy cuõng chæ ñònh tham soá bindpp troû ñeán bind handle . Neáu **bindpp khaùc NULL thì OCI giaû söû raèng con troû naøy troû ñeán handle coù hieäu löïc maø noù ñaõ ñöôïc chæ ñònh tröôùc ñoù thoâng qua lôøi goïi haøm OCIHandleAlloc() hoaëc OCIBindByName().
Döõ lieäu trong moät öùng duïng OCI coù theå ñöôïc gaén vôùi caùc nôi chöùa tónh hoaëc ñoäng . Binding laø tónh khi taát caû döõ lieäu bind IN(IN data bind) vaø caùc vuøng ñeäm bind OUT(OUT bind buffer) ñöôïc ñònh nghóa toát tröôùc khi thöïc thi . Binding laø ñoäng khi IN bind data vaø OUT bind buffer ñöôïc cung caáp bôûi öùng duïng maø thö vieän client yeâu caàu khi thöïc thi . Binding ñöôïc thieát laäp baèng vieäc thieát laäp tham mode = OCI_DATA_AT_EXEC (xem theâm chöông 7).
Caû hai haøm OCIBindByName() vaø OCIBindByPos() nhaän moät tham soá laø bind handle maø noù hoaøn toaøn ñöôïc chæ ñònh bôûi bind call moät bind handle ñöôïc chæ ñònh cho moãi nôi chöùa öùng duïng laø binding .
Ngoaøi ra caùc bind call ñöôïc yeâu caàu ñeå ñònh roõ caùc thuoäc tính caàn thieát khi binding caùc kieåu döõ lieäu naøo ñoù hoaëc xöû lyù döõ lieäu vaøo theo caùc caùch sau :
Neáu caùc maûng caáu ñöôïc söû duïng thì haøm OCIBindArrayOfStruct() phaûi ñöôïc goïi ñeå thieát laäp caùc tham soá nhaûy caàn thieát .
Neáu döõ lieäu ñöôïc cung caáp ñoäng vaøo thôøi gian chaïy vaø öùng duïng goïi laïi caùc haøm do user ñònh nghóa thì haøm OCIBindDynamic() ñöôïc goïi ñeå ghi laïi caùc callback
Neáu teân kieåu döõ lieäu ñöôïc quy ñònh thì haøm OCIBindObject() ñöôïc goïi ñeå ñònh roõ caùc thoâng tin phuï caàn thieát .
Neáu moät phaùt bieåu vôùi meänh ñeà RETURNING thì haøm OCIBindDynamic() phaûi ñöôïc goïi sau haøm naøy.
VI. Haøm OCIBindByPos()
1>Muïc ñích : taïo moät lieân keát giöõa moät bieán cuûa chöông trình vaø nôi chöùa trong phaùt bieåu SQL hoaëc PL/SQL .
2>Cuù phaùp :
sword OCIBindByPos ( OCIStmt *stmtp,
OCIBind **bindpp,
OCIError *errhp,
ub4 position,
dvoid *valuep,
sb4 value_sz,
ub2 dty,
dvoid *indp,
ub2 *alenp,
ub2 *rcodep,
ub4 maxarr_len,
ub4 *curelep,
ub4 mode );
3>Caùc tham soá :
stmtp (IN/OUT) : phaùt bieåu ñieàu khieån ñeå xöû lyù phaùt bieåu SQL hoaëc PL/SQL.
bindpp (IN/OUT) : moät ñòa chæ cuûa moät bind handle ñöôïc chæ ñònh bôûi lôøi goïi haøm naøy . Bind handle quaûn lyù taát caû thoâng tin veà bind cho töøng giaù trò ñaàu vaøo . Handle ñöôïc giaûi phoùng hoaøn toaøn khi statement handle bò deallocate . Giaù trò ñaàu vaøo phaûi laø pointer chæ NULL hoaëc bind handle coù hieäu löïc .
errhp (IN/OUT) : moät loãi handle coù theå ñöôïc ñöa ñeán haøm OCIErrorGet() ñeå döï ñoaùn thoâng tin veà loãi ñoù .
position (IN) : nôi chöùa caùc thuoäc tính ñöôïc chæ ñònh bôûihaøm OCIBindByPos() .
valuep (IN/OUT) : moät ñòa chæ cuûa giaù trò döõ lieäu hoaëc moät maûng caùc giaù trò döõ lieäu ñöôïc ñònh roõ trong tham soá dty.Moät maûng caùc giaù trò döõ lieäu coù theå ñöôïc ñònh roõ ñeå aùnh xaï vaøo moät baûng PL/SQL hoaëc ñeå cung caáp döõ lieäu cho caùc hoaït ñoäng SQL nhieàu doøng . Khi moät maûng caùc giaù trò bind ñöôïc cung caáp thì haøm naøy goïi moät maûng bind trong OCI term .
Ñoái vôùi SQLT_NTY hoaëc SQLT_REF tham soá valuep bò phôùt lôø. Caùc con troû chæ ñeán caùc vuøng ñeäm OUT ñöôïc set trong tham soá pgvpp vaø ñöôïc khôûi taïo bôûi haøm OCIBindObject().
value_sz (IN) : kích thöôùc cuûa giaù trò döõ lieäu . Trong tröôøng hôïp maûng bind thì kích thöôùc lôùn nhaát coù theå cuûa moät phaàn töû laø kích thöôùc thaät ñöôïc ñònh roõ trong tham soá alenp .
Ñoái vôùi descriptor, locator, hoaëc REF thì kích thöôùc cuûa chuùng khoâng ñöôïc bieát bôûi öùng duïng client söû duïng kích thöôùc cuûa caáu truùc do baïn aán ñònh , chaúng haïn sizeof (OCILobLocator *).
dty (IN) : kieåu döõ lieäu cuûa giaù trò ñöôïc quy ñònh . Teân caùc kieåu döõ lieäu (SQLT_NTY) vaø REF (SQLT_REF) coù hieäu löïc neáu öùng duïng ñöôïc khôûi taïo trong cheá ñoä object . Ñoái vôùi caùc teân kieåu döõ lieäu hoaëc REF thì phaûi goïi theâm moät soá haøm vôùi bind handle ñöôïc caøi ñaët caùc thuoäc tính coù kieåu ñöôïc ñònh roõ .
indp (IN/OUT) : con troû chæ ñeán moät bieán indicator hoaëc maûng . Ñoái vôùi taát caû kieåu döõ lieäu ngoaïi tröø SQLT_NTY thì tham soá naøy laø moät con troû troû ñeán sb2 hoaëc maûng sb2 .
Ñoái vôùi SQLT_NTY thì pointer bò phôùt lôø vaø con thöïc troû ñeán caáu truùc indicator hoaëc maûng caùc caáu truùc indicator ñöôïc khôûi taïo sau khi goïi haøm OCIBindObject() . Tham soá naøy bò phôùt lôø ñoái vôùi caùc bind ñoäng (xem chöông 2) .
alenp (IN/OUT) : con troû troû ñeán maûng caùc chieàu daøi thöïc cuûa maûng caùc phaàn töû . Moãi phaàn töû trong alen coù chieàu daøi döõ lieäu phuø hôïp vôùi phaàn töû trong maûng giaù trò bind tröôùc vaø sau khi thöïc thi . Tham soá naøy bò phôùt lôø ñoái vôùi caùc bind ñoäng
rcodep (OUT) : con troû troû ñeán maûng column level traû veà maõ . tham soá naøy bò phôùt lôø ñoái vôùi caùc bind ñoäng .
maxarr_len (IN) : soá phaàn töû lôùn nhaát cuûa kieåu dty trong moät Pl/SQL bind . Tham soá nay khoâng ñöôïc yeâu caàu ñoái caùc non-PL/SQL bind .Neáu maxarr_len khaùc 0 thì haøm OCIBindDynamic() hoaëc OCIBindArrayOfStruct() ñöôïc söû duïng ñeå caøi ñaët caùc thuoäc tính bind phuï.
curelep(IN/OUT) : moät con troû troû ñeán soá caùc phaàn töû thöïc . Tham naøy khoâng ñöôïc yeâu caàu ñoái vôùi caùc PL/SQL bind.
mode (IN) : caùc cheá ñoä coù hieäu löïc cho tham soá naøy laø :
OCI_DEFAULT : ñaây laø cheá ñoä maëc ñònh .
OCI_DATA_AT_EXEC :khi cheá ñoä naøy ñöôïc choïn thì tham soá value_sz xaùc ñònh kích thöôùc lôùn nhaát cuûa döø lieäu coù theå ñöôïc cung caáp vaøo thôøi gian chaïy. ÖÙng duïng phaûi saún saøng cung caáp cho thö vieän OCI thôøi gian chaïy caùc vuøng ñeäm döõ lieäu IN vaøo baát kyø thôøi ñieåm naøo vaø coù soá laàn baát kyø . Thôøi gian chaïy döõ lieäu ñöôïc cung caáp theo hai caùch :
+ Goïi laïi (callback) caùc haøm do user ñònh nghóa maø noù ñöôïc ghi sau khi goïi haøm OCIBindDynamic().
+ Moät kyõ thuaät polling söû duïng caùc lôøi goïi ñöôïc cung caáp bôûi OCI . Cheá ñoä naøy giaû söû khoâng coù söï goïi laïi haøm ñöôïc ñònh nghóa naøo .
4>Lôøi bình
Haøm naøy cuõng chæ ñònh tham soá bindpp troû ñeán bind handle . Neáu **bindpp khaùc NULL thì OCI giaû söû raèng con troû naøy troû ñeán handle coù hieäu löïc maø noù ñaõ ñöôïc chæ ñònh tröôùc ñoù thoâng qua lôøi goïi haøm OCIHandleAlloc() hoaëc OCIBindByName().
Döõ lieäu trong moät öùng duïng OCI coù theå ñöôïc gaén vôùi caùc nôi chöùa tónh hoaëc ñoäng . Binding laø tónh khi taát caû döõ lieäu bind IN(IN data bind) vaø caùc vuøng ñeäm bind OUT(OUT bind buffer) ñöôïc ñònh nghóa toát tröôùc khi thöïc thi . Binding laø ñoäng khi IN bind data vaø OUT bind buffer ñöôïc cung caáp bôûi öùng duïng maø thö vieän client yeâu caàu khi thöïc thi . Binding ñöôïc thieát laäp baèng vieäc thieát laäp tham mode = OCI_DATA_AT_EXEC (xem theâm chöông 7).
Caû hai haøm OCIBindByName() vaø OCIBindByPos() nhaän moät tham soá laø bind handle maø noù hoaøn toaøn ñöôïc chæ ñònh bôûi bind call moät bind handle ñöôïc chæ ñònh cho moãi nôi chöùa öùng duïng laø binding .
Ngoaøi ra caùc bind call ñöôïc yeâu caàu ñeå ñònh roõ caùc thuoäc tính caàn thieát khi binding caùc kieåu döõ lieäu naøo ñoù hoaëc xöû lyù döõ lieäu vaøo theo caùc caùch sau :
Neáu caùc maûng caáu ñöôïc söû duïng thì haøm OCIBindArrayOfStruct() phaûi ñöôïc goïi ñeå thieát laäp caùc tham soá nhaûy caàn thieát .
Neáu döõ lieäu ñöôïc cung caáp ñoäng vaøo thôøi gian chaïy vaø öùng duïng goïi laïi caùc haøm do user ñònh nghóa thì haøm OCIBindDynamic() ñöôïc goïi ñeå ghi laïi caùc callback
Neáu teân kieåu döõ lieäu ñöôïc quy ñònh thì haøm OCIBindObject() ñöôïc goïi ñeå ñònh roõ caùc thoâng tin phuï caàn thieát .
Neáu moät phaùt bieåu vôùi meänh ñeà RETURNING thì haøm OCIBindDynamic() phaûi ñöôïc goïi sau haøm naøy.
VII. Haøm OCIBindDynamic()
1>Muïc ñích : ghi laïi caùc callback cuûa user ñoái vôùi vieäc chæ ñònh döõ lieäu ñoäng
2>Cuù phaùp :
sword OCIBindDynamic ( OCIBind *bindp,
OCIError *errhp,
dvoid *ictxp,
OCICallbackInBind (icbfp)(/*_
dvoid *ictxp,
OCIBind *bindp,
ub4 iter,
ub4 index,
dvoid **bufpp,
ub4 *alenp,
ub1 *piecep,
dvoid **indpp */),
dvoid *octxp,
OCICallbackOutBind (ocbfp)(/*_
dvoid *octxp,
OCIBind *bindp,
ub4 iter,
ub4 index,
dvoid **bufpp,
ub4 **alenpp,
ub1 *piecep,
dvoid **indpp,
ub2 **rcodepp _*/) );
3>Caùc tham soá :
bindp (IN/OUT) : moät bind handle ñöôïc traû veà bôûi haøm OCIBindByName() hoaëc OCIBindByPos().
errhp (IN/OUT) : moät loãi handle coù theå ñöôïc ñöa ñeán haøm OCIErrorGet() ñeå döï ñoaùn thoâng tin veà loãi ñoù .
ictxp (IN) :con troû ñöôïc yeâu caàu bôûi vieäc goïi laïi haøm icbfp.
icbfp (IN) : haøm ñöôïc goïi laïi traû veà con troû troû tôùi giaù trò bind IN hoaëc moät boä phaän vaøo thôøi gian chaïy .
ictxp (IN/OUT) : con troû ngöõ caûnh troû tôùi haøm callback .
bindp (IN) : bind handle ñöôïc ñöa vaøo ñònh danh duy nhaát cuûa bieán bind
iter (IN) : (= 0) döïa vaøo söï thöïc thi giaù trò laëp
index (IN) : chæ soá maûng hieän taïi cho moät maûng bind trong PL/SQL. Ñoái vôùi SQL noù laø chæ soá doøng . Giaù trò cô sôû laø 0 vaø khoâng lôùn hôn tham soá curelep cuûa bind call.
bufpp (OUT) :pointer troû tôùi buffer hoaëc storage. Ñoái vôùi caùc descriptor, *bufpp chöùa moät pointer troû tôùi descriptor. Ví duï neáu ñònh nghóa :
OCILOBLocator *lobp;
thì *bufpp troû tôùi lobp khoâng phaûi *lobp.
Ñoái vôùi caùc REF, ñöa caùc ñòa chæ cuûa ref, chaúng haïn ñöa &my_ref cho *bufpp.
alenp (OUT) : moät pointer troû tôùi storage ñeå OCI theâm ñaày kích thöôùc cuûa bind value/piece sau khi noù ñaõ ñöôïc ñoïc . Ñoái vôùi caùc descriptor thì ñöa kích thöôùc cuûa pointer vaøo descriptor chaúng haïn sizeof(OCILobLocator *).
piecep (OUT):laø moät phaàn cuûa giaù trò bind , noù coù theå laø moät trong caùc giaù trò sau OCI_ONE_PIECE , OCI_FIRST_PIECE , OCI_NEXT_PIECE vaø OCI_LAST_PIECE. Ñoái vôùi caùc datatype maø khoâng hoã trôï caùc hoaït ñoäng piece khaùc(piecewise) thì ñöa OCI_ONE_PIECE vaøo hoaëc moät loãi ñöôïc taïo ra.
indp (OUT) : chöùa giaù trò indicator . Noù laø moät pointer troû ñeán sb2 hoaëc moät caáu truùc indicator ñeå binding teân caùc kieåu döõ lieäu .
octxp (IN) : pointer ngöõ caûnh caàn cho callback haøm ocbfp.
ocbfp (IN) : callback haøm maø traû veà moät pointer troû ñeán giaù trò bind OUT hoaëc piece vaøo thôøi gian chaïy .Callback naøy nhaän caùc tham soá sau :
octxp (IN/OUT) : con troû ngöõ caûnh cho callback haøm naøy.
bindp (IN) : bind handle ñöôïc ñöa vaøo ñònh danh duy nhaát cuûa bieán bind naøy.
iter (IN) : ( baét ñaàu töø 0) thöïc thi caùc giaù trò laëp.
index (IN) : chæ soá PL/SQL cuûa maûng bind hieän taïi . Ñoái vôùi SQL, chæ soá naøy laø soá thöù töï haøng cuûa voøng laëp hieän taïïi the index is the row number in the current iteration . Baét ñaàu töø 0 vaø khoâng lôùn hôn tham soá curelep cuûa bind call.
bufpp (OUT) : moät con troû troû tôùi vuøng ñeäm ñeå ghi bind value/piece.
alenpp (IN/OUT) : moät con troû troû tôùi vuøng löu tröõ ñeå OCI ñieàn ñaày kích thöôùc cuûa bind value/piece sau khi noù ñöôïc ñoïc .
piecep (IN/OUT) :traû veà moät phaàn trò töø callback (application) ñeán Oracle nhö sau :
IN : giaù trò coù theå laø OCI_ONE_PIECE hoaëc OCI_NEXT_PIECE.
OUT: tuøy theo giaù trò IN:
Neáu giaù trò IN laø OCI_ONE_PIECE thì giaù trò OUT coù thheå laø OCI_ONE_PIECE hoaëc OCI_FIRST_PIECE
Neáu giaù trò IN laø OCI_NEXT_PIECE thì giaù trò OUT coù theå laø OCI_NEXT_PIECE hoaëc OCI_LAST_PIECE
indpp (OUT) : traû veà moät con troû chöùa giaù trò indicator hoaëc laø giaù trò sb2 hoaëc laø moät con troû troû tôùi moät caáu truùc indicator ñoái vôùi teân caùc kieåu döõ lieäu.
rcodepp (OUT) : traû veà moät con troû chöùa maõ traû veà.
4>Lôøi bình :
Lôøi goïi haøm naøy ñeå ghi laïi callback caùc haøm do user ñònh nghóa ñeå cung caáp hoaëc nhaän döõ lieäu neáu cheá ñoä OCI_DATA_AT_EXEC ñöôïc ñònh roõ trong lôùi goïi haøm OCIBindByName() or OCIBindByPos() tröôùc ñoù. Caùc pointer cuûa vieäc callback haûm phaûi traû veà OCI_CONTINUE neáu goïi thaønh coâng . Baát kyø maõ naøo khaùc OCI_CONTINUE thì client boû dôû quaù trình xöû lyù ngay töùc thì .
Khi naïp ñòa chæ cuûa moät vuøng löu tröõ thì phaûi chaéc chaén raèng vuøng löu tröõ ñoù toàn taïi ngay caû sau khi öùng duïng traû veà töø callback , coù nghóa laø khoâng neân chæ ñònh quaù nhieàu vuøng löu tröõ treân stack .
CHÖÔNG XI :CAÙC HAØM VAÄN CHUYEÅN
(OCI Navigational Functions)
Chöông naøy giôùi thieäu caùc haøm vaän chuyeån thoâng caùc object nhaän ñöôïc moät Oracle8 Server
I. Giôùi thieäu
Trong moâ hình object vaän chuyeån döõ lieäu ñöôïc moâ taû nhö laø moät graph cuûa object lieân keát vôùi nhau bôûi caùc tham chieáu . Caùc object trong moät graph ñöôïc tìm kieám theo caùc tham chieáu . OCI cung caáp moät giao tieáp navigation ñeán caùc object trong Oracle8 server . Moâi tröôøng object cuûa OCI ñöôïc khôûi taïo khi öùng duïng goïi haøm OCIInitialize() trong cheá ñoä OCI_OBJECT .
II. Caùc object type vaø thôøi gian soáng
Moät thöïc theå laø moät söï kieän xaûy ra cuûa moät kieåu ñöôïc ñònh nghóa trong moät CSDL Oracle . Phaàn naøy seõ giôùi thieäu moät thöïc theå ñöôïc hieän thöïc trong OCI nhö theá naøo . Trong OCI moät thöïc theå object ñöôïc phaân loaïi treân cô sôû kieåu , thôøi gian soáng vaø khaû naêng tham chieáu .
1)Moät persistent object laø moät thöïc theå cuûa moät object type . Moät persistent object truù nguï trong moät haøng cuûa baûng trong server vaø coù theå toàn taïi laâu thôøi gian hoaøn thaønh moät session(connection) . Persistent object coù theå ñöôïc ñònh nghóa bôûi caùc tham chieáu object chöùa ñònh danh (identifier) cuûa object . Moät persistent object thu ñöôïc bôûi pinning tham chieáu object cuûa noù .
2)Moät transient object laø moät thöïc theå cuûa moät object type . Moät transient object khoâng theå toàn taïi laâu hôn thôøi gian hoaøn thaønh moät session , noù ñöôïc söû duïng ñeå chöùa caùc keát quaû tính toaùn taïm thôøi . Transient object cuõng coù theå ñöôïc ñònh danh bôûi caùc tham chieáu chöùa caùc ñònh danh cuûa transient object .
3)Moät giaù trò laø moät thöïc theå cuûa moät kieåu do user ñònh nghóa (object type hoaëc collection type) hoaëc baát kyø kieåu ñöôïc xaây döïng trong Oracle . Khaùc vôùi caùc object , caùc giaù trò cuûa object ñöôïc nhaän ra bôûi caùc pointer boä nhôù chöù khoâng phaûi caùc tham chieáu .
Moät giaù trò coù theå ñöùng moät mình (standalone) hoaëc ñöôïc theâm vaøo(embedded) . Moät gaù trò standalone thöôøng thu ñöôïc bôûi phaùt bieåu choïn . OCI cuõng cho pheùp moät chöông trình client choïn moät doøng cuûa baûng object vaøo moät giaù trò bôûi phaùt bieåu SQL . Vì vaäy moät object coù theå tham chieáu coù theå ñöôïc hieän thöïc nhö moät giaù trò (chöù khoâng ñöôïc ñònh danh bôûi moät tham chieáu ) . Moät giaù trò cuõng coù theå laø moät thuoäc tính out-of-life trong object (chaúng haïn VARCHAR ,raw) hoaëc moät phaàn töû out-of-line trong collection (chaúng haïn VARCHAR , raw ,object).
Moät giaù trò embedded laø physically included trong moät containing instance. Moät giaù trò embedded coù theå laø moät thuoäc tính in-line trong moät object (chaúng haïn number ,nested object) hoaëc moät phaàn töû in-line trong moät collection .
Taát caû giaù trò ñöôïc xaùc ñònh taïm thôøi bôûi OCI , chaúng haïn OCI khoâng hoå trôï töï ñoäng flushing moät giaù trò vaøo database ,coøn client thöïc thi hoaøn taát moät phaùt bieåu SQL ñeå löu giaù trò vaøo database . Caùc giaù trò embedded ñöôïc flush khi caùc containning instance ñöôïc flush . Hình sau cho thaáy caùc thöïc theå ñöôïc phaân loaïi theo kieåi cuûa chuùng vaø thôøi gian soáng :
instance
OBJECT VALUE Type
…………… …………………………………………………………………………………………………………………………….
PERSISENT TRANSISENT LifetimelIFETIME
Hình 14-1 Classification of Instances by Type and Lifetime
Phaân bieät caùc thöïc theå khaùc nhau ñöôïc ñöa ra ôû baûng sau:
Table 14-1 Distinctions Between Types of Objects
Persistent Object
Transient Object
Value
Type
object type
object type
object type, built-in,collection
Maximum Lifetime
until object is deleted
session
session
Referenceable
yes
yes
no
Embeddable
no
no
yes
III. Thuaät ngöõ
Caùc thuaät ngöõ sau seõ ñöôïc söû duïng :
1)Term object ñöôïc söû duïng ñeå chæ moät persistent object, moät transient object, moät giaù trò standalone cuûa object type, hoaëc moät giaù trò embedded cuûa object type.
2)Term object coù theå tham chieáu chæ moät persistent object hoaëc moät transient object.
3)Term standalone object moät persistent object, moät transient object hoaëc moätgiaù trò standalone cuûa object type.
4)Term embedded object chæ moät giaù trò embedded cuûa object type.
Moät object laø dirty neáu noù ñaõ ñöôïc taïo,hoaëc ñaùnh daáu caäp nhaät hoaëc xoùa.
IV. Haøm navigation traû veà giaù trò
Caùc haøm OCI navigation tieâu bieåu traû veà moät trong caùc giaù trò sau:
Table 14-2 Common Navigational Function Return Values
Return Value
Meaning
OCI_SUCCESS
The operation succeeded
OCI_ERROR
The operation failed. The specific error can be retrieved by calling OCIErrorGet() on the error handle passed to the function.
OCI_INVALID_HANDLE
The environment or error handle passed to the function is NULL.
V. Maõ loãi cuûa haøm navigation
Baûng sau lieät keâ caùc maõ loãi beân ngoaøi cuûa Oracle coù theå ñöôïc traû veà bôûi moãi haøm navigation
Table 14-3 OCI Navigational Function Error Codes
Function
Possible ORA Errors
OCIObjectNew()
24350, 21560, 21705, 21710
OCIObjectPin()
24350, 21560, 21700, 21702
OCIObjectUnpin()
24350, 21560, 21710
OCIObjectPinCountReset()
24350, 21560, 21710
OCIObjectLock()
24350, 21560, 21701, 21708, 21710
OCIObjectMarkUpdate()
24350, 21560, 21700, 21701, 21710
OCIObjectUnmark()
24350, 21560, 21710
OCIObjectUnmarkByRef()
24350, 21560
OCIObjectFree()
24350, 21560, 21603, 21710
OCIObjectMarkDelete()
24350, 21560, 21700, 21701, 21702, 21710
OCIObjectMarkDeleteByRef()
24350, 21560
OCIObjectFlush()
24350, 21560, 21701, 21703, 21708, 21710
OCIObjectRefresh()
24350, 21560, 21709, 21710
OCIObjectCopy()
24350, 21560, 21705, 21710
OCIObjectGetTypeRef()
24350, 21560, 21710
OCIOjectGetObjectRef()
24350, 21560, 21710
OCIObjectGetInd()
24350, 21560, 21710
OCIObjectExists()
24350, 21560, 21710
OCIObjectIsLocked()
24350, 21560, 21710
OCIObjectIsDirty()
24350, 21560, 21710
OCIObjectPinTable()
24350, 21560, 21705
OCIObjectArrayPin()
24350, 21560
OCICacheFlush()
24350, 21560, 21705
OCICacheRefresh()
24350, 21560, 21705
OCICacheUnpin()
24350, 21560, 21705
OCICacheFree()
24350, 21560, 21705
OCICacheUnmark()
24350, 21560, 21705
OCIObjectSetAttr()
21560, 21600, 22305, 22279, 21601
OCIObjectGetAttr()
21560, 21600, 22305
YÙ nghóa cuûa loãi:
ORA-21560 - name argument should not be NULL
ORA-21600 - path expression too long
ORA-21601 - attribute is not an instance of user-defined type
ORA-21603 - cannot free a dirtied persistent object
ORA-21700 - object does not exist or has been deleted
ORA-21701 - invalid object
ORA-21702 - object is not instantiated in the cache
ORA-21703 - cannot flush an object that is not modified
ORA-21704 - terminate cache or connection without flushing
ORA-21705 - service context is invalid
ORA-21708 - operations cannot be performed on a transient object
ORA-21709 - operations can only be performed on a current object
ORA-21710 - invalid pointer or value passed to the function
ORA-22279 - cannot perform operation with LOB buffering enabled
ORA-22305 - name argument is invalid
ORA-24350 - this OCI call is not allowed from external subroutines
VI. Toùm taét caùc haøm
Table 14-4 OCI Navigational Functions Quick Reference
Function
Purpose
FLUSH OR REFRESH OBJECT/CACHE
OCICacheFlush()
Flush modified persistent objects in cache to server
OCIObjectFlush()
Flush a modified persistent object to the server
OCICacheRefresh()
Refresh pinned persistent objects
OCIObjectRefresh()
Refresh a persistent object
MARK OR UNMARK OBJECT/CACHE
OCIObjectMarkDeleteByRef()
Mark an object deleted given a ref
OCIObjectMarkUpdate()
Mark an object as updated/dirty
OCIObjectMarkDelete()
Mark an object deleted / delete a value instance
OCICacheUnmark()
Unmarks objects in the cache
OCIObjectUnmark()
Unmarks an object
OCIObjectUnmarkByRef()
Unmarks an object, given a ref to it
GET OBJECT STATUS
OCIObjectExists()
Get the existent status of an instance
OCIObjectIsDirty()
Get the dirtied status of an instance
OCIObjectIsLocked()
Get the locked status of an instance
PIN/UNPIN/FREE
OCIObjectPin()
Pin an object
OCIObjectUnpin()
Unpin an object
OCIObjectPinCountReset()
Unpin an object to zero pin count
OCICacheUnpin()
Unpin persistent objects in cache or connection
OCIObjectArrayPin()
Pin an array of references
OCIObjectPinTable()
Pin a table object with a given duration
OCICacheFree()
Free objects in the cache
OCIObjectFree()
Free a previously allocated object
OTHER FUNCTIONS
OCIObjectCopy()
Copy one instance to another
OCIObjectGetInd()
Get null structure of an instance
OCIObjectGetObjectRef()
Return reference to a given object
OCIObjectGetTypeRef()
Get a reference to a TDO of an instance
OCIObjectLock()
Lock a persistent object
OCIObjectNew()
Create a new instance
CHÖÔNG XII : AÙNH XAÏ KIEÅU DÖÕ LIEÄU OCI VAØ CAÙC HAØM THAO TAÙC
I.Giôùi thieäu
Chöông naøy giôùi thieäu caùc haøm aùnh xaï datatype OCI vaø caùc haøm thao taùc.
Xem theâm chöông 9
II.Caùc haøm aùnh xaï datatype vaø caùc haøm thao taùc
Caùc haøm aùnh xaï vaø caùc haøm thao taùc traû veà moät trong caùc giaù trò sau :
Table 15-1 Common Navigational Function Return Values
Return Value
Meaning
OCI_SUCCESS
The operation succeeded
OCI_ERROR
The operation failed. The specific error can be retrieved by calling OCIErrorGet() on the error handle passed to the function.
OCI_INVALID_HANDLE
The environment or error handle passed to the function is NULL.
Moät soá haøm traû veà caùc giaù trò khaùc trong baûng 15-1 . Khi söû duïng nhöõng haøm naøy phaûi coù moät nôi chöùa ñeå traû veà moät giaù trò tröïc tieáp töø lôøi goïi haøm hôn laø thoâng qua moät tham soá OUT .
OCICollMax()
OCIRawPtr()
OCIRawSize()
OCIRefHexSize()
OCIRefIsEqual()
OCIRefIsNull()
OCIStringPtr()
OCIStringSize()
III.Giôùi thieäu caùc haøm
Table 15-2 OCI Datatype Mapping and Manipulation Functions Quick Reference
Function
Purpose
COLLECTION ITERATOR FUNCTIONS
OCICollAppend()
Collection append element
OCICollAssignElem()
Collection assign element
OCICollAssign()
Assign collection
OCICollSize()
get current size of collection (in number of elements)
OCICollTrim()
trim elements from the collection
OCICollGetElem()
get pointer to an element
OCICollMax()
return maximum number of elements in collection
OCIIterCreate()
Create ITerator to scan the varray elements
OCIIterGetCurrent()
get CURrent collection element
OCIIterDelete()
Delete ITerator
OCIIterInit()
Initialize ITerator to scan the given collection
OCIIterNext()
get NeXT collection element
OCIIterPrev()
get PReVious collection element,
DATE FUNCTIONS
OCIDateToText()
convert date TO String
OCIDateAddDays()
ADd or subtract Days
OCIDateAddMonths()
ADd or subtract Months
OCIDateDaysBetween()
get number of days BeTWeen two dates
OCIDateCheck()
CHecK if the given date is valid
OCIDateCompare()
CoMPare dates
OCIDateLastDay()
get date of LaST day of month
OCIDateNextDay()
get date of Next DaY
OCIDateFromText ()
convert String TO Date
OCIDateSysDate()
get current SYStem date and time
OCIDateZoneToZone()
convert date from one time Zone TO another Zone
OCIDateAssign()
assign date
OCIDateGetDate()
get the date portion of a date
OCIDateGetTime()
get the time portion of a date
OCIDateSetDate()
set the date portion of a date
OCIDateSetTime()
set the time portion of a date
NUMBER FUNCTIONS
OCINumberToInt()
convert number TO Integer
OCINumberToReal()
convert number TO Real
OCINumberToText()
convert number TO String
OCINumberAbs()
ABSolute value
OCINumberArcCos()
Arc COSine
OCINumberAdd()
ADD numbers
OCINumberAssign()
ASsiGn number
OCINumberArcSin ()
Arc SINe
OCINumberArcTan()
Arc TANgent
OCINumberArcTan2()
Arc TaNgent 2
OCINumberExp()
arbitrary Base EXponentiation
OCINumberCeil()
CEiling of number
OCINumberCmp()
CoMPare numbers
OCINumberCos()
COSine
OCINumberHypCos()
CoSine Hyperbolic
OCINumberDiv()
DIVide numbers
OCINumberPower()
EXPonentiation to base e
OCINumberFloor()
FLooR of number
OCINumberFromInt()
convert Integer TO Number
OCINumberIsZero()
comparison with ZERo
OCINumberLn()
Logarithm Natural
OCINumberLog ()
LOGarithm to arbitrary base
OCINumberMod()
MODulo division
OCINumberMul()
MULtiply numbers
OCINumberNeg()
NEGate number
OCINumberIntPower()
take an arbitrary base to an arbitrary integer PoWeR
OCINumberFromReal()
convert Real TO Number
OCINumberRound()
ROUnd Oracle number to a specified decimal place
OCINumberSetZero()
INItialize number to zero
OCINumberFromText()
convert String TO Number
OCINumberSign()
obtains SiGN of an Oracle number
OCINumberSin()
SINe
OCINumberHypSin()
SiNe Hyperbolic
OCINumberSqrt()
SQuare Root of number
OCINumberSub()
SUBtract numbers
OCINumberTan()
tANgent
OCINumberHypTan()
TaNgent Hyperbolic
OCINumberTrunc()
TRUncate an Oracle number at a specified decimal place
REF FUNCTIONS
OCIRefToHex()
convert REF to Hexadecimal string
OCIRefAssign()
ASsiGn one REF to another
OCIRefClear()
CLeaR or nullify a REF
OCIRefIsEqual()
compare two REFs for EQUality
OCIRefFromHex()
convert Hexadecimal string to REF
OCIRefHexSize()
return size of hexadecimal representation
OCIRefIsNull()
test if a REF is NULl
TABLE FUNCTIONS
OCITableDelete()
DELete element
OCITableExists()
Test whether element EXIsts
OCITableFirst()
return FirST index of table
OCITableLast()
return LaST index of table
OCITableNext()
return NeXT available index of table
OCITablePrev()
return PReVious available index of table
OCITableSize()
return current size of table
STRING FUNCTIONS
OCIStringAssign()
Assign String to String
OCIStringAllocSize()
get Allocated SiZe of string memory in bytes
OCIStringAssignText()
Assign Text string to String
OCIStringPtr()
Get String Pointer
OCIStringSize()
Get String siZe
OCIStringResize()
ReSiZe string memory
RAW FUNCTIONS
OCIRawAssignBytes()
Assign raw Bytes to Raw
OCIRawAssignRaw()
Assign Raw to Raw
OCIRawAllocSize()
Get Allocated SiZe of raw memory in bytes
OCIRawPtr()
Get Raw data Pointer
OCIRawSize()
Get Raw siZe
OCIRawResize()
ReSiZe memory of variable-length raw
PHAÀN III : XAÂY DÖÏNG GIAO DIEÄN LAÄP TRÌNH OCI
A-Toùm taét lyù thuyeát
Treân cô sôû lyù thuyeát ñaõ trình baøy , vieäc xaây döïng caùc haøm môùi cuõng bao goàm taát caû caùc haøm OCI maø thöïc hieän caùc coâng vieäc cuûa moät chöông trình OCI .
Sau laø moái töông quan giöõa caùc haøm OCI chuaån vaø caùc haøm ñaõ xaây döïng ñöôïc caàn söû duïng ñeå xaây moät chöông trình OCI cô baûn :
Böôùc
OCI chuaån
Giao dieän môùi
1
1>Duøng haøm OCIInitialize() ñeå khôûi taïo caùc process
2>Duøng haøm OCIEnvInit() ñeå taïo environment handle
3>Duøng haøm OCIHandleAlloc() ñeå chæ ñònh service handle
4>Duøng haøm OCIHandleAlloc() ñeå chæ ñònh error handle
5>Duøng haøm OCIHandleAlloc() ñeå chæ ñònh server handle
6>Duøng haøm OCIHandleAlloc() ñeå chæ ñònh authentication handle
8>Duøng haøm OCIAtach() ñeå lieân keát vôùi server
9>Duøng haøm OCIAttrSet() thieát laäp server handle trong service handle
10>Duøng haøm OCIAttrSet() ñeå thieát laäp caùc thuoäc tính cuûa authentication handle(username vaø password)
11>Duøng haøm OCIAttrSet() ñeå thieát laäp authentication handle trong the Service handle
12>Duøng haøm OCISessionBegin() logon
1>Duøng haøm
sword connect(const text *uid,
const text *pwd,
const text *hoststring)
*uid (IN) : username
*pwd (IN): password
*hoststring(IN) :teân server
Neáu logon thaønh coâng haøm traû veà OCI_SUCCESS
Caùc giaù trò khaùc , logon bò loãi vaø caùc loãi naøy ñöôïc thoâng baùo baèng caùch goïi haøm massageError(errhp /* error hadle */)
2
13>Goïi haøm OCIHandleAlloc() ñeå chæ ñònh statement handle . Sau ñoù
14>Goïi haøm OCIStmtPrepare() ñeå chuaån bò phaùt bieåu
2>Goïi haøm
sword prepare(text *sql)
*sql (IN): leänh SQL
Neáu prepare thaønh coâng haøm traû veà OCI_SUCCESS .
Caùc giaù trò khaùc bò loãi
3
Neáu Bind theo teân :
15-1>Goïi haøm OCIHandleAlloc() ñeå chæ ñònh bind handle . Sau ñoù
16>Goïi haøm OCIBindByName()
Neáu Bind theo vò trí :
15-1>Goïi haøm OCIBindByPos()
Neáu duøng maûng caáu truùc :
15-1>Goïi haøm OCIBindByPos() hoaëc OCIBindByName() . Sau ñoù
15-2>Goïi Haøm
OCIBindArrayOfStruct()
Neáu bind ñoäng :
15-1>Goïi haøm OCIBindByPos() hoaëc OCIBindByName()
15-2>Xaây döïng haøm icbfp
15-3>Xaây döïng haøm ocbfp
15-4>Goïi haøm OCIBindDynamic()
Neáu bind theo teân :
3-1>Goïi haøm
sword bndName(text *prgvar,
void *namecol,
ub2 type,
sword size)
*prgvar (IN):bieán trong chöông trình
*namecol (IN):teân coät
type(IN) :maõ kieåu döõ lieäu cuûa coät
size (IN) :kích thöôùc kieåu döõ lieäu
Ví duï :
SELECT dname
FROM dept
WHERE deptno= :num
AND loc= :city;
Thì prgvar=":num"
Namecol=deptno
Neáu bind theo vò trí thì goïi haøm:
3-1>Sword bndPos(ub4 pos,
ub2 type,
sword size)
pos (IN) :vò trí cuûa bieán ñöôïc bind
Trong ví duï treân pos cuûa deptno baèng 1
Neáu duøng maûng caáu truùc :
3-1>Goïi haøm
sword bndArrOfStr(ArrayBind , int )
ArrayBind(OUT) :kieåu caáu truùc ñöôïc ñònh nghóa trong file OverOCI.h
Int (IN): soá löôïng bieán caàn bind
Neáu bind ñoäng :
3-1>Goïi haøm
sword bndDynamic(int numbnds)
numbnds (OUT): soá bieán caàn bind
*pData[ ][ ](OUT):nôi döõ lieäu traû veà (ñöôïc khai baùo trong file OverOCI.h)
4
Thöïc thi :
16>Goïi haøm OCIStmtExecute()
Thöïc thi :
4>Goïi haøm
sword execute(int iters)
iters : tham soá ñieàu khieån (xem phaàn lyù thuyeát)
5
Moâ taû caùc phaàn töû trong select-list :
Moâ taû caùc phaàn töû trong select-list :
6
17>Goïihaøm OCIStmtExecute() trong cheá ñoä
OCI_DESCRIBE_ONLY
18>Goïi haøm OCIAttrGet() nhaän soá column
19>Goïi haøm OCIParamGet() thieát laäp vieäc nhaän caùc tham soá coät I
20>Goïi haøm OCIAttrGet() nhaän kieåu döõ lieäu
21> Goïi haøm OCIAttrGet() nhaän kích thöôùc döõ lieäu
22> Goïi haøm OCIAttrGet() nhaän teân coät vaø chieàu daøi cuûa teân coät
5-1>Goïi haøm
sword describe(
ArrayDes arrDescribe[],
int *numcols)
arrDescribe(OUT) :xem ñònh nghóa trong file OverOCI.h
*numcols :soá coät trong phaùt bieåu
Neáu duøng haøm
5-2>Sword desAndDef(void *arrData[],
ArrayDes arrDescribe[],
int *numcols,sb2 indp[])
*arrData(OUT) :chöùa döõ lieäu traû veà trong caùc bieán ñaõ döôïc define trong chính haøm naøy (neáu duøng haøm naøy khoâng caàn goïi haøm define )
7
Define
Neáu Define theo vò trí :
23-1>Goïi haøm OCIDefineByPos()
Neáu duøng maûng caáu truùc :
23-1>Goïi haøm OCIDefineByPos(). Sau ñoù
13-2>Goïi Haøm
OCIDefineArrayOfStruct()
Neáu Define ñoäng :
23-1>Goïi haøm OCIDefineByPos() hoaëc OCIDefineObject()
23-2>Xaây döïng haøm icbfp
23-3>Xaây döïng haøm ocbfp
23-4>Goïi haøm OCIDefineDynamic()
6-1>Goïi haøm
sword definePos(sb4 size,
ub2 type,
void *data,
int pos)
size(IN):kích thöôùc döõ lieäu
type(IN) :maõ kieåu
*data(OUT) :con troû chæ tôùi vuøng döõ lieäu ñöôïc traû veà
pos (IN): vò trí cuûa bieán ñöôïc define
6-2>Hoaëc (neáu duøng haøm naøy thì khoâng caàn duøng haøm fetchData() döõ lieäu seõ ñöôïc nhaän tröïc tieáp vaøo caùc bieán)
sword defineArrOfStr(
ArrayDefine ArrDef[],
int numcols)
ArrDef[ ](OUT): Maûng caùc coät , moãi phaàn töû laø moät maûng chöùa döõ lieäu
Numcols(IN) : soá coät trong phaùt bieåu
8
24>Goïi haøm OCIStmtFetch() ñeå nhaän döõ lieäu
7>Goïi haøm
sword fetchData()
Moãi laàn nhaän moät row
9
Commit(coù theå khoâng coù böôùc naøy cuõng ñöôïc
25>Goïi haøm OCITransCommit()
8>Goïi haøm transCommit(ub4 flags)
10
Disconnect
26>Goïi haøm OCIFreeHandle()
ñeå giaûi phoùng context handle thì caùc handle khaùc töï ñoäng ñöôïc giaûi phoùng
Löu yù : coù theå giaûi phoùng caùc handle moät caùch töôøng minh
Sau ñoù goïi haøm
27>OCISessionEnd()
9>Goïi haøm disconnecd()
Nhö vaäy ñeå vieát moät chöông trình duøng tröïc tieáp caùc haøm OCI chuaån thì phaûi caàn khoaûng 26 ñeán 33 lôøi goïi haøm . Vôùi giao dieän môùi thì caàn khoaûng 7 ñeán 11 lôøi goïi haøm .
Treân ñaây laø taát caû caùc böôùc cho vieäc vieát moät chöông trình OCI . Tuy nhieân tuøy töøng öùng duïng maø coù theå khoâng coù ñaày ñuû caùc böôùc naøy .
Các file đính kèm theo tài liệu này:
- Xây dựng giao diện lập trình OCI.doc