Mô tả câc phần tử trong danh sâch chọn(select-list)

Một phần của tài liệu LVTN - Xay dung giao dien lap trinh OCI.doc (Trang 29 - 33)

Nếu ứng dụng xử lý một truy vấn mă không biết thông tin về câc phần tử trong select-list . Trong trường hợp năy cần mô tả để nhận datatype vă chiều dăi của cột

Ví dụ : với truy vấn SELECT * FROM emp; Ta cần phải mô tả nó .

Khi mô tả phải gọi hăm OCIStmtExcute() trong chế độ OCI_DESCRIBE_ONLY , ở chế độ năy không thực thi phât biểu nhưng sẽ trả về thông tin của câc phần tử trong select-list .

 Mô tả không tường minh : để nhận thông tin của câc phần tử trong select-list phải gọi hăm OCIParamGet() cho mỗi phần tử với tham số pos bắt đầu từ 1 cho đến khi OCI_NO_DATA được trả về . Một khi tham số descritor được chỉ định thì gọi hăm OCIAttrGet() trín descritor đó để nhận datatype vă chiều dăi lớn nhất của dữ liệu (riíng kiểu NUMBER thì maxsize=22 được trả về) .

Sau đđy lă ví dụ về mô tả phât biểu (đê được prepare)không tường minh : OCIParam *mypard; ub4 counter; ub2 dtype; text *col_name; ub4 col_name_len; sb4 parm_status; ………

/* Request a parameter descriptor for position 1 in the select-list */ counter = 1;

parm_status = OCIParamGet(stmthp, OCI_HTYPE_STMT, errhp, &mypard, (ub4) counter); /* Loop only if a descriptor was successfully retrieved for current position, starting at 1 */

GVHD :KS.Bùi Hoăi Thắng

while (parm_status==OCI_SUCCESS) {

/* Retrieve the data type attribute */

checkerr(errhp, OCIAttrGet((dvoid*) mypard, (ub4) OCI_DTYPE_PARAM, (dvoid*) &dtype, (ub4 *) 0, (ub4) OCI_ATTR_DATA_TYPE, (OCIError *) errhp ));

/* Retrieve the column name attribute */

checkerr(errhp, OCIAttrGet((dvoid*) mypard, (ub4) OCI_DTYPE_PARAM, (dvoid**) &col_name,(ub4 *) &col_name_len, (ub4) OCI_ATTR_NAME, (OCIError *) errhp )); printf("column=%s datatype=%d\n\n", col_name, dtype);

fflush(stdout);

/* increment counter and get next descriptor, if there is one */counter++;parm_status = OCIParamGet(stmthp, OCI_HTYPE_STMT, errhp, &mypard, (ub4) counter);}

 Mô tả tường minh : Xem ví dụ :

/* initialize svchp, stmhp, errhp, rowoff, iters, snap_in, snap_out */

/* set the execution mode to OCI_DESCRIBE_ONLY. Note that setting the mode to OCI_DEFAULT does an implicit describe of the statement in addition to executing the statement */

OCIParam *colhd; /* column handle */

checkerr(errhp, OCIStmtExecute(svchp, stmhp, errhp, iters, rowoff, snap_in, snap_out, OCI_DESCRIBE_ONLY);

/* Get the number of columns in the query */

checkerr(errhp, OCIAttrGet(stmhp, OCI_HTYPE_STMT, &numcols, 0, OCI_ATTR_PARAM_COUNT, errh));

/* go through the column list and retrieve the data type of each column. We start from pos = 1 */

for (i = 1; i <= numcols; i++){ /* get parameter for column i */

checkerr(errhp, OCIParamGet(stmhp, OCI_HTYPE_STMT, errh, &colhd, i)); /* get data-type of column i */

checkerr(errhp, OCIAttrGet(colhd, OCI_DTYPE_PARAM, &type[i-1],

0, OCI_ATTR_DATA_TYPE, errh)); }

V.Defining

Để nhận dữ liệu trả về phải define một biến output cho mỗi phần tử trong select-list . Định nghĩa một biến output lă thực hiện một hoặc nhiều bước , dùng hăm OCIDefineByPos() lă bước cơ sở .

Khi dùng array interface thì ta phải gọi hăm OCIDefineByPos() rồi sau đó gọi hăm OCIDefineArrayOfStruct() (phải thiết lập tham nhảy vă chỉ định bao nhiíu dòng được nhận bằng câch thiết lập tham số iters trong hăm OCIStmtExecute()) hoặc hăm OCIDefineObject() (đối với named datatype) .

Để nhận một chuỗi dữ liệu động văo lúc thực thi thì dùng hăm OCIDefineByPos() rồi sau đó dùng hăm OCIDefineDynamic() .

VI.Nhận dữ liệu

Nếu ứng dụng xử lý truy vấn mă cần nhận dữ liệu trả về sau khi phât biểu được thực thi thì dùng hăm OCIStmtFetch() . Nếu ứng dụng chỉ rõ số dòng cần nhận trực tiếp văo biến trong câc hoạt động define thì không cần dùng hăm năy .

PHẦN II : CÂC KHÂI NIỆM VỀ OBJECT TRONG OCI

CHƯƠNG V : TỔNG QUAN VỀ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG TRONG OCI

OCI cho phĩp truy cập câc object từ một Oracle8 server thông qua câc phât biểu SQL . Thông qua câc hăm object navigational của OCI một ứng dụng có thể thực hiện câc chức năng sau : 1. Tạo , truy cập , khóa , xóa ,copy , nạp câc object

2. Tham chiếu đến câc object vă câc meta-object của chúng

3. Nhận vă thiết lập giâ trị câc thuộc tính của object một câch động

Ở đđy câc phât biểu SQL phải sử dụng câc hăm về object để tham chiếu vă thao tâc trín nó . Cấu trúc cơ bản của một chương trình theo hướng đối tượng

1 . Khởi tạo môi trường lập trình OCI trong chế độ object(OCI_OBJECT) 2 . Chỉ định câc handle cần thiết vă connect đến một server

3 . Prepare phât biểu SQL ,đđy lă bước cục bộ .

4 . Liín kết phât biểu đê được prepare với một database server vă thực thi phât biểu

5 . Nhận kết quả trả về . Ở bước năy sau khi object được pinned thì có thể thực hiện được câc việc sau :

 Thao tâc trín câc thuộc tính của object vă đânh dấu nó lă "dirty"  Từ một REF có thể tham chiếu đến câc object khâc

 Truy thông tin về kiểu vă thuộc tính  Nhận được một sơ đồ object phức hợp  Nạp câc object được thay đổi đến server

6 . Commit transaction , bước năy ngầm định nạp tất cả câc object đê được thay đổi đến server vă ghi nhận những thay đổi năy .

GVHD :KS.Bùi Hoăi Thắng

7 . Giải phóng câc statement handle vă câc phât biểu (đê được prepare) mă không được sử dụng lại hoặc thực thi lại .

Câc bước năy sẽ được trình băy chi tiết trong câc chương sau .

CHƯƠNG VI : OBJECT-RILATIONAL DATATYPEI_Ânh xạ kiểu dữ liệu của Oracle8 sang C I_Ânh xạ kiểu dữ liệu của Oracle8 sang C

Oracle8 có nhiều kiểu dữ liệu được định nghĩa trước mă dựa văo đó ta có thể tạo ra câc bảng vă câc kiểu khâc . Câc kiểu object mở rộng khả năng của oracle bằng việc cho phĩp tạo câc kiểu dữ liệu một câch chính xâc . Ví dụ sau tạo ra kiểu địa chỉ do user định nhgĩa vă một bảng object chứa câc thực thể của kiểu năy :

CREATE TYPE address AS OBJECT (street1 varchar2(50), street2 varchar2(50), city varchar2(30), state char(2), zip number(5));

CREATE TABLE address_table OF address;

Kiểu address được sử dụng để tạo ra một bảng có một object : CREATE TABLE employees

(name varchar2(30), birthday date,

home_addr address);

Một ứng dụng OCI trước tiín biểu diễn câc object theo định dạng của ngôn ngữ C . Bằng câch sử dụng OTT(Oject Type Translator) để đưa ra cẫu trúc C mô tả câc kiểu do user định nghĩa . Câc phần tử năy có câc kiểu thực hiện việc ânh xạ sang câc kiểu của Oracle8 .

Bảng 9-1 lă danh sâch câc kiểu của Oracle mă có thể sử dụng như lă câc kiểu thuộc tính của object vă câc ânh xạ C

Table 9-1 C Language Mappings of Object Type Attributes

Attribute Type C Mapping

VARCHAR2(N) OCIString *

VARCHAR(N) OCIString *

CHAR(N), CHARACTER(N) OCIString *

NUMBER, NUMBER(N), NUMBER(N,N) OCINumber

NUMERIC, NUMERIC(N), NUMERIC(N,N) OCINumber

REAL OCINumber

INT, INTEGER, SMALLINT OCINumber

FLOAT, FLOAT(N), DOUBLE PRECISION OCINumber

DEC, DEC(N), DEC(N,N) OCINumber

DECIMAL, DECIMAL(N), DECIMAL(N,N) OCINumber

DATE OCIDate

BLOB OCILobLocator * orOCIBlobLocator *

CLOB OCILobLocator * or

OCIClobLocator *

BFILE OCIBFileLocator*

REF OCIRef *

RAW(N) OCIRaw *

VARRAY OCIArray *

Nested Table OCITable *

Ngoăi ra kiểu OCIInd dùng để chỉ câc thuộc tính null của object

Phương phâp ânh xạ câc kiểu OCI

Oracle có một số hổ trợ khi ânh xạ câc kiểu được định nghĩa trước :

- Thực tế câc kliểu dữ liệu như OCINumber lă không trong suốt đối với ứng dụng của client , có một tập câc hăm được định nghĩa trước để thao tâc dữ liệu . Điều năy cho phĩp mô tả bín trong thay đổi để tương thích với câc nđng cấp trong tương lai .

- Việc thực thi lă không thay đổi đối với câc định hướng đối tuợng chuẩn mă câc class che giấu vă chỉ khi có hoạt động yíun cầu mới được phô băy .

- Việc thực thi như vậy có một số thuận lợi cho lập trình viín .Một chương trình C có câc biền của Oracle thì không mất tính chính xâc . Để lăm điều năy trong Oracle7 dùng phât biểu "SELECT … FROMDUAL" còn trong Oracle8 sử dụng hăm OCINumber*() .

Một phần của tài liệu LVTN - Xay dung giao dien lap trinh OCI.doc (Trang 29 - 33)