Phiên bản được hỗ trợ:hiện tại(17) /16 / 15 / 14 / 13
Phiên bản phát triển:18 / Devel
Phiên bản không được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4

34.7. Sử dụng kèo bóng đá cúp c2 khu vực mô tả#

Vùng mô tả kèo bóng đá cúp c2 là một phương pháp tinh vi hơn để xử lý kết quả của AChọn, Fetchhoặc Amô tảTuyên bố. Một khu vực mô tả SQL nhóm dữ liệu của một hàng dữ liệu cùng với kèo bóng đá cúp c2 mục siêu dữ liệu thành một cấu trúc dữ liệu. Siêu dữ liệu đặc biệt hữu ích khi thực hiện kèo bóng đá cúp c2 câu lệnh SQL động, trong đó bản chất của kèo bóng đá cúp c2 cột kết quả có thể không được biết trước trước thời hạn. PostgreSQL cung cấp hai cách để sử dụng kèo bóng đá cúp c2 khu vực mô tả: kèo bóng đá cúp c2 khu vực mô tả SQL được đặt tên và kèo bóng đá cúp c2 sqldas cấu trúc c.

34.7.1. kèo bóng đá cúp c2 khu vực mô tả SQL được đặt tên#

Một kèo bóng đá cúp c2 mô tả SQL có tên bao gồm một tiêu đề, chứa thông tin liên quan đến toàn bộ mô tả và một hoặc nhiều kèo bóng đá cúp c2 mô tả mục, về cơ bản mỗi mô tả một cột trong hàng kết quả.

Trước khi bạn có thể sử kèo bóng đá cúp c2 khu vực mô tả SQL, bạn cần phân bổ một:

EXEC kèo bóng đá cúp c2 phân bổ mô tảđịnh danh;

Định danh đóng vai trò làTên biếnxôngcủa kèo bóng đá cúp c2 mô tả. Khi bạn không cần mô tả nữa, bạn nên giải quyết nó:

EXEC kèo bóng đá cúp c2 DealLocate Descriptorđịnh danh;

Để sử kèo bóng đá cúp c2 khu vực mô tả, chỉ định nó làm mục tiêu lưu trữ trong mộtthànhmệnh đề, thay vì liệt kê kèo bóng đá cúp c2 biến máy chủ:

12556_12621

Nếu tập kết quả trống, vùng mô tả vẫn sẽ chứa siêu dữ liệu từ truy vấn, tức là, tên trường.

Vì chưa được thực hiện kèo bóng đá cúp c2 truy vấn đã chuẩn bị,Mô tảCâu lệnh có thể được sử kèo bóng đá cúp c2 để lấy siêu dữ liệu của tập kết quả:

EXEC kèo bóng đá cúp c2 BẮT ĐẦU phần khai báo;
char * SQL_STMT = "Chọn * từ Bảng1";
EXEC kèo bóng đá cúp c2 END TUYÊN BỐ TUYÊN BỐ;

EXEC kèo bóng đá cúp c2 Chuẩn bị STMT1 từ: SQL_STMT;
EXEC kèo bóng đá cúp c2 Mô tả STMT1 vào Bộ mô tả kèo bóng đá cúp c2 MyDesc;

Trước Postgresql 9.0,kèo bóng đá cúp c2Từ khóa là tùy chọn, vì vậy sử kèo bóng đá cúp c2mô tảMô tả kèo bóng đá cúp c2Được sản xuất có tên là kèo bóng đá cúp c2 khu vực mô tả SQL. Bây giờ nó là bắt buộc, bỏ quakèo bóng đá cúp c2Từ khóa tạo ra kèo bóng đá cúp c2 khu vực mô tả SQLDA, xemPhần 34.7.2.

inMô tảFetchCâu lệnh, ThethànhSử kèo bóng đá cúp c2Từ khóa có thể được sử kèo bóng đá cúp c2 để tương tự: chúng tạo ra tập kết quả và siêu dữ liệu trong khu vực mô tả.

Bây giờ làm thế nào để bạn đưa dữ liệu ra khỏi khu vực mô tả? Bạn có thể nghĩ về khu vực mô tả như một cấu trúc với kèo bóng đá cúp c2 trường được đặt tên. Để lấy giá trị của trường từ tiêu đề và lưu trữ nó vào một biến máy chủ, hãy sử dụng lệnh sau:

EXEC kèo bóng đá cúp c2 Nhận mô tảtên :hostvar=trường;

Hiện tại, chỉ có một trường tiêu đề được xác định:Đếm, cho biết có bao nhiêu khu vực mô tả vật phẩm tồn tại (nghĩa là, có bao nhiêu cột được chứa trong kết quả). Biến máy chủ cần phải thuộc loại số nguyên. Để nhận một trường từ vùng mô tả mục, hãy sử kèo bóng đá cúp c2 lệnh sau:

EXEC kèo bóng đá cúp c2 Nhận mô tảtêngiá trịnum :hostvar=trường;

numcó thể là một số nguyên theo nghĩa đen hoặc biến chủ chứa một số nguyên. kèo bóng đá cúp c2 trường có thể là:

Cardinality(số nguyên) #

Số lượng hàng trong tập kết quả

15542_15548 #

Mục dữ liệu thực tế (do đó, loại dữ liệu của trường này phụ thuộc vào truy vấn)

datetime_interval_code(số nguyên) #

Khiloại9, datetime_interval_codesẽ có giá trị1chongày, 2chothời gian, 3choTimestamp, 4choThời gian với múi giờhoặc5chodấu thời gian với múi giờ.

datetime_interval_precision(số nguyên) #

Không được triển khai

Chỉ báo(số nguyên) #

Chỉ báo (chỉ ra giá trị null hoặc cắt giảm giá trị)

key_member(số nguyên) #

không được triển khai

LEGN(số nguyên) #

Độ dài của mốc thời gian trong ký tự

tên(chuỗi) #

Tên của cột

nullable(số nguyên) #

không được triển khai

octet_length(số nguyên) #

Độ dài của biểu diễn ký tự của mốc thời gian trong byte

Chính xác18618_18630 #

độ chính xác (cho loạiSố)

return_length(số nguyên) #

Độ dài của mốc thời gian trong ký tự

return_octet_length(số nguyên) #

Độ dài của biểu diễn ký tự của mốc thời gian trong byte

Scale(số nguyên) #

tỷ lệ (cho loạiSố)

loại(số nguyên) #

Mã số của loại dữ liệu của cột

inthực thi, khai báoMởCâu lệnh, Hiệu ứng củathành20192_20199sử kèo bóng đá cúp c2Từ khóa là khác nhau. Vùng mô tả cũng có thể được xây dựng thủ công để cung cấp kèo bóng đá cúp c2 tham số đầu vào cho truy vấn hoặc con trỏ vàSử kèo bóng đá cúp c2 mô tả SQLtênlà cách để chuyển kèo bóng đá cúp c2 tham số đầu vào vào một truy vấn được tham số hóa. Tuyên bố để xây dựng một khu vực mô tả SQL có tên bên dưới:

EXEC kèo bóng đá cúp c2 SET Mô tảtêngiá trịnum trường=:hostvar;

PostgreSQL hỗ trợ lấy thêm một bản ghi trong mộtFetchCâu lệnh và lưu trữ dữ liệu trong kèo bóng đá cúp c2 biến máy chủ trong trường hợp này giả định rằng biến là một mảng. Ví dụ.:

21100_21288

34.7.2. kèo bóng đá cúp c2 khu vực mô tả SQLDA#

Vùng mô tả SQLDA là cấu trúc ngôn ngữ C cũng có thể được sử kèo bóng đá cúp c2 để có được thiết lập kết quả và siêu dữ liệu của truy vấn. Một cấu trúc lưu trữ một bản ghi từ tập kết quả.

EXEC kèo bóng đá cúp c2 bao gồm sqlda.h;
sqlda_t *mysqlda;

EXEC kèo bóng đá cúp c2 tìm nạp 3 từ mycursor vào mô tả mysqlda;

Lưu ý rằngkèo bóng đá cúp c221961_22026thànhSử kèo bóng đá cúp c2Từ khóa trongPhần 34.7.1Cũng áp kèo bóng đá cúp c2 ở đây với một bổ sung. Trong aMô tảtuyên bốMô tảTừ khóa có thể bị bỏ qua hoàn toàn nếuthànhTừ khóa được sử kèo bóng đá cúp c2:

EXEC kèo bóng đá cúp c2 Mô tả đã chuẩn bị_statement vào mysqlda;

Lưu lượng chung của một chương trình sử kèo bóng đá cúp c2 SQLDA là:

  1. Chuẩn bị truy vấn và khai báo con trỏ cho nó.

  2. Khai báo SQLDA cho kèo bóng đá cúp c2 hàng kết quả.

  3. khai báo SQLDA cho kèo bóng đá cúp c2 tham số đầu vào và khởi tạo chúng (phân bổ bộ nhớ, cài đặt tham số).

  4. Mở một con trỏ với SQLDA đầu vào.

  5. Lấy hàng từ con trỏ và lưu trữ chúng vào đầu ra sqlda.

  6. Đọc kèo bóng đá cúp c2 giá trị từ SQLDA đầu ra vào kèo bóng đá cúp c2 biến máy chủ (với chuyển đổi nếu cần thiết).

  7. Đóng con trỏ.

  8. Miễn phí kèo bóng đá cúp c2 bộ nhớ được phân bổ cho SQLDA đầu vào.

34.7.2.1. Cấu trúc dữ liệu SQLDA#

SQLDA sử kèo bóng đá cúp c2 ba loại cấu trúc dữ liệu:SQLDA_T, SQLVAR_Tstruct sqlname.

TIP

24159_24345

34.7.2.1.1. cấu trúc sqlda_t#

Loại cấu trúcSQLDA_Tlà loại của sqlda thực tế. Nó giữ một kỷ lục. Và hai hoặc nhiều hơnSQLDA_TCấu trúc có thể được kết nối trong danh sách được liên kết với con trỏ trongdesc_nextTrường, do đó đại diện cho một bộ sưu tập kèo bóng đá cúp c2 hàng được đặt hàng. Vì vậy, khi hai hoặc nhiều hàng được tìm nạp, ứng dụng có thể đọc chúng bằng cách làm theodesc_nextCon trỏ trong mỗiSQLDA_TNode.

Định nghĩa củaSQLDA_TIS:

struct sqlda_struct

    char sqldaid [8];
    sqldabc dài;
    SQLN ngắn;
    SQLD ngắn;
    struct sqlda_struct *desc_next;
    struct sqlvar_struct sqlvar [1];
;

typedef struct sqlda_struct sqlda_t;

Ý nghĩa của kèo bóng đá cúp c2 trường là:

SQLDAID #

Nó chứa chuỗi chữ"SQLDA".

SQLDABC #

Nó chứa kích thước của không gian được phân bổ trong byte.

SQLN #

Nó chứa số lượng tham số đầu vào cho truy vấn được tham số hóa trong trường hợp nó được chuyển vàoMở, khai báohoặcthực thiCâu lệnh sử kèo bóng đá cúp c2Sử kèo bóng đá cúp c226690_26733Chọn, thực thihoặcFetchCâu lệnh, giá trị của nó giống nhưSQLDcâu lệnh

SQLD #

Nó chứa số lượng trường trong tập kết quả.

desc_next #

Nếu truy vấn trả về nhiều bản ghi, nhiều cấu trúc SQLDA được liên kết được trả về vàdesc_nextGiữ một con trỏ tới mục tiếp theo trong danh sách.

SQLVAR #

Đây là mảng của kèo bóng đá cúp c2 cột trong tập kết quả.

34.7.2.1.2. cấu trúc sqlvar_t#

Loại cấu trúcSQLVAR_Tgiữ giá trị cột và siêu dữ liệu như loại và độ dài. Định nghĩa của loại là:

struct sqlvar_struct

    SQLTYPE ngắn;
    SQLLEN ngắn;
    char *sqldata;
    ngắn *sqlind;
    struct sqlname sqlname;
;

typedef struct sqlvar_struct sqlvar_t;

Ý nghĩa của kèo bóng đá cúp c2 trường là:

SQLTYPE #

chứa định danh loại của trường. Đối với kèo bóng đá cúp c2 giá trị, xemenum ecpgttypeinecpgtype.h.

sqllen #

Chứa độ dài nhị phân của trường. ví dụ: 4 byte choECPGT_INT.

sqldata #

chỉ vào dữ liệu. Định dạng của dữ liệu được mô tả trongPhần 34.4.4.

SQLIND #

chỉ vào chỉ báo null. 0 có nghĩa là không null, -1 có nghĩa là null.

sqlname #

Tên của trường.

34.7.2.1.3. Cấu trúc cấu trúc sqlname#

Astruct sqlnameCấu trúc giữ tên cột. Nó được sử kèo bóng đá cúp c2 như một thành viên củaSQLVAR_TCấu trúc. Định nghĩa của cấu trúc là:

#define có tênatalen 64

Cấu trúc sqlname

        chiều dài ngắn;
        Dữ liệu char [Được đặt tên];
;

Ý nghĩa của kèo bóng đá cúp c2 trường là:

LEGN #

chứa chiều dài của tên trường.

Data #

chứa tên trường thực tế.

34.7.2.2. Lấy một tập kết quả bằng cách sử kèo bóng đá cúp c2 sqlda#

32158_32230

  1. 32316_32329SQLDA_TCấu trúc để nhận tập kết quả.

  2. thực thiFetch/32526_32535/Mô tảkèo bóng đá cúp c2 lệnh để xử lý truy vấn chỉ định SQLDA được khai báo.

  3. Kiểm tra số lượng bản ghi trong kết quả được đặt bằng cách xemSQLN, một thành viên củaSQLDA_TCấu trúc.

  4. Nhận kèo bóng đá cúp c2 giá trị của mỗi cột từSQLVAR [0], SQLVAR [1], v.v., kèo bóng đá cúp c2 thành viên củaSQLDA_TCấu trúc.

  5. Chuyển đến hàng tiếp theo (SQLDA_TCấu trúc) bằng cách làm theodesc_nextCon trỏ, một thành viên củaSQLDA_TCấu trúc.

  6. Lặp lại ở trên khi bạn cần.

Đây là một ví dụ truy xuất kết quả được đặt thông qua sqlda.

Đầu tiên, khai báo ASQLDA_TCấu trúc để nhận tập kết quả.

SQLDA_T *SQLDA1;

Tiếp theo, chỉ định SQLDA trong một lệnh. Đây là mộtFetchVí dụ về lệnh.

33876_33933

Chạy vòng lặp theo danh sách được liên kết để truy xuất kèo bóng đá cúp c2 hàng.

sqlda_t *cur_sqlda;

for (cur_sqlda = sqlda1;
     cur_sqlda! = null;
     cur_sqlda = cur_sqlda- desc_next)

    ...

Bên trong vòng lặp, chạy vòng lặp khác để truy xuất từng dữ liệu cột (SQLVAR_TCấu trúc) của hàng.

for (i = 0; i <cur_sqlda- sqld; i ++)

    sqlvar_t v = cur_sqlda- sqlvar [i];
    char *sqldata = v.sqldata;
    Sqllen ngắn = v.sqllen;
    ...

Để nhận giá trị cột, hãy kiểm traSQLTYPEGiá trị, một thành viên củaSQLVAR_TCấu trúc. Sau đó, chuyển sang một cách thích hợp, tùy thuộc vào loại cột, để sao chép dữ liệu từSQLVARTrường đến biến máy chủ.

34856_35254

34.7.2.3. Vượt qua kèo bóng đá cúp c2 tham số truy vấn bằng cách sử dụng sqlda#

kèo bóng đá cúp c2 bước chung để sử dụng SQLDA để chuyển kèo bóng đá cúp c2 tham số đầu vào cho truy vấn đã chuẩn bị là:

  1. Tạo một truy vấn đã chuẩn bị (câu lệnh đã chuẩn bị)

  2. Khai báo cấu trúc SQLDA_T dưới dạng đầu vào sqlda.

  3. Phân bổ kèo bóng đá cúp c2 bộ nhớ (dưới dạng cấu trúc SQLDA_T) cho SQLDA đầu vào.

  4. Đặt (sao chép) kèo bóng đá cúp c2 giá trị đầu vào trong bộ nhớ được phân bổ.

  5. Mở con trỏ với việc chỉ định SQLDA đầu vào.

36335_36356

Đầu tiên, tạo một câu lệnh đã chuẩn bị.

EXEC kèo bóng đá cúp c2 BẮT ĐẦU phần khai báo;
Truy vấn char [1024] = "Chọn d.oid, * từ pg_database D, pg_stat_database s trong đó d.oid = s.datid và (d.datname =? hoặc d.oid =?)";
EXEC kèo bóng đá cúp c2 END TUYÊN BỐ TUYÊN BỐ;

EXEC kèo bóng đá cúp c2 Chuẩn bị STMT1 từ: Truy vấn;

Tiếp theo, phân bổ bộ nhớ cho SQLDA và đặt số lượng tham số đầu vào trongSQLN, một biến thành viên củaSQLDA_TCấu trúc. Khi cần có hai hoặc nhiều tham số đầu vào cho truy vấn đã chuẩn bị, ứng kèo bóng đá cúp c2 phải phân bổ không gian bộ nhớ bổ sung được tính bằng (nr. Của params - 1) * sizeof (sqlvar_t). Ví dụ được hiển thị ở đây phân bổ không gian bộ nhớ cho hai tham số đầu vào.

SQLDA_T *SQLDA2;

sqlda2 = (sqlda_t *) malloc (sizeof (sqlda_t) + sizeof (sqlvar_t));
memset (sqlda2, 0, sizeof (sqlda_t) + sizeof (sqlvar_t));

sqlda2- sqln = 2; / * Số lượng biến đầu vào */

Sau khi phân bổ bộ nhớ, lưu trữ kèo bóng đá cúp c2 giá trị tham số vàoSQLVAR []37484_37633"Postgres", có loại chuỗi và1, có loại số nguyên.

SQLDA2- SQLVAR [0] .SQLTYPE = ECPGT_CHAR;
sqlda2- sqlvar [0] .sqldata = "postgres";
sqlda2- sqlvar [0] .sqllen = 8;

int intval = 1;
sqlda2- sqlvar [1] .sqltype = ecpgt_int;
sqlda2- sqlvar [1] .sqldata = (char *) & intval;
sqlda2- sqlvar [1] .sqllen = sizeof (intval);

Bằng cách mở một con trỏ và chỉ định SQLDA được thiết lập trước, kèo bóng đá cúp c2 tham số đầu vào được chuyển đến câu lệnh đã chuẩn bị.

EXEC SQL Mở Cur1 bằng cách sử kèo bóng đá cúp c2 mô tả SQLDA2;

38319_38456

miễn phí (sqlda2);

34.7.2.4. Một ứng kèo bóng đá cúp c2 mẫu sử kèo bóng đá cúp c2 sqlda#

Đây là một chương trình ví dụ, mô tả cách tìm nạp số liệu thống kê truy cập của cơ sở dữ liệu, được chỉ định bởi kèo bóng đá cúp c2 tham số đầu vào, từ kèo bóng đá cúp c2 danh mục hệ thống.

Ứng kèo bóng đá cúp c2 này kết hợp hai bảng hệ thống, pg_database và pg_stat_database trên cơ sở dữ liệu OID, và cũng tìm thấy và hiển thị số liệu thống kê cơ sở dữ liệu được lấy bởi hai tham số đầu vào (cơ sở dữ liệuPostgresvà OID1).

Đầu tiên, khai báo SQLDA cho đầu vào và SQLDA cho đầu ra.

EXEC kèo bóng đá cúp c2 bao gồm sqlda.h;

sqlda_t *sqlda1; / * một mô tả đầu ra */
sqlda_t *sqlda2; / * một mô tả đầu vào */

Tiếp theo, kết nối với cơ sở dữ liệu, chuẩn bị một câu lệnh và khai báo con trỏ cho câu lệnh đã chuẩn bị.

int
Main (Void)

    EXEC kèo bóng đá cúp c2 bắt đầu phần khai báo;
    Truy vấn char [1024] = "Chọn d.oid,* từ pg_database D, pg_stat_database s trong đó d.oid = s.datid và (d.datname =? hoặc d.oid =?)";
    EXEC kèo bóng đá cúp c2 END TUYÊN BỐ TUYÊN BỐ;

    EXEC kèo bóng đá cúp c2 kết nối với TestDB với tư cách là người dùng người dùng CON1;
    Exec kèo bóng đá cúp c2 chọn pg_catalog.set_config ('search_path', '', false); Exec kèo bóng đá cúp c2 cam kết;

    EXEC kèo bóng đá cúp c2 Chuẩn bị STMT1 từ: Truy vấn;
    EXEC kèo bóng đá cúp c2 Tuyên bố con trỏ Cur1 cho STMT1;

Tiếp theo, đặt một số giá trị vào SQLDA đầu vào cho kèo bóng đá cúp c2 tham số đầu vào. Phân bổ bộ nhớ cho SQLDA đầu vào và đặt số lượng tham số đầu vào thànhSQLN. Lưu trữ loại, giá trị và độ dài giá trị thànhSQLTYPE, sqldatasqllenTrongSQLVARCấu trúc.

40545_41091

Sau khi thiết lập SQLDA đầu vào, hãy mở một con trỏ bằng SQLDA đầu vào.

/* Mở một con trỏ với kèo bóng đá cúp c2 tham số đầu vào. */
    EXEC SQL MỞ CUR1 bằng cách sử dụng Descriptor SQLDA2;

Tìm nạp kèo bóng đá cúp c2 hàng vào đầu ra SQLDA từ con trỏ đã mở. (Nói chung, bạn phải gọiFetchLiên tục trong vòng lặp, để tìm nạp tất cả kèo bóng đá cúp c2 hàng trong tập kết quả.)

41546_41707

Tiếp theo, hãy truy xuất kèo bóng đá cúp c2 bản ghi được tìm nạp từ SQLDA, bằng cách làm theo danh sách được liên kết củaSQLDA_TCấu trúc.

for (cur_sqlda = sqlda1;
         cur_sqlda! = null;
         cur_sqlda = cur_sqlda- desc_next)

        ...

Đọc từng cột trong bản ghi đầu tiên. Số lượng cột được lưu trữ trongSQLD, Dữ liệu thực tế của cột đầu tiên được lưu trữ trongSQLVAR [0], cả hai thành viên củaSQLDA_TCấu trúc.

/* In mỗi cột trong một hàng. */
        for (i = 0; i <sqlda1- sqld; i ++)

            sqlvar_t v = sqlda1- sqlvar [i];
            char *sqldata = v.sqldata;
            Sqllen ngắn = v.sqllen;

            strncpy (name_buf, v.sqlname.data, v.sqlname.length);
            name_buf [v.sqlname.length] = '\ 0';

Bây giờ, dữ liệu cột được lưu trữ trong biếnV. Sao chép mọi mốc thời gian vào kèo bóng đá cúp c2 biến máy chủ, nhìn vàoV.SQLTYPEĐối với loại cột.

42925_43682

Đóng con trỏ sau khi xử lý tất cả kèo bóng đá cúp c2 bản ghi và ngắt kết nối khỏi cơ sở dữ liệu.

EXEC kèo bóng đá cúp c2 Đóng Cur1;
    Exec kèo bóng đá cúp c2 cam kết;

    Exec kèo bóng đá cúp c2 ngắt kết nối tất cả;

Toàn bộ chương trình được hiển thị trongVí dụ 34.1.

Ví dụ 34.1. Ví dụ chương trình SQLDA

44323_48063

Đầu ra của ví dụ này sẽ trông giống như sau (một số số sẽ thay đổi).

48209_49537

Gửi hiệu chỉnh

Nếu bạn thấy bất cứ điều gì trong tài liệu không chính xác, không phù hợp Kinh nghiệm của bạn với tính năng cụ thể hoặc yêu cầu làm rõ thêm, Vui lòng sử kèo bóng đá cúp c2Mẫu nàyĐể báo cáo vấn đề tài liệu.