36.7. Sử dụng các khu vực mô tả

Vùng mô tả 와이즈 토토 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ả 와이즈 토토 nhóm dữ liệu của một hàng dữ liệu cùng với các 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 các câu lệnh 와이즈 토토 động, trong đó bản chất của các cột kết quả có thể không được biết trước trước thời hạn. Postgre와이즈 토토 cung cấp hai cách để sử dụng các khu vực mô tả: Các khu vực mô tả 와이즈 토토 được đặt tên và các sqldas cấu trúc c.

36.7.1. Các khu vực mô tả 와이즈 토토 được đặt tên

Một khu vực mô tả 와이즈 토토 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 khu vực 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ử dụng khu vực mô tả 와이즈 토토, bạn cần phân bổ một:

EXEC 와이즈 토토 phân bổ mô tảđịnh danh;

Định danh đóng vai trò làHồiTên biếnHàngcủa khu vực mô tả. Khi bạn không cần mô tả nữa, bạn nên giải quyết nó:

EXEC 와이즈 토토 DEALLOCATE MÔ TẢđịnh danh;

Để sử dụng 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ê các biến máy chủ:

12422_12487

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 thực hiện các truy vấn đã chuẩn bị,mô tảCâu lệnh có thể được sử dụng để lấy siêu dữ liệu của tập kết quả:

EXEC 와이즈 토토 BẮT ĐẦU phần khai báo;
char * 와이즈 토토_STMT = "Chọn * từ Bảng1";
EXEC 와이즈 토토 END TUYÊN BỐ TUYÊN BỐ;

EXEC 와이즈 토토 Chuẩn bị STMT1 từ: 와이즈 토토_STMT;
EXEC 와이즈 토토 Mô tả STMT1 vào Bộ mô tả 와이즈 토토 MyDesc;

Trước Postgresql 9.0,와이즈 토토Từ khóa là tùy chọn, vì vậy sử dụngMô tảMô tả 와이즈 토토Được sản xuất có tên là các khu vực mô tả 와이즈 토토. Bây giờ nó là bắt buộc, bỏ qua와이즈 토토Từ khóa tạo ra các khu vực mô tả 와이즈 토토DA, xemPhần 36.7.2.

inMô tảFetchCâu lệnh, Thethànhsử dụngTừ khóa có thể được sử dụng để 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 các 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 와이즈 토토 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ử dụng lệnh sau:

EXEC 와이즈 토토 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. Các trường có thể là:

Cardinality(số nguyên)

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

Data

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, 3chodấu thời gian, 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ác(số nguyên)

độ 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 kiểu dữ liệu của cột

inthực thi, khai báoMởCâu lệnh, ảnh hưởng củathànhsử dụngTừ 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 các tham số đầu vào cho truy vấn hoặc con trỏ vàSử dụng mô tả 와이즈 토토tênlà cách để chuyển các 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ả 와이즈 토토 có tên bên dưới:

EXEC 와이즈 토토 SET mô tảtêngiá trịnum trường=:hostvar;

Postgre와이즈 토토 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 các 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ụ.:

EXEC 와이즈 토토 bắt đầu khai báo;
int id [5];
EXEC 와이즈 토토 END TUYÊN BỐ TUYÊN BỐ;

EXEC 와이즈 토토 tìm nạp 5 từ mycursor vào bộ mô tả 와이즈 토토 MyDesc;

EXEC 와이즈 토토 GET MÔ TẢ MYDESC Giá trị 1: id = data;

36.7.2. Các khu vực mô tả 와이즈 토토DA

Khu vực mô tả 와이즈 토토DA là cấu trúc ngôn ngữ C cũng có thể được sử dụng để 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 와이즈 토토 bao gồm sqlda.h;
sqlda_t *mysqlda;

EXEC 와이즈 토토 tìm nạp 3 từ mycursor vào mô tả mysqlda;

Lưu ý rằng와이즈 토토Từ khóa bị bỏ qua. Các đoạn văn về các trường hợp sử dụng củathànhSử dụngTừ khóa trongPhần 36.7.1Cũng áp dụng ở đâ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ử dụng:

EXEC 와이즈 토토 Mô tả đã chuẩn bị_statement vào mysqlda;

Lưu lượng chung của một chương trình sử dụng 와이즈 토토DA là:

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

  2. khai báo 와이즈 토토DA cho các hàng kết quả.

  3. khai báo 와이즈 토토DA cho các 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 와이즈 토토DA đầu vào.

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

  6. Đọc các giá trị từ đầu ra 와이즈 토토DA vào các biến máy chủ (với chuyển đổi nếu cần thiết).

  7. Đóng con trỏ.

  8. Miễn phí Vùng bộ nhớ được phân bổ cho 와이즈 토토DA đầu vào.

36.7.2.1. Cấu trúc dữ liệu 와이즈 토토DA

와이즈 토토DA sử dụng ba loại cấu trúc dữ liệu:와이즈 토토DA_T, 와이즈 토토VAR_Tstruct 와이즈 토토name.

TIP

22270_22456

36.7.2.1.1. cấu trúc 와이즈 토토da_t

Loại cấu trúc와이즈 토토DA_Tlà loại của 와이즈 토토DA thực tế. Nó giữ một kỷ lục. Và hai hoặc nhiều hơn와이즈 토토DA_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 các 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ỗi와이즈 토토DA_TNode.

Định nghĩa của와이즈 토토DA_TIS:

struct sqlda_struct

    char sqldaid [8];
    sqldabc dài;
    와이즈 토토N ngắn;
    와이즈 토토D ngắn;
    struct sqlda_struct *desc_next;
    struct sqlvar_struct sqlvar [1];
;

typedef struct sqlda_struct sqlda_t;

Ý nghĩa của các trường là:

와이즈 토토DAID

Nó chứa chuỗi chữ"와이즈 토토DA".

와이즈 토토DABC

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

와이즈 토토N

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ử dụngSử dụngTừ khóa. Trong trường hợp nó được sử dụng làm đầu ra củaChọn, thực thihoặcFetchCâu lệnh, giá trị của nó giống như와이즈 토토Dcâu lệnh

와이즈 토토D

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 와이즈 토토DA đượ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.

와이즈 토토VAR

Đây là mảng của các cột trong tập kết quả.

36.7.2.1.2. cấu trúc 와이즈 토토var_t

Loại cấu trúc와이즈 토토VAR_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

    와이즈 토토TYPE ngắn;
    와이즈 토토LEN ngắn;
    char *와이즈 토토data;
    ngắn *sqlind;
    struct 와이즈 토토name 와이즈 토토name;
;

typedef struct sqlvar_struct sqlvar_t;

Ý nghĩa của các trường là:

와이즈 토토TYPE

chứa định danh loại của trường. Đối với các giá trị, xemenum ecpgttypeinecpgtype.h.

와이즈 토토len

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

와이즈 토토data

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

와이즈 토토IND

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

와이즈 토토name

Tên của trường.

36.7.2.1.3. Cấu trúc cấu trúc 와이즈 토토name

Astruct 와이즈 토토nameCấu trúc giữ tên cột. Nó được sử dụng như một thành viên của와이즈 토토VAR_TCấu trúc. Định nghĩa của cấu trúc là:

#define có tênatalen 64

Cấu trúc 와이즈 토토name

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

Ý nghĩa của các trường là:

LEGN

Chứa độ dài của tên trường.

Data

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

36.7.2.2. Lấy một tập kết quả bằng cách sử dụng sqlda

Các bước chung để truy xuất kết quả truy vấn được đặt thông qua 와이즈 토토DA là:

  1. khai báo와이즈 토토DA_TCấu trúc để nhận tập kết quả.

  2. thực thiFetch/thực thi/mô tảlệnh xử lý truy vấn chỉ định 와이즈 토토DA được khai báo.

  3. Kiểm tra số lượng bản ghi trong kết quả được đặt bằng cách xem와이즈 토토N, một thành viên của와이즈 토토DA_TCấu trúc.

  4. Nhận các giá trị của mỗi cột từ와이즈 토토VAR [0], 와이즈 토토VAR [1], v.v., các thành viên của와이즈 토토DA_TCấu trúc.

  5. Chuyển đến hàng tiếp theo (와이즈 토토DA_TCấu trúc) bằng cách làm theoDESC_NEXTCon trỏ, một thành viên của와이즈 토토DA_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 A와이즈 토토DA_TCấu trúc để nhận tập kết quả.

와이즈 토토DA_T *와이즈 토토DA1;

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

30643_30700

Chạy vòng lặp theo danh sách được liên kết để truy xuất các 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 (와이즈 토토VAR_TCấu trúc) của hàng.

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

    sqlvar_t v = cur_sqlda- sqlvar [i];
    char *와이즈 토토data = v.와이즈 토토data;
    Sqllen ngắn = v.와이즈 토토len;
    ...

Để nhận giá trị cột, hãy kiểm tra와이즈 토토TYPEGiá trị, một thành viên của와이즈 토토VAR_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ừ와이즈 토토VARtrường thành biến máy chủ.

char var_buf [1024];

chuyển đổi (V.와이즈 토토TYPE)

    CASE ECPGT_CHAR:
        memset (& var_buf, 0, sizeof (var_buf));
        memcpy (& var_buf, 와이즈 토토data, (sizeof (var_buf) <= 와이즈 토토len? sizeof (var_buf) - 1: 와이즈 토토len));
        phá vỡ;

    trường hợp ecpgt_int: / * số nguyên * / /
        memcpy (& intval, 와이즈 토토data, 와이즈 토토len);
        snprintf (var_buf, sizeof (var_buf), "%d", intval);
        phá vỡ;

    ...

36.7.2.3. Vượt qua các tham số truy vấn bằng cách sử dụng sqlda

Các bước chung để sử dụng 와이즈 토토DA để chuyển các tham số đầu vào cho truy vấn đã chuẩn bị là:

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

  2. Khai báo cấu trúc 와이즈 토토DA_T dưới dạng đầu vào sqlda.

  3. Phân bổ khu vực bộ nhớ (dưới dạng cấu trúc 와이즈 토토DA_T) cho 와이즈 토토DA đầu vào.

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

  5. Mở con trỏ với việc chỉ định 와이즈 토토DA đầu vào.

Đây là một ví dụ.

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

EXEC 와이즈 토토 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 와이즈 토토 END TUYÊN BỐ TUYÊN BỐ;

EXEC 와이즈 토토 Chuẩn bị STMT1 từ: Truy vấn;

Tiếp theo, phân bổ bộ nhớ cho 와이즈 토토DA và đặt số lượng tham số đầu vào trong와이즈 토토N, một biến thành viên của와이즈 토토DA_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 dụng 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.

와이즈 토토DA_T *와이즈 토토DA2;

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ữ các giá trị tham số vào와이즈 토토VAR []Mảng. ."Postgres", có loại chuỗi và1, có loại số nguyên.

와이즈 토토DA2- 와이즈 토토VAR [0] .와이즈 토토TYPE = ECPGT_CHAR;
sqlda2- sqlvar [0] .와이즈 토토data = "postgres";
sqlda2- sqlvar [0] .와이즈 토토len = 8;

int intval = 1;
sqlda2- sqlvar [1] .sqltype = ecpgt_int;
sqlda2- sqlvar [1] .와이즈 토토data = (char *) & intval;
sqlda2- sqlvar [1] .와이즈 토토len = sizeof (intval);

Bằng cách mở con trỏ và chỉ định 와이즈 토토DA được thiết lập trước, các tham số đầu vào được chuyển đến câu lệnh đã chuẩn bị.

EXEC 와이즈 토토 Mở Cur1 bằng cách sử dụng mô tả 와이즈 토토DA2;

Cuối cùng, sau khi sử dụng 와이즈 토토DA đầu vào, không gian bộ nhớ được phân bổ phải được giải phóng rõ ràng, không giống như 와이즈 토토DA được sử dụng để nhận kết quả truy vấn.

miễn phí (와이즈 토토da2);

36.7.2.4. Một ứng dụng mẫu sử dụng sqlda

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

Ứng dụng 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 와이즈 토토DA cho đầu vào và 와이즈 토토DA cho đầu ra.

EXEC 와이즈 토토 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 와이즈 토토 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 와이즈 토토 END TUYÊN BỐ TUYÊN BỐ;

    EXEC 와이즈 토토 kết nối với TestDB với tư cách là người dùng người dùng CON1;
    Exec sql chọn pg_catalog.set_config ('search_path', '', false); Exec sql cam kết;

    EXEC 와이즈 토토 Chuẩn bị STMT1 từ: Truy vấn;
    EXEC 와이즈 토토 Tuyên bố con trỏ Cur1 cho STMT1;

Tiếp theo, đặt một số giá trị vào 와이즈 토토DA đầu vào cho các tham số đầu vào. Phân bổ bộ nhớ cho 와이즈 토토DA đầu vào và đặt số lượng tham số đầu vào thành와이즈 토토N. Lưu trữ loại, giá trị và độ dài giá trị thành와이즈 토토TYPE, 와이즈 토토data와이즈 토토lentrong와이즈 토토VARCấu trúc.

/* Tạo cấu trúc 와이즈 토토DA cho các tham số đầu vào. */
    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 */

    sqlda2- sqlvar [0] .sqltype = ecpgt_char;
    sqlda2- sqlvar [0] .와이즈 토토data = "postgres";
    sqlda2- sqlvar [0] .와이즈 토토len = 8;

    intval = 1;
    sqlda2- sqlvar [1] .sqltype = ecpgt_int;
    sqlda2- sqlvar [1] .와이즈 토토data = (char *) & intval;
    sqlda2- sqlvar [1] .와이즈 토토len = sizeof (intval);

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

/* Mở một con trỏ với các tham số đầu vào. */
    EXEC 와이즈 토토 MỞ CUR1 bằng cách sử dụng Descriptor 와이즈 토토DA2;

Tìm nạp các hàng vào đầu ra 와이즈 토토DA 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ả các hàng trong tập kết quả.)

WHER (1)

        sqlda_t *cur_sqlda;

        / * Gán mô tả cho con trỏ *//
        EXEC 와이즈 토토 tìm nạp tiếp theo từ Cur1 vào Descriptor 와이즈 토토DA1;

Tiếp theo, hãy truy xuất các bản ghi được tìm nạp từ 와이즈 토토DA, bằng cách làm theo danh sách được liên kết của와이즈 토토DA_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ữ trong와이즈 토토D, Dữ liệu thực tế của cột đầu tiên được lưu trữ trong와이즈 토토VAR [0], Cả hai thành viên của와이즈 토토DA_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 *와이즈 토토data = v.와이즈 토토data;
            Sqllen ngắn = v.와이즈 토토len;

            strncpy (name_buf, v.와이즈 토토name.data, v.와이즈 토토name.length);
            name_buf [v.와이즈 토토name.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 các biến máy chủ, nhìn vàoV.와이즈 토토TYPEĐối với loại cột.

Switch (v.sqltype) 
                int intval;
                gấp đôi gấp đôi;
                không dấu dài dài int longlongval;

                CASE ECPGT_CHAR:
                    memset (& var_buf, 0, sizeof (var_buf));
                    memcpy (& var_buf, 와이즈 토토data, (sizeof (var_buf) <= 와이즈 토토len? sizeof (var_buf) -1: 와이즈 토토len));
                    phá vỡ;

                trường hợp ecpgt_int: / * số nguyên * / /
                    memcpy (& intval, 와이즈 토토data, 와이즈 토토len);
                    snprintf (var_buf, sizeof (var_buf), "%d", intval);
                    phá vỡ;

                ...

                mặc định:
                    ...

            printf (" %s = %s (loại: %d) \ n", name_buf, var_buf, v.sqltype);

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

EXEC 와이즈 토토 Đóng Cur1;
    Exec sql cam kết;

    Exec sql ngắt kết nối tất cả;

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

Ví dụ 36.1. Ví dụ chương trình 와이즈 토토DA

#include <stdlib.h
#include <chuỗi.h
#include <stdlib.h
#include <stdio.h
#include <unistd.h

EXEC 와이즈 토토 bao gồm sqlda.h;

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

EXEC 와이즈 토토 Bất cứ khi nào không tìm thấy bị phá vỡ;
EXEC 와이즈 토토 Bất cứ khi nào sqlerror dừng lại;

int
Main (Void)

    EXEC 와이즈 토토 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 =?)";

    int intval;
    không dấu dài dài int longlongval;
    EXEC 와이즈 토토 END TUYÊN BỐ TUYÊN BỐ;

    EXEC 와이즈 토토 Kết nối với UptimedB với tư cách là người dùng CON1 thời gian hoạt động;
    Exec sql chọn pg_catalog.set_config ('search_path', '', false); Exec sql cam kết;

    EXEC 와이즈 토토 Chuẩn bị STMT1 từ: Truy vấn;
    EXEC 와이즈 토토 tuyên bố con trỏ Cur1 cho STMT1;

    / * Tạo cấu trúc 와이즈 토토DA cho tham số đầu vào */
    sqlda2 = (sqlda_t *) malloc (sizeof (sqlda_t) + sizeof (sqlvar_t));
    memset (sqlda2, 0, sizeof (sqlda_t) + sizeof (sqlvar_t));
    sqlda2- sqln = 2; / * Một số biến đầu vào */

    sqlda2- sqlvar [0] .sqltype = ecpgt_char;
    sqlda2- sqlvar [0] .와이즈 토토data = "postgres";
    sqlda2- sqlvar [0] .와이즈 토토len = 8;

    intval = 1;
    sqlda2- sqlvar [1] .sqltype = ecpgt_int;
    sqlda2- sqlvar [1] .와이즈 토토data = (char *) & intval;
    sqlda2- sqlvar [1] .와이즈 토토len = sizeof (intval);

    /* Mở một con trỏ với các tham số đầu vào. */
    EXEC 와이즈 토토 MỞ CUR1 bằng cách sử dụng mô tả 와이즈 토토DA2;

    while (1)

        sqlda_t *cur_sqlda;

        / * Gán mô tả cho con trỏ *//
        EXEC 와이즈 토토 tìm nạp tiếp theo từ Cur1 vào mô tả 와이즈 토토DA1;

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

            int i;
            char name_buf [1024];
            char var_buf [1024];

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

                sqlvar_t v = cur_sqlda- sqlvar [i];
                char *와이즈 토토data = v.와이즈 토토data;
                Sqllen ngắn = v.와이즈 토토len;

                strncpy (name_buf, v.와이즈 토토name.data, v.와이즈 토토name.length);
                name_buf [v.와이즈 토토name.length] = '\ 0';

                chuyển đổi (V.와이즈 토토TYPE)

                    CASE ECPGT_CHAR:
                        memset (& var_buf, 0, sizeof (var_buf));
                        memcpy (& var_buf, 와이즈 토토data, (sizeof (var_buf) <= 와이즈 토토len? sizeof (var_buf) -1: 와이즈 토토len));
                        phá vỡ;

                    trường hợp ecpgt_int: / * số nguyên * / /
                        memcpy (& intval, 와이즈 토토data, 와이즈 토토len);
                        snprintf (var_buf, sizeof (var_buf), "%d", intval);
                        phá vỡ;

                    Case ECPGT_LONG_LONG: / * BIGINT * /
                        memcpy (& longlongval, 와이즈 토토data, 와이즈 토토len);
                        snprintf (var_buf, sizeof (var_buf), "%lld", longlongval);
                        phá vỡ;

                    mặc định:

                        int i;
                        memset (var_buf, 0, sizeof (var_buf));
                        for (i = 0; i <와이즈 토토len; i ++)

                            char tmpbuf [16];
                            snprintf (tmpbuf, sizeof (tmpbuf), "%02x", (char không dấu) 와이즈 토토data [i]);
                            strncat (var_buf, tmpbuf, sizeof (var_buf));

                        phá vỡ;

                printf (" %s = %s (loại: %d) \ n", name_buf, var_buf, v.sqltype);

            printf ("\ n");

    EXEC 와이즈 토토 Đóng Cur1;
    Exec sql cam kết;

    EXEC 와이즈 토토 Ngắt kết nối tất cả;

    trả lại 0;

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

oid = 1 (loại: 1)
datname = template1 (loại: 1)
datdba = 10 (loại: 1)
Mã hóa = 0 (loại: 5)
datistemplate = t (loại: 1)
datallowconn = t (loại: 1)
datconnlimit = -1 (loại: 5)
datfrozenxid = 379 (loại: 1)
Dattablespace = 1663 (loại: 1)
datconfig = (loại: 1)
dataCl = = c/uptime, uptime = ctc/uptime (loại: 1)
datid = 1 (loại: 1)
datname = template1 (loại: 1)
numbackends = 0 (loại: 5)
xact_commit = 113606 (loại: 9)
xact_rollback = 0 (loại: 9)
blks_read = 130 (loại: 9)
BLKS_HIT = 7341714 (loại: 9)
TUP_Returned = 38262679 (loại: 9)
TUP_Fetched = 1836281 (loại: 9)
TUP_INSERTED = 0 (loại: 9)
TUP_UPDATED = 0 (loại: 9)
TUP_Deleted = 0 (loại: 9)

oid = 11511 (loại: 1)
datname = postgres (loại: 1)
datdba = 10 (loại: 1)
Mã hóa = 0 (loại: 5)
datistemplate = f (loại: 1)
datallowconn = t (loại: 1)
datconnlimit = -1 (loại: 5)
datfrozenxid = 379 (loại: 1)
Dattablespace = 1663 (loại: 1)
datconfig = (loại: 1)
dataCl = (loại: 1)
datid = 11511 (loại: 1)
datname = postgres (loại: 1)
numbackends = 0 (loại: 5)
xact_commit = 221069 (loại: 9)
xact_rollback = 18 (loại: 9)
blks_read = 1176 (loại: 9)
BLKS_HIT = 13943750 (loại: 9)
TUP_Returned = 77410091 (loại: 9)
TUP_Fetched = 3253694 (loại: 9)
TUP_INSERTED = 0 (loại: 9)
TUP_UPDATED = 0 (loại: 9)
TUP_Deleted = 0 (loại: 9)

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 khớ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ử dụngMẫu nàyĐể báo cáo vấn đề tài liệu.