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
Tài liệu này dành cho phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cùng một trang chohiện tạiPhiên bản hoặc một trong cách đọc kèo bóng đá đá phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

33.4. Sử dụng cách đọc kèo bóng đá biến máy chủ

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

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

33.4.1. Tổng quan

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

EXEC SQL chèn vào cách đọc kèo bóng đá 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 cách đọc kèo bóng đá 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.

Phong cách chèn c biến C trong cách đọc kèo bóng đá câu lệnh SQL hoạt động Bất cứ nơi nào một biểu thức giá trị được mong đợi trong SQL tuyên bố.

33.4.2. Khai báo phần

12780_13102

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

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

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

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

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

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

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

EXEC cách đọc kèo bóng đá INT I = 4;

Bạn có thể có nhiều phần khai báo trong một chương trình như bạn giống.

cách đọc kèo bóng đá khai báo cũng được lặp lại với tệp đầu ra là cách đọc kèo bóng đá biến C bình thường, vì vậy không cần phải khai báo chúng một lần nữa. cách đọc kèo bóng đá biến không được sử dụng trong cách đọc kèo bóng đá lệnh SQL có thể được khai báo bình thường bên ngoài cách đọc kèo bóng đá 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ý cách đọc kèo bóng đá loại này vì nó không Biết định nghĩa.

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

Bây giờ bạn sẽ có thể truyền dữ liệu được tạo bởi lập trình vào một 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 cách đọc kèo bóng đá biến thể đặc biệt của cách đọc kèo bóng đá lệnh thông thườngChọnFetch. Những cái này cách đọc kèo bóng đá lệnh có một đặc biệtthànhmệnh đề chỉ định cách đọc kèo bóng đá biến máy chủ nào cách đọc kèo bóng đá giá trị được truy xuất được lưu trữ trong.Chọnđược sử dụng cho một Truy vấn chỉ trả về một hàng duy nhất 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 cách đọc kèo bóng đá bắt đầu phần khai báo;
int v1;
Varchar v2;
EXEC cách đọc kèo bóng đá END TUYÊN BỐ TUYÊN BỐ;

 ...

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

Vì vậy,thà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.

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

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

 ...

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

 ...

LÀM

    ...
    EXEC cách đọc kèo bóng đá 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ả cách đọc kèo bóng đá mệnh đề bình thường.

33.4.4. Nhập ánh xạ

16409_16857

Về mặt này, có hai loại dữ liệu: một số cách đọc kèo bóng đá loại dữ liệu PostgreSQL đơn giản, chẳng hạn nhưSố nguyênText, có thể đọc được và được viết trực tiếp bởi ứng dụng. Dữ liệu PostgreSQL khác cách đọc kèo bóng đá loại, chẳng hạn nhưDấu thời gianSốChỉ có thể được truy cập thông qua đặc biệt chức năng thư viện; nhìn thấy17321_17343.

Bảng 33-1hiển thị cách đọc kèo bóng đá loại dữ liệu PostgreSQL tương ứng với đó C kiểu dữ liệu. Khi bạn muốn gửi hoặc nhận giá trị của một Cho kiểu dữ liệu PostgreSQL, bạn nên khai báo một biến C của Kiểu dữ liệu C tương ứng trong phần khai báo.

Bảng 33-1. Ánh xạ giữa dữ liệu PostgreSQL Loại và loại biến c

Loại dữ liệu PostgreSQL Loại cách đọc kèo bóng đá 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
Double Precision 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 [n+1][B]
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]
21412_21421 bool[C]
ghi chú:
a.Loại này chỉ có thể truy cập thông qua cách đọc kèo bóng đá chức năng thư viện đặc biệt; nhìn thấyPhần 33.4.4.2.
b.Tuyên bố TRONGecpglib.h
c.Tuyên bố TRONG22180_22191Nếu không tự nhiên

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

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

Một cách đọc kèo bóng đá đang sử dụngchar [], một mảngChar22712_22781

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

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

cách đọc kèo bóng đá khác là sử dụngVarcharLoại, là loại đặc biệt được cung cấp bởi ECPG. cách đọc kèo bóng đá Định nghĩa trên một mảng loạiVarcharđược chuyển đổi thành một cái tênstructcho 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ảngMáy chủ lưu trữ Chuỗi bao gồm một byte chấm dứt bằng không. Do đó, để lưu trữ một Chuỗi trong AVarcharcách đọc kèo bóng đá chủ, The cách đọc kèo bóng đá chủ phải được khai báo với độ dài bao gồm cả Kẻ hủy diệt byte bằng không. Thành viên23962_23967Giữ độ dài của chuỗi được lưu trữ trongmảngKhông có Chấm dứt byte 0. Khi một cách đọc kèo bóng đá chủ được sử dụng làm đầu vào cho một truy vấn, nếustrlen (mảng)lenlà khác nhau, ngắn hơn một được sử dụng.

Varcharcó thể được viết ở phía trên hoặc chữ thường, nhưng không trong trường hợp hỗn hợp.

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

33.4.4.2. Truy cập dữ liệu đặc biệt Loại

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ừ PostgreSQL máy chủ. Cụ thể, nó đã triển khai hỗ trợ choSố, thập phân, ngày, dấu thời gian, VàKhoảngLoại. Những loại dữ liệu này không thể được ánh xạ một cách hữu ích đến cách đọc kèo bóng đá loại biến chủ nguyên thủy (chẳng hạn nhưint, Long Long inthoặcchar []25342_25602Phần 33.6Chứa cách đọc kèo bóng đá chức năng cơ bản để đối phó với cách đọc kèo bóng đá loại đó, sao cho bạn không cần phải gửi một truy vấn đến máy chủ SQL chỉ để thêm một khoảng thời gian Ví dụ đóng dấu.

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

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

Đây là một mẫu để xử lýDấu thời gian26241_26291

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

#include <pgtypes_timestamp.h

Tiếp theo, khai báo cách đọc kèo bóng đá chủ dưới dạng loạiDấu thời gianTrong phần khai báo:

26650_26729

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

EXEC cách đọc kèo bóng đá CHỌN NGAY BÂY GIỜ () :: Timestamp thành: 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ý trong cùng một đường. Chương trình phải bao gồmpgtypes_date.h, khai báo cách đọc kèo bóng đá chủ là loại ngày và chuyển đổi giá trị ngày thành biểu mẫu văn bản sử dụngpgtypesdate_to_asc ()27637_27724Phần 33.6.

33.4.4.2.2. khoảng

Xử lýKhoảngLoại cũng tương tự nhưDấu thời gianngàyLoại. Nó được yêu cầu, tuy nhiên, để phân bổ bộ nhớ cho mộtKhoảngLoại giá trị rõ ràng. Nói cách đọc kèo bóng đá 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ụ:

#include <stdio.h
#include <stdlib.h
#include <pgtypes_interval.h

int
Main (Void)

EXEC cách đọc kèo bóng đá bắt đầu phần khai báo;
    khoảng *in;
EXEC cách đọc kèo bóng đá END TUYÊN BỐ TUYÊN BỐ;

    EXEC cách đọc kèo bóng đá Kết nối với TestDB;

    in = pgtyPesInterval_new ();
    Exec cách đọc kèo bóng đá Chọn '1 phút' :: khoảng vào: in;
    printf ("khoảng = %s \ n", pgtypesInterval_to_asc (in));
    PgtypesInterval_free (in);

    Exec cách đọc kèo bóng đá cam kết;
    EXEC cách đọc kèo bóng đá Ngắt kết nối tất cả;
    trả lại 0;

33.4.4.2.3. số, số thập phân

Xử lýSốthập phâncách đọc kèo bóng đá loại tương tự nhưKhoảngLoại: nó yêu cầu xác định a con trỏ, phân bổ một số không gian bộ nhớ trên đống và Truy cập biến bằng cách đọc kèo bóng đá hàm thư viện PGTYPES. Để biết thêm chi tiết về cách đọc kèo bóng đá chức năng thư viện PGTYPES, xemPhần 33.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 để làm thêm xử lý.

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

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

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

int
Main (Void)

EXEC cách đọc kèo bóng đá bắt đầu phần khai báo;
    số *num;
    số *num2;
    thập phân *dec;
EXEC cách đọc kèo bóng đá END TUYÊN BỐ TUYÊN BỐ;

    EXEC cách đọc kèo bóng đá Kết nối với TestDB;

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

    Exec cách đọc kèo bóng đá 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 cách đọc kèo bóng đá cam kết;
    EXEC cách đọc kèo bóng đá Ngắt kết nối tất cả;
    trả lại 0;

33.4.4.3. cách đọc kèo bóng đá biến máy chủ với cách đọc kèo bóng đá loại không nguyên tắc

31346_31430

33.4.4.3.1. Mảng

Có hai trường hợp sử dụng cho cách đọc kèo bóng đá 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 33.4.4.1. cách đọc kèo bóng đá Trường hợp sử dụng thứ hai là lấy nhiều hàng từ truy vấn kết quả mà không sử dụng con trỏ. Không có một mảng, để xử lý Một kết quả truy vấn bao gồm nhiều hàng, nó được yêu cầu Để sử dụng con trỏ vàFetchLệnh. Nhưng với cách đọc kèo bóng đá biến máy chủ mảng, nhiều hàng có thể được nhận ngay lập tức. Chiều dài của mảng phải là được xác định để có thể chứa tất cả cách đọc kèo bóng đá hàng, nếu không tràn bộ đệm có thể sẽ xảy ra.

Ví dụ sau quétpg_databaseBảng hệ thống và hiển thị tất cả cách đọc kèo bóng đá OIDS 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;

    /* Lấy nhiều hàng vào cách đọc kèo bóng đá 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. (cách đọc kèo bóng đá giá trị chính xác phụ thuộc vào hoàn cảnh địa phương.)

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 =

33.4.4.3.2. Cấu trúc

Một cấu trúc có tên thành viên phù hợp với tên cột của Một kết quả truy vấn, có thể được sử dụng để truy xuất nhiều cột tại một lần. Cấu trúc cho phép xử lý nhiều giá trị cột trong một cách đọc kèo bóng đá chủ duy nhất.

Ví dụ sau lấy OIDS, tên và kích cỡ của cơ sở dữ liệu có sẵn từ33971_33984Bảng hệ thống và sử dụngpg_database_size ()34071_34130dbinfo_tVới cách đọc kèo bóng đá thành viên có tên khớp với mỗi cột trongChọnKết quả là được sử dụng để truy xuất một hàng kết quả mà không đặt nhiều cách đọc kèo bóng đá biến máy chủ trongFetchcâ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 cách đọc kèo bóng đá 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. (cách đọc kèo bóng đá giá trị chính xác phụ thuộc vào hoàn cảnh địa phương.)

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

cách đọc kèo bóng đá chủ cấu trúc"hấp thụ"nhiều cột như cấu trúc như Cánh đồng. cách đọc kèo bóng đá cột bổ sung có thể được gán cho máy chủ khác Biến. Ví dụ, chương trình trên cũng có thể là Tái cấu trúc như thế này, vớisizeBiến bên ngoài cấu trúc:

35945_36716

33.4.4.3.3. Typedefs

Sử dụngtypedefTừ khóa để bản đồ cách đọc kèo bóng đá loại mới cho cách đọc kèo bóng đá loại đã có.

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

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

EXEC cách đọc kèo bóng đá Loại serial_t dài;

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

37460_37482

Bạn có thể khai báo con trỏ đến cách đọc kèo bóng đá loại phổ biến nhất. Ghi chú tuy nhiên bạn không thể sử dụng con trỏ như cách đọc kèo bóng đá biến mục tiêu của Truy vấn mà không cần phân bổ tự động. Nhìn thấy37712_37726Để biết thêm thông tin về phân bổ tự động.

EXEC cách đọc kèo bóng đá bắt đầu phần khai báo;
    int *intp;
    char ** charp;
Exec cách đọc kèo bóng đá end decare phần;

33.4.5. Xử lý không hợp lý Kiểu dữ liệu cách đọc kèo bóng đá

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

33.4.5.1. Mảng

Mảng cấp độ SQL đa chiều không trực tiếp được hỗ trợ trong ECPG. cách đọc kèo bóng đá mảng cấp độ SQL một chiều có thể được ánh xạ vào cách đọc kèo bóng đá 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 cách đọc kèo bóng đá loại của cách đọc kèo bóng đá cột, để nó không thể kiểm tra xem một mảng C có được nhập vào Mảng cấp độ SQL tương ứng. Khi xử lý đầu ra của Một 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 cách đọc kèo bóng đá 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 phần tử Loại nên được sử dụng. Ví dụ: nếu một loại cột là mảng củaSố nguyên, một cách đọc kèo bóng đá chủ của loạiintcó thể được sử dụng. Ngoài ra nếu phần tử Loại làVarcharhoặcText, một cách đọc kèo bóng đá chủ của loạichar []hoặcVarchar []có thể đã 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ó vào một cách đọc kèo bóng đá chủ của loạiint:

EXEC cách đọc kèo bóng đá BẮT ĐẦU phần khai báo;
int ii;
EXEC cách đọc kèo bóng đá END TUYÊN BỐ TUYÊN BỐ;

EXEC cách đọc kèo bóng đá khai báo con trỏ Cur1 cho Chọn II [4] từ T3;
EXEC cách đọc kèo bóng đá MỞ CUR1;

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

while (1)

    EXEC cách đọc kèo bóng đá tìm nạp từ Cur1 vào: II;
    printf ("ii =%d \ n", ii);

EXEC cách đọc kèo bóng đá Đóng Cur1;

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

ii = 4

Để ánh xạ nhiều phần tử mảng đến nhiều phần tử trong một loại máy chủ loại mảng biến từng phần tử của cột mảng và Mỗi phần tử của mảng cách đọc kèo bóng đá chủ phải được quản lý một cách riêng biệt, ví dụ:

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

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

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

while (1)

    Exec cách đọc kèo bóng đá 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 cách đọc kèo bóng đá bắt đầu khai báo;
int ii_a [8];
EXEC cách đọc kèo bóng đá END TUYÊN BỐ TUYÊN BỐ;

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

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

while (1)

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

41396_41528

Một cách giải quyết khác là lưu trữ cách đọc kèo bóng đá mảng trong bên ngoài của họ Biểu diễn chuỗi trong cách đọc kèo bóng đá biến máy chủ của loạichar []hoặcVarchar []. Vì Thông tin 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 đọc kèo bóng đá tự nhiên dưới dạng một mảng trong chương trình máy chủ (không xử lý thêm phân tích cú pháp biểu diễn văn bản).

33.4.5.2. cách đọc kèo bóng đá loại tổng hợp

42168_42442

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

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

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

EXEC SQL bắt đầu phần khai báo;
int intval;
Varchar TextVal [33];
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ìm nạp từng phần tử của cột loại tổng hợp thành cách đọc kèo bóng đá biến máy chủ. */
    EXEC SQL tìm nạp từ Cur1 thành: intval,: TextVal;

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

EXEC SQL Đóng Cur1;

Để tăng cường ví dụ này, cách đọc kèo bóng đá biến máy chủ để lưu trữ giá trị trongFetchLệnh có thể tập hợp thành một cấu trúc. Để biết thêm chi tiết về máy chủ Biến trong mẫu cấu trúc, xemPhần 33.4.4.3.2. Để chuyển sang cấu trúc, ví dụ có thể được sửa đổi như dưới đây. Hai cách đọc kèo bóng đá 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ả cách đọc kèo bóng đá 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 một bởi một. Điều này có thể được tăng cường bằng cách đọc kèo bóng đá sử dụng*Để yêu cầu tất cả cách đọc kèo bóng đá thuộc tính của tổng hợp Loại giá trị.

...
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ả cách đọc kèo bóng đá 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, cách đọc kèo bóng đá loại tổng hợp có thể được ánh xạ vào cách đọc kèo bóng đá 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 chính nó.

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

33.4.5.3. cách đọc kèo bóng đá loại cơ sở do người dùng xác định

cách đọc kèo bóng đá loại cơ sở do người dùng xác định mới không được hỗ trợ trực tiếp bởi ECPG. Bạn có thể sử dụng biểu diễn và máy chủ chuỗi bên ngoài cách đọc kèo bóng đá biến của loạichar []hoặcVarchar [], và giải pháp này thực sự là thích 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 35.11. Chuỗi bên ngoài Đại diện của loại đó là(%lf,%lf), được xác định trong cách đọc kèo bóng đá chức năngphức tạp_in ()Complex_out ()Chức năng trongPhần 35.11. Ví dụ sau đây Chèn cách đọc kèo bóng đá giá trị loại phức(1,1)(3,3)47070_47096ABvà chọn chúng từ bảng sau khi cái đó.

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

    Exec sql chèn vào cách đọc kèo bóng đá 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 cách đọc kèo bóng đá loại do người dùng xác định trong ECPG và thay vào đó tạo chức năng hoặc Cast 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ý. Lưu ý, tuy nhiên, loại đó cách đọc kèo bóng đá diễn viên, đặc biệt là những người tiềm ẩn, nên được đưa vào hệ thống loại rất cẩn thận.

Ví dụ:

48230_48385

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 cách đọc kèo bóng đá giá trị test_complex (created_complex (: a,: b), create_complex (: c,: d));

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

EXEC SQL chèn vào cách đọc kèo bóng đá giá trị test_complex ('(1,2)', '(3,4)');

33.4.6. Chỉ báo

48978_49376Chỉ báovà chứa a 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 bị bỏ qua. Đây là một ví dụ Điều đó xử lý đúng cách đọc kèo bóng đá giá trị null một cách chính xác:

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

 ...

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

Biến chỉ báoVal_indWill bằng không nếu giá trị không phải là null và nó sẽ âm nếu giá trị là null.

Chỉ báo có chức năng khác: Nếu giá trị chỉ báo là tích cực, nó có nghĩa là giá trị không phải là vô giá trị, nhưng nó là cắt ngắn khi nó được lưu trữ trong cách đọc kèo bóng đá chủ.

Nếu đối số-r no_indicatorIS được chuyển cho bộ tiền xử lýECPG, Nó hoạt động trong"Không chỉ nội"50342_50592int_minchoint).