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 / 7.3

36.4. Sử dụng kèo bóng đá cúp c2 biến máy chủ

inPhần 36.3Bạn đã thấy cách bạn có thể thực hiện kèo bóng đá cúp c2 câu lệnh SQL từ chương trình SQL nhúng. Một số trong kèo bóng đá cúp c2 câu lệnh chỉ được sử dụng kèo bóng đá cúp c2 giá trị cố định và không cung cấp một cách để chèn kèo bóng đá cúp c2 giá trị do người dùng cung cấp vào kèo bóng đá cúp c2 câu lệnh hoặc để chương trình xử lý kèo bóng đá cúp c2 giá trị được truy vấn trả về. Những loại tuyên bố đó không thực sự hữu ích trong kèo bóng đá cúp c2 ứng dụng thực. Phần này giải thích chi tiết về cách bạn có thể truyền dữ liệu giữa chương trình C của mình và kèo bóng đá cúp c2 câu lệnh SQL được nhúng bằng cách sử dụng một cơ chế đơn giản gọi làkèo bóng đá cúp c2 chủ. Trong một chương trình SQL nhúng, chúng tôi coi kèo bóng đá cúp c2 câu lệnh SQL làKháchTrong mã chương trình C làNgôn ngữ máy chủ. Do đó, kèo bóng đá cúp c2 biến của chương trình C được gọi làkèo bóng đá cúp c2 chủ.

Một cách khác để trao đổi giá trị giữa kèo bóng đá cúp c2 phụ trợ PostgreSQL và kèo bóng đá cúp c2 ứng dụng ECPG là việc sử dụng kèo bóng đá cúp c2 mô tả SQL, được mô tả trongPhần 36.7.

36.4.1. Tổng quan

Chuyển dữ liệu giữa chương trình C và kèo bóng đá cúp c2 câu lệnh SQL đặc biệt đơn giản trong SQL nhúng. Thay vì để chương trình dán dữ liệu vào câu lệnh, đòi hỏi kèo bóng đá cúp c2 biến chứng khác nhau, chẳng hạn như trích dẫn đúng giá trị, bạn chỉ có thể viết tên của biến C vào câu lệnh SQL, được đặt trước bởi một dấu hai chấm. Ví dụ:

EXEC SQL chèn vào kèo bóng đá cúp c2 giá trị một số (: v1, 'foo',: v2);

Câu lệnh này đề cập đến hai biến C có tênV1V2Và cũng sử dụng một chuỗi kèo bóng đá cúp c2 thông thường theo nghĩa đen, để minh họa rằng bạn không bị hạn chế sử dụng một loại dữ liệu hoặc loại khác.

13292_13414

36.4.2. Khai báo phần

Để chuyển dữ liệu từ chương trình sang cơ sở dữ liệu, ví dụ như kèo bóng đá cúp c2 tham số trong truy vấn hoặc chuyển dữ liệu từ cơ sở dữ liệu trở lại chương trình, kèo bóng đá cúp c2 biến C dự định chứa dữ liệu này cần được khai báo trong kèo bóng đá cúp c2 phần được đánh dấu đặc biệt, do đó

Phần này bắt đầu bằng:

EXEC kèo bóng đá cúp c2 BẮT ĐẦU phần khai báo;

và kết thúc bằng:

phần khai báo kết thúc kèo bóng đá cúp c2;

Giữa kèo bóng đá cúp c2 dòng đó, phải có kèo bóng đá cúp c2 khai báo biến C bình thường, chẳng hạn như:

int x = 4;
char foo [16], thanh [16];

Như bạn có thể thấy, bạn có thể tùy ý gán một giá trị ban đầu cho biến. Phạm vi của biến được xác định bởi vị trí của phần khai báo trong chương trình. Bạn cũng có thể khai báo kèo bóng đá cúp c2 biến với cú pháp sau đây để tạo ra phần khai báo:

exec kèo bóng đá cúp c2 int i = 4;

14663_14728

kèo bóng đá cúp c2 khai báo cũng được lặp lại với tệp đầu ra dưới dạng kèo bóng đá cúp c2 biến C bình thường, do đó không cần phải khai báo chúng một lần nữa. kèo bóng đá cúp c2 biến không được sử dụng trong kèo bóng đá cúp c2 lệnh SQL có thể được khai báo bình thường bên ngoài kèo bóng đá cúp c2 phần đặc biệt này.

Định nghĩa về cấu trúc hoặc liên kết cũng phải được liệt kê bên trong Akhai báoPhần. Nếu không thì bộ tiền xử lý không thể xử lý kèo bóng đá cúp c2 loại này vì nó không biết định nghĩa.

36.4.3. Truy xuất kết quả truy vấn

Bây giờ bạn sẽ có thể chuyển dữ liệu được tạo bởi chương trình của bạn vào lệnh SQL. Nhưng làm thế nào để bạn lấy lại kết quả của một truy vấn? Với mục đích đó, SQL nhúng cung cấp kèo bóng đá cúp c2 biến thể đặc biệt của kèo bóng đá cúp c2 lệnh thông thườngChọnFetch. kèo bóng đá cúp c2 lệnh này có một đặc biệtthànhmệnh đề chỉ định kèo bóng đá cúp c2 biến máy chủ nào mà kèo bóng đá cúp c2 giá trị được truy xuất sẽ được lưu trữ trong.Chọnđược sử dụng cho một truy vấn chỉ trả về hàng đơn vàFetchđược sử dụng cho một truy vấn trả về nhiều hàng, sử dụng con trỏ.

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

/*
 * Giả sử bảng này:
 * Tạo Bảng Test1 (A Int, B Varchar (50));
 */

EXEC kèo bóng đá cúp c2 bắt đầu phần khai báo;
int v1;
Varchar v2;
EXEC kèo bóng đá cúp c2 END TUYÊN BỐ TUYÊN BỐ;

 ...

EXEC kèo bóng đá cúp c2 Chọn a, b vào: v1,: v2 từ kiểm tra;

SOthànhmệnh đề xuất hiện giữa danh sách chọn vàtừmệnh đề. Số lượng phần tử trong danh sách chọn và danh sách sauthành(còn được gọi là danh sách đích) phải bằng nhau.

Đây là một ví dụ sử dụng lệnhFetch:

EXEC kèo bóng đá cúp c2 bắt đầu khai báo;
int v1;
Varchar v2;
EXEC kèo bóng đá cúp c2 END TUYÊN BỐ TUYÊN BỐ;

 ...

EXEC kèo bóng đá cúp c2 khai báo con trỏ foo cho chọn a, b từ thử nghiệm;

 ...

LÀM

    ...
    EXEC kèo bóng đá cúp c2 tìm nạp tiếp theo từ foo thành: v1,: v2;
    ...
 trong khi (...);

ở đâythànhmệnh đề xuất hiện sau tất cả kèo bóng đá cúp c2 mệnh đề bình thường.

36.4.4. Nhập ánh xạ

Khi kèo bóng đá cúp c2 ứng dụng ECPG trao đổi giá trị giữa máy chủ PostgreSQL và ứng dụng C, chẳng hạn như khi truy xuất kết quả truy vấn từ máy chủ hoặc thực hiện kèo bóng đá cúp c2 câu lệnh SQL với kèo bóng đá cúp c2 tham số đầu vào, kèo bóng đá cúp c2 giá trị cần được chuyển đổi giữa kèo bóng đá cúp c2 loại dữ liệu PostgreSQL và kèo bóng đá cúp c2 loại thay đổi ngôn ngữ (C). Một trong những điểm chính của ECPG là nó tự động chăm sóc điều này trong hầu hết kèo bóng đá cúp c2 trường hợp.

Về mặt này, có hai loại dữ liệu: một số loại dữ liệu PostgreSQL đơn giản, chẳng hạn nhưSố nguyênText, có thể được đọc và viết trực tiếp bởi ứng dụng. kèo bóng đá cúp c2 loại dữ liệu PostgreSQL khác, chẳng hạn nhưDấu thời gianSố18045_18108Phần 36.4.4.2.

Bảng 36.1Hiển thị loại dữ liệu PostgreSQL nào tương ứng với kèo bóng đá cúp c2 loại dữ liệu C. Khi bạn muốn gửi hoặc nhận giá trị của một loại dữ liệu PostgreSQL đã cho, bạn nên khai báo một biến C của loại dữ liệu C tương ứng trong phần khai báo.

Bảng 36.1. Ánh xạ giữa kèo bóng đá cúp c2 loại dữ liệu PostgreSQL và kèo bóng đá cúp c2 loại biến C

Loại dữ liệu PostgreSQL Loại kèo bóng đá cúp c2 chủ
SmallInt ngắn
Số nguyên int
Bigint dài int
thập phân thập phân[A]
Số Số[A]
Real float
20437_20455 Double
SmallSerial ngắn
nối tiếp int
BigSerial dài int
oid unsign int
ký tự (n), Varchar (n), Text char [n+1], Varchar [n21542_21547
tên char [tên được đặt tên]
Dấu thời gian Dấu thời gian[A]
Khoảng Khoảng[A]
ngày ngày[A]
Boolean bool[B]
bytea char *, bytea [n]

[A]23293_23366Phần 36.4.4.2.

[B]được khai báo trongecpglib.hnếu không bản địa


36.4.4.1. Xử lý chuỗi ký tự

Để xử lý kèo bóng đá cúp c2 loại dữ liệu chuỗi ký tự SQL, chẳng hạn nhưVarcharText, Có hai cách có thể để khai báo kèo bóng đá cúp c2 biến máy chủ.

Một cách đang sử dụngchar [], một mảngchar, là cách phổ biến nhất để xử lý dữ liệu ký tự trong C.

EXEC kèo bóng đá cúp c2 BẮT ĐẦU phần khai báo;
    char str [50];
Exec kèo bóng đá cúp c2 end decare phần;

Lưu ý rằng bạn phải tự mình chăm sóc độ dài. Nếu bạn sử dụng kèo bóng đá cúp c2 chủ này làm biến mục tiêu của truy vấn trả về chuỗi có hơn 49 ký tự, sẽ xảy ra tràn bộ đệm.

Cách khác là sử dụng24899_24908Loại, là loại đặc biệt được cung cấp bởi ECPG. Định nghĩa trên một mảng loạiVarcharđược chuyển đổi thành một tênstructĐối với mỗi biến. Một tuyên bố như:

Varchar var [180];

được chuyển đổi thành:

struct varchar_var int len; Char Arr [180];  var;

Thành viênmảngHosts chuỗi bao gồm một byte kết thúc bằng không. Do đó, để lưu trữ một chuỗi trong mộtVarcharkèo bóng đá cúp c2 chủ, kèo bóng đá cúp c2 chủ phải được khai báo với độ dài bao gồm cả bộ kết thúc byte bằng 0. Thành viênlenGiữ độ dài của chuỗi được lưu trữ trongmảngKhông có byte chấm dứt bằng không. Khi một kèo bóng đá cúp c2 chủ được sử dụng làm đầu vào cho truy vấn, nếustrlen (mảng)lenlà khác nhau, cái ngắn hơn được sử dụng.

Varcharcó thể được viết bằng chữ hoa hoặc chữ thường, nhưng không phải trong trường hợp hỗn hợp.

charVarcharBiến máy chủ cũng có thể giữ kèo bóng đá cúp c2 giá trị của kèo bóng đá cúp c2 loại SQL khác, sẽ được lưu trữ trong kèo bóng đá cúp c2 biểu mẫu chuỗi của chúng.

36.4.4.2. Truy cập kèo bóng đá cúp c2 loại dữ liệu đặc biệt

ECPG chứa một số loại đặc biệt giúp bạn tương tác dễ dàng với một số loại dữ liệu đặc biệt từ máy chủ PostgreSQL. Cụ thể, nó đã triển khai hỗ trợ choSố, thập phân, ngày, dấu thời gianKhoảngLoại. kèo bóng đá cúp c2 loại dữ liệu này không thể được ánh xạ một cách hữu ích đến kèo bóng đá cúp c2 loại biến chủ nguyên thủy (chẳng hạn nhưint, dài inthoặcchar []27034_27270Phần 36.6Chứa kèo bóng đá cúp c2 chức năng cơ bản để xử lý kèo bóng đá cúp c2 loại đó, do đó bạn không cần phải gửi truy vấn đến máy chủ SQL chỉ để thêm một khoảng thời gian vào dấu thời gian.

kèo bóng đá cúp c2 tiểu mục sau mô tả kèo bóng đá cúp c2 loại dữ liệu đặc biệt này. Để biết thêm chi tiết về kèo bóng đá cúp c2 chức năng thư viện PGTYPES, xemPhần 36.6.

36.4.4.2.1. Dấu thời gian, ngày

Đây là mẫu để xử lýdấu thời gianBiến trong ứng dụng máy chủ ECPG.

Đầu tiên, chương trình phải bao gồm tệp tiêu đề chodấu thời gianloại:

#include <pgtypes_timestamp.h

28327_28367Dấu thời gianTrong phần khai báo:

EXEC kèo bóng đá cúp c2 BẮT ĐẦU phần khai báo;
Dấu thời gian TS;
Exec kèo bóng đá cúp c2 end decare phần;

Và sau khi đọc một giá trị vào biến máy chủ, hãy xử lý nó bằng kèo bóng đá cúp c2 hàm thư viện PGTyPes. Trong ví dụ sau,Dấu thời gianGiá trị được chuyển đổi thành mẫu văn bản (ASCII) vớipgtypestimestamp_to_asc ()chức năng:

EXEC kèo bóng đá cúp c2 CHỌN NGAY BÂY GIỜ () :: Dấu thời gian vào: TS;

printf ("ts = %s \ n", pgtypestimestamp_to_asc (ts));

Ví dụ này sẽ hiển thị một số kết quả như sau:

TS = 2010-06-27 18: 03: 56.949343

Ngoài ra, loại ngày có thể được xử lý theo cùng một cách. Chương trình phải bao gồmpgtypes_date.h, Khai báo kèo bóng đá cúp c2 chủ là loại ngày và chuyển đổi giá trị ngày thành biểu mẫu văn bản bằng cách sử dụngpgtypesdate_to_asc ()Hàm. Để biết thêm chi tiết về kèo bóng đá cúp c2 chức năng thư viện PGTYPES, xemPhần 36.6.

36.4.4.2.2. khoảng

Xử lýKhoảngLoại cũng tương tự nhưdấu thời gianngàyLoại. Tuy nhiên, yêu cầu phân bổ bộ nhớ cho mộtKhoảngLoại giá trị rõ ràng. Nói cách khác, không gian bộ nhớ cho biến phải được phân bổ trong bộ nhớ heap, không phải trong bộ nhớ ngăn xếp.

Đây là một chương trình ví dụ:

30285_30829
36.4.4.2.3. Số, thập phân

Xử lý củaSốthập phânkèo bóng đá cúp c2 loại tương tự nhưKhoảngLoại: Nó yêu cầu xác định một con trỏ, phân bổ một số không gian bộ nhớ trên đống và truy cập biến bằng kèo bóng đá cúp c2 hàm thư viện PGTYPES. Để biết thêm chi tiết về kèo bóng đá cúp c2 chức năng thư viện PGTYPES, xemPhần 36.6.

Không có chức năng nào được cung cấp cụ thể chothập phânLoại. Một ứng dụng phải chuyển đổi nó thànhSốBiến sử dụng chức năng thư viện PGTYPES để thực hiện xử lý thêm.

Đây là một ví dụ về xử lý chương trình31867_31876thập phânLoại biến.

#include <stdio.h
#include <stdlib.h
#include <pgtypes_numeric.h

EXEC kèo bóng đá cúp c2 Bất cứ khi nào sqlerror dừng lại;

int
Main (Void)

EXEC kèo bóng đá cúp c2 bắt đầu phần khai báo;
    số *num;
    số *num2;
    thập phân *dec;
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;
    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;

    num = pgtypesNumeric_new ();
    dec = pgtypesdecimal_new ();

    Exec kèo bóng đá cúp c2 Chọn 12.345 :: Numeric (4,2), 23.456 :: Decimal (4,2) vào: Num,: dec;

    printf ("numeric = %s \ n", pgtypesnumeric_to_asc (num, 0));
    printf ("numeric = %s \ n", pgtypesnumeric_to_asc (num, 1));
    printf ("numeric = %s \ n", pgtypesnumeric_to_asc (num, 2));

    /* Chuyển đổi thập phân sang số để hiển thị giá trị thập phân. */
    num2 = pgtypesnumeric_new ();
    Pgtypesnumeric_from_decimal (dec, num2);

    printf ("decimal = %s \ n", pgtypesnumeric_to_asc (num2, 0));
    printf ("decimal = %s \ n", pgtypesnumeric_to_asc (num2, 1));
    printf ("decimal = %s \ n", pgtypesnumeric_to_asc (num2, 2));

    Pgtypesnumeric_free (num2);
    Pgtypesdecimal_free (dec);
    Pgtypesnumeric_free (num);

    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ả;
    trả lại 0;
36.4.4.2.4. bytea

Xử lýbyteaLoại tương tự nhưVarchar. Định nghĩa trên một mảng loạibyteađược chuyển đổi thành một cấu trúc được đặt tên cho mọi biến. Một tuyên bố như:

bytea var [180];

được chuyển đổi thành:

struct bytea_var int len; Char Arr [180];  var;

Thành viênmảngDữ liệu định dạng nhị phân. Nó cũng có thể xử lý'\ 0'Là một phần của dữ liệu, không giống nhưVarchar. Dữ liệu được chuyển đổi từ/sang định dạng HEX và được gửi/nhận bởi ECPGLIB.

Lưu ý

bytea34251_34285bytea_outputđược đặt thànhHex.

36.4.4.3. kèo bóng đá cúp c2 biến máy chủ với kèo bóng đá cúp c2 loại không nguyên tố

Là một biến máy chủ, bạn cũng có thể sử dụng kèo bóng đá cúp c2 mảng, typedefs, structs và con trỏ.

36.4.4.3.1. Mảng

Có hai trường hợp sử dụng cho kèo bóng đá cúp c2 mảng làm biến máy chủ. Đầu tiên là một cách để lưu trữ một số chuỗi văn bản trongchar []hoặcVarchar [], như được giải thích trongPhần 36.4.4.1. Trường hợp sử dụng thứ hai là lấy nhiều hàng từ kết quả truy vấn mà không cần sử dụng con trỏ. Không có một mảng, để xử lý kết quả truy vấn bao gồm nhiều hàng, cần phải sử dụng con trỏ vàFetchLệnh. Nhưng với kèo bóng đá cúp c2 biến máy chủ mảng, có thể nhận được nhiều hàng cùng một lúc. Độ dài của mảng phải được xác định để có thể chứa tất cả kèo bóng đá cúp c2 hàng, nếu không thì một bộ đệm có thể xảy ra.

Ví dụ sau quétpg_databaseBảng hệ thống và hiển thị tất cả kèo bóng đá cúp c2 OID và tên của cơ sở dữ liệu có sẵn:

int
Main (Void)

EXEC SQL bắt đầu phần khai báo;
    int dbid [8];
    DBName char [8] [16];
    int i;
EXEC SQL END TUYÊN BỐ TUYÊN BỐ;

    memset (dbname, 0, sizeof (char) * 16 * 8);
    memset (dbid, 0, sizeof (int) * 8);

    EXEC SQL Kết nối với TestDB;
    Exec sql chọn pg_catalog.set_config ('search_path', '', false); Exec sql cam kết;

    /* Lấy nhiều hàng vào kèo bóng đá cúp c2 mảng cùng một lúc. */
    EXEC SQL Chọn OID, DATNAME thành: DBID,: DBNAME từ pg_database;

    for (i = 0; i <8; i ++)
        printf ("oid =%d, dbname =%s \ n", dbid [i], dbname [i]);

    Exec sql cam kết;
    EXEC SQL Ngắt kết nối tất cả;
    trả lại 0;

Ví dụ này hiển thị kết quả sau. (kèo bóng đá cúp c2 giá trị chính xác phụ thuộc vào hoàn cảnh cục bộ.)

oid = 1, dbname = template1
oid = 11510, dbname = template0
oid = 11511, dbname = postgres
oid = 313780, dbname = testDb
oid = 0, dbname =
oid = 0, dbname =
oid = 0, dbname =
36.4.4.3.2. Cấu trúc

37170_37375

Ví dụ sau lấy OIDS, tên và kích thước của cơ sở dữ liệu có sẵn từpg_databaseBảng hệ thống và sử dụngpg_database_size ()Hàm. Trong ví dụ này, một biến cấu trúcdbinfo_tVới kèo bóng đá cúp c2 thành viên có tên khớp với từng cột trongChọnKết quả được sử dụng để truy xuất một hàng kết quả mà không đặt nhiều kèo bóng đá cúp c2 chủ vàoFetchcâu lệnh.

EXEC SQL bắt đầu phần khai báo;
    Cấu trúc typedef

       int oid;
       DatName char [65];
       Kích thước int dài dài;
     dbinfo_t;

    dbinfo_t dbval;
EXEC SQL END TUYÊN BỐ TUYÊN BỐ;

    memset (& dbval, 0, sizeof (dbinfo_t));

    EXEC SQL Tuyên bố con trỏ Cur1 cho chọn OID, DATNAME, PG_DATABASE_SIZE (OID) làm kích thước từ pg_database;
    EXEC SQL MỞ CUR1;

    / * Khi kết quả kết quả đã đạt được, thoát ra trong khi vòng lặp */
    EXEC SQL Bất cứ khi nào không tìm thấy bị phá vỡ;

    while (1)

        /* Tìm nạp nhiều cột vào một cấu trúc. */
        EXEC SQL tìm nạp từ Cur1 thành: DBVAL;

        /* In kèo bóng đá cúp c2 thành viên của cấu trúc. */
        printf ("oid =%d, datName =%s, size =%lld \ n", dbval.oid, dbval.datname, dbval.size);

    EXEC SQL Đóng Cur1;

Ví dụ này hiển thị kết quả sau. (kèo bóng đá cúp c2 giá trị chính xác phụ thuộc vào hoàn cảnh cục bộ.)

oid = 1, datName = template1, size = 4324580
oid = 11510, datName = template0, size = 4243460
oid = 11511, datName = postgres, size = 4324580
oid = 313780, datName = testDb, size = 8183012

kèo bóng đá cúp c2 chủ cấu trúchấp thụHồi39123_39308sizeBiến bên ngoài cấu trúc:

EXEC SQL bắt đầu phần khai báo;
    Cấu trúc typedef

       int oid;
       DatName char [65];
     dbinfo_t;

    dbinfo_t dbval;
    Kích thước int dài dài;
EXEC SQL END TUYÊN BỐ TUYÊN BỐ;

    memset (& dbval, 0, sizeof (dbinfo_t));

    EXEC SQL Tuyên bố con trỏ Cur1 cho chọn OID, DATNAME, PG_DATABASE_SIZE (OID) làm kích thước từ pg_database;
    EXEC SQL MỞ CUR1;

    / * Khi kết quả kết quả đã đạt được, thoát ra trong khi vòng lặp */
    EXEC SQL Bất cứ khi nào không tìm thấy bị phá vỡ;

    while (1)

        /* Tìm nạp nhiều cột vào một cấu trúc. */
        EXEC SQL tìm nạp từ Cur1 thành: dbval,: kích thước;

        /* In kèo bóng đá cúp c2 thành viên của cấu trúc. */
        printf ("oid =%d, datName =%s, size =%lld \ n", dbval.oid, dbval.datname, size);

    EXEC SQL Đóng Cur1;
36.4.4.3.3. Typedefs

Sử dụngtypedefTừ khóa để ánh xạ kèo bóng đá cúp c2 loại mới thành kèo bóng đá cúp c2 loại đã có.

EXEC kèo bóng đá cúp c2 bắt đầu khai báo;
    typedef char mychartype [40];
    typedef dài serial_t;
Exec kèo bóng đá cúp c2 end decare phần;

Lưu ý rằng bạn cũng có thể sử dụng:

EXEC kèo bóng đá cúp c2 Loại serial_t dài;

Tuyên bố này không cần phải là một phần của phần khai báo.

36.4.4.3.4. Con trỏ

41161_41316Phần 36.7Để biết thêm thông tin về phân bổ tự động.

EXEC kèo bóng đá cúp c2 BẮT ĐẦU phần khai báo;
    int *intp;
    char ** charp;
Exec kèo bóng đá cúp c2 end decare phần;

36.4.5. Xử lý kèo bóng đá cúp c2 loại dữ liệu SQL không nguyên nhân

Phần này chứa thông tin về cách xử lý kèo bóng đá cúp c2 loại dữ liệu cấp độ SQL không xác định và người dùng trong kèo bóng đá cúp c2 ứng dụng ECPG. Lưu ý rằng điều này khác biệt với việc xử lý kèo bóng đá cúp c2 biến máy chủ của kèo bóng đá cúp c2 loại không đơn trùng, được mô tả trong phần trước.

36.4.5.1. Mảng

Mảng cấp độ SQL đa chiều không được hỗ trợ trực tiếp trong ECPG. kèo bóng đá cúp c2 mảng cấp độ SQL một chiều có thể được ánh xạ vào kèo bóng đá cúp c2 biến máy chủ c mảng C và ngược lại. Tuy nhiên, khi tạo một câu lệnh ECPG không biết kèo bóng đá cúp c2 loại của kèo bóng đá cúp c2 cột, do đó nó không thể kiểm tra xem một mảng C có được nhập vào một mảng cấp độ SQL tương ứng không. Khi xử lý đầu ra của câu lệnh SQL, ECPG có thông tin cần thiết và do đó kiểm tra xem cả hai đều là mảng.

Nếu truy vấn truy cậpElementscủa một mảng một cách riêng biệt, sau đó điều này tránh việc sử dụng kèo bóng đá cúp c2 mảng trong ECPG. Sau đó, một biến máy chủ với một loại có thể được ánh xạ tới loại phần tử nên được sử dụng. Ví dụ: nếu loại cột là mảngSố nguyên, một kèo bóng đá cúp c2 chủ của loạiintcó thể được sử dụng. Ngoài ra nếu loại phần tử làVarcharhoặcText, một kèo bóng đá cúp c2 chủ của loạichar []hoặcVarchar []có thể được sử dụng.

Đây là một ví dụ. Giả sử bảng sau:

Tạo bảng T3 (
    ii số nguyên []
);

testDb = select * từ t3;
     ii
-------------
 1,2,3,4,5

Chương trình ví dụ sau lấy phần tử thứ 4 của mảng và lưu trữ nó thành một kèo bóng đá cúp c2 chủ của loạiint:

43788_44080

Ví dụ này hiển thị kết quả sau:

ii = 4

44187_44393

EXEC kèo bóng đá cúp c2 BẮT ĐẦU phần khai báo;
int ii_a [8];
EXEC kèo bóng đá cúp c2 END TUYÊN BỐ TUYÊN BỐ;

EXEC kèo bóng đá cúp c2 khai báo con trỏ Cur1 cho chọn II [1], II [2], II [3], II [4] từ T3;
EXEC kèo bóng đá cúp c2 MỞ CUR1;

EXEC kèo bóng đá cúp c2 Bất cứ khi nào không tìm thấy bị phá vỡ;

while (1)

    Exec kèo bóng đá cúp c2 tìm nạp từ Cur1 vào: ii_a [0],: ii_a [1],: ii_a [2],: ii_a [3];
    ...

Lưu ý lại rằng

EXEC kèo bóng đá cúp c2 bắt đầu khai báo;
int ii_a [8];
EXEC kèo bóng đá cúp c2 END TUYÊN BỐ TUYÊN BỐ;

EXEC kèo bóng đá cúp c2 tuyên bố con trỏ Cur1 cho Chọn II từ T3;
EXEC kèo bóng đá cúp c2 MỞ CUR1;

EXEC kèo bóng đá cúp c2 Bất cứ khi nào không tìm thấy bị phá vỡ;

while (1)

    /* SAI */
    EXEC kèo bóng đá cúp c2 tìm nạp từ Cur1 vào: ii_a;
    ...

Sẽ không hoạt động chính xác trong trường hợp này, vì bạn không thể ánh xạ một cột loại mảng thành một kèo bóng đá cúp c2 chủ mảng trực tiếp.

Một cách giải quyết khác là lưu trữ kèo bóng đá cúp c2 mảng trong biểu diễn chuỗi bên ngoài của chúng trong kèo bóng đá cúp c2 biến máy chủ của loạichar []hoặcVarchar []. Để biết thêm chi tiết về đại diện này, xemPhần 8.15.2. Lưu ý rằng điều này có nghĩa là mảng không thể được truy cập một cách tự nhiên dưới dạng một mảng trong chương trình máy chủ (mà không cần xử lý thêm để phân tích biểu diễn văn bản).

36.4.5.2. kèo bóng đá cúp c2 loại tổng hợp

kèo bóng đá cúp c2 loại tổng hợp không được hỗ trợ trực tiếp trong ECPG, nhưng có thể giải quyết dễ dàng. kèo bóng đá cúp c2 cách giải quyết có sẵn tương tự như kèo bóng đá cúp c2 cách được mô tả cho kèo bóng đá cúp c2 mảng ở trên: hoặc truy cập mỗi thuộc tính riêng biệt hoặc sử dụng biểu diễn chuỗi bên ngoài.

Đối với kèo bóng đá cúp c2 ví dụ sau, giả sử loại và bảng sau:

Tạo loại comp_t AS (Intval Integer, TextVal Varchar (32));
Tạo Bảng T4 (compval comp_t);
Chèn vào kèo bóng đá cúp c2 giá trị T4 ((256, 'PostgreSql'));

Giải pháp rõ ràng nhất là truy cập riêng từng thuộc tính. Chương trình sau lấy dữ liệu từ bảng ví dụ bằng cách chọn từng thuộc tính của loạicomp_triêng biệt:

46738_47283

Để tăng cường ví dụ này, kèo bóng đá cúp c2 biến máy chủ để lưu trữ kèo bóng đá cúp c2 giá trị trongFetch47398_47513Phần 36.4.4.3.2. Để chuyển sang cấu trúc, ví dụ có thể được sửa đổi như dưới đây. Hai kèo bóng đá cúp c2 chủ,intvalTextVal, trở thành thành viên củacomp_tCấu trúc và cấu trúc được chỉ định trênFetchlệnh.

EXEC SQL BẮT ĐẦU phần khai báo;
Cấu trúc typedef

    int intval;
    Varchar TextVal [33];
 comp_t;

comp_t compval;
EXEC SQL END TUYÊN BỐ TUYÊN BỐ;

/* Đặt từng phần tử của cột loại tổng hợp vào danh sách chọn. */
EXEC SQL Tuyên bố con trỏ Cur1 cho Chọn (CompVal) .IntVal, (CompVal) .TextVal từ T4;
EXEC SQL MỞ CUR1;

EXEC SQL Bất cứ khi nào không tìm thấy bị phá vỡ;

while (1)

    /* Đặt tất cả kèo bóng đá cúp c2 giá trị vào danh sách chọn vào một cấu trúc. */
    EXEC SQL tìm nạp từ Cur1 thành: CompVal;

    printf ("intval =%d, textVal =%s \ n", compval.intval, compval.textval.arr);

EXEC SQL Đóng Cur1;

Mặc dù cấu trúc được sử dụng trongFetchlệnh, tên thuộc tính trongChọnmệnh đề được chỉ định từng cái một. Điều này có thể được tăng cường bằng cách sử dụng*Để yêu cầu tất cả kèo bóng đá cúp c2 thuộc tính của giá trị loại tổng hợp.

...
EXEC SQL Tuyên bố con trỏ Cur1 cho Chọn (compval).* Từ T4;
EXEC SQL MỞ CUR1;

EXEC SQL Bất cứ khi nào không tìm thấy bị phá vỡ;

while (1)

    /* Đặt tất cả kèo bóng đá cúp c2 giá trị vào danh sách chọn vào một cấu trúc. */
    EXEC SQL tìm nạp từ Cur1 thành: CompVal;

    printf ("intval =%d, textVal =%s \ n", compval.intval, compval.textval.arr);

Theo cách này, kèo bóng đá cúp c2 loại tổng hợp có thể được ánh xạ vào kèo bóng đá cúp c2 cấu trúc gần như liền mạch, mặc dù ECPG không hiểu loại tổng hợp.

Cuối cùng, cũng có thể lưu trữ kèo bóng đá cúp c2 giá trị loại tổng hợp trong biểu diễn chuỗi bên ngoài của chúng trong kèo bóng đá cúp c2 biến máy chủ của loạichar []hoặcVarchar []. Nhưng theo cách đó, không dễ dàng truy cập kèo bóng đá cúp c2 trường của giá trị từ chương trình máy chủ.

36.4.5.3. kèo bóng đá cúp c2 loại cơ sở do người dùng xác định

kèo bóng đá cúp c2 loại cơ sở do người dùng mới xác định không được ECPG hỗ trợ trực tiếp. Bạn có thể sử dụng biểu diễn chuỗi bên ngoài và kèo bóng đá cúp c2 biến máy chủ của loạichar []hoặcVarchar [], và giải pháp này thực sự phù hợp và đủ cho nhiều loại.

Đây là một ví dụ sử dụng kiểu dữ liệuphức tạpTừ ví dụ trongPhần 38.13. Biểu diễn chuỗi bên ngoài của loại đó là(%f,%f), được xác định trong kèo bóng đá cúp c2 chức năngphức tạp_in ()Complex_out ()Chức năng trongPhần 38.13. Ví dụ sau chèn kèo bóng đá cúp c2 giá trị loại phức(1,1)(3,3)vào kèo bóng đá cúp c2 cộtAB, và chọn chúng từ bảng sau đó.

EXEC SQL bắt đầu khai báo;
    Varchar A [64];
    Varchar B [64];
EXEC SQL END TUYÊN BỐ TUYÊN BỐ;

    Exec sql chèn vào kèo bóng đá cúp c2 giá trị test_complex ('(1,1)', '(3,3)');

    EXEC SQL Tuyên bố con trỏ Cur1 cho Chọn A, B từ Test_Complex;
    EXEC SQL MỞ CUR1;

    EXEC SQL Bất cứ khi nào không tìm thấy bị phá vỡ;

    while (1)

        Exec SQL tìm nạp từ Cur1 thành: A,: B;
        printf ("a =%s, b =%s \ n", a.arr, b.arr);

    EXEC SQL Đóng Cur1;

Ví dụ này hiển thị kết quả sau:

a = (1,1), b = (3,3)

Một cách giải quyết khác đang tránh sử dụng trực tiếp kèo bóng đá cúp c2 loại do người dùng xác định trong ECPG và thay vào đó tạo ra một chức năng hoặc đúc chuyển đổi giữa loại do người dùng xác định và loại nguyên thủy mà ECPG có thể xử lý. Tuy nhiên, lưu ý rằng kèo bóng đá cúp c2 phôi loại đó, đặc biệt là kèo bóng đá cúp c2 loại ẩn, nên được đưa vào hệ thống loại rất cẩn thận.

Ví dụ:

52031_52186

Sau định nghĩa này, sau đây

EXEC SQL bắt đầu phần khai báo;
Nhân đôi A, B, C, D;
EXEC SQL END TUYÊN BỐ TUYÊN BỐ;

a = 1;
b = 2;
c = 3;
d = 4;

EXEC SQL chèn vào kèo bóng đá cúp c2 giá trị test_complex (created_complex (: a,: b), create_complex (: c,: d));

có tác dụng tương tự như

52555_52619

36.4.6. Chỉ báo

kèo bóng đá cúp c2 ví dụ trên không xử lý kèo bóng đá cúp c2 giá trị null. Trên thực tế, kèo bóng đá cúp c2 ví dụ truy xuất sẽ gây ra lỗi nếu chúng lấy giá trị null từ cơ sở dữ liệu. Để có thể chuyển kèo bóng đá cúp c2 giá trị null vào cơ sở dữ liệu hoặc truy xuất kèo bóng đá cúp c2 giá trị null từ cơ sở dữ liệu, bạn cần nối thêm thông số kỹ thuật của biến máy chủ thứ hai vào từng biến máy chủ chứa dữ liệu. Biến máy chủ thứ hai này được gọi làChỉ báovà chứa một lá cờ cho biết liệu dữ liệu có phải là null hay không, trong trường hợp đó, giá trị của biến máy chủ thực có bị bỏ qua hay không. Dưới đây là một ví dụ xử lý đúng kèo bóng đá cúp c2 giá trị null một cách chính xác:

EXEC kèo bóng đá cúp c2 bắt đầu phần khai báo;
Varchar val;
int val_ind;
EXEC kèo bóng đá cúp c2 END TUYÊN BỐ TUYÊN BỐ:

 ...

EXEC kèo bóng đá cúp c2 Chọn B vào: val: val_ind từ test1;

Biến chỉ báoVal_ind53699_53794Phần 36.16Để kích hoạt hành vi cụ thể của Oracle.)

53956_54128

Nếu đối số-r no_indicatorđược chuyển cho bộ tiền xử lýECPG, nó hoạt động trongkhông chỉ đạoHàngChế độ. Trong chế độ không chỉ định, nếu không có biến chỉ báo được chỉ định, kèo bóng đá cúp c2 giá trị null được báo hiệu (trên đầu vào và đầu ra) cho kèo bóng đá cúp c2 loại chuỗi ký tự là chuỗi trống và cho kèo bóng đá cúp c2 loại số nguyên là giá trị thấp nhất có thể cho loại (ví dụ:int_minchoint).

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.