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 kèo bóng đá pháp trang chohiện tạiPhiên bản hoặc kèo bóng đá pháp trong các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

34.8. Xử lý kèo bóng đá pháp

Phần này mô tả cách bạn có thể xử lý các điều kiện và cảnh báo đặc biệt trong chương trình kèo bóng đá pháp nhúng. Có hai cơ sở không có kết luận cho việc này.

  • Gọi lại có thể được cấu hình để xử lý các điều kiện cảnh báo và kèo bóng đá pháp bằng cách sử dụngBất cứ khi nàolệnh.

  • Thông tin chi tiết về kèo bóng đá pháp hoặc cảnh báo có thể được lấy từSQLCABiến.

34.8.1. Đặt cuộc gọi lại

Một phương pháp đơn giản để bắt kèo bóng đá pháp và cảnh báo là đặt một hành động cụ thể được thực thi bất cứ khi nào một điều kiện cụ thể xảy ra. Nói chung:

EXEC kèo bóng đá pháp bất cứ khi nàođiều kiện Hành động;

điều kiệncó thể là kèo bóng đá pháp trong những điều sau:

SQLERROR

Hành động được chỉ định được gọi bất cứ khi nào xảy ra kèo bóng đá pháp trong quá trình thực hiện câu lệnh SQL.

sqlwarning

Hành động được chỉ định được gọi bất cứ khi nào cảnh báo xảy ra trong quá trình thực hiện câu lệnh kèo bóng đá pháp.

Không tìm thấy

Hành động được chỉ định được gọi bất cứ khi nào một câu lệnh SQL truy xuất hoặc ảnh hưởng đến các hàng bằng không. (Điều kiện này không phải là kèo bóng đá pháp, nhưng bạn có thể quan tâm đến việc xử lý nó đặc biệt.)

Hành độngcó thể là kèo bóng đá pháp trong những điều sau:

Tiếp tục

Điều này có nghĩa là điều kiện bị bỏ qua. Đây là mặc định.

Gotonhãn
đi đếnnhãn

Nhảy vào nhãn được chỉ định (sử dụng CGotocâu lệnh).

SQLPrint

In một thông báo ra kèo bóng đá pháp tiêu chuẩn. Điều này rất hữu ích cho các chương trình đơn giản hoặc trong quá trình tạo mẫu.

Dừng

gọiThoát (1), sẽ chấm dứt chương trình.

do break

Thực hiện câu lệnh Cbreak. Điều này chỉ nên được sử dụng trong các vòng hoặcSwitchcâu lệnh.

gọitên(args)
dotên(args)

Gọi các hàm C được chỉ định với các đối số được chỉ định.

Tiêu chuẩn kèo bóng đá pháp chỉ cung cấp cho các hành độngTiếp tụcGoto(vàđi đến).

Đây là một ví dụ mà bạn có thể muốn sử dụng trong một chương trình đơn giản. Nó in một thông báo đơn giản khi cảnh báo xảy ra và hủy bỏ chương trình khi xảy ra kèo bóng đá pháp:

EXEC kèo bóng đá pháp Bất cứ khi nào sqlwarning sqlPrint;

câu lệnhEXEC kèo bóng đá pháp bất cứ khi nàolà một chỉ thị của bộ tiền xử lý SQL, không phải là một tuyên bố C. Các hành động kèo bóng đá pháp hoặc cảnh báo mà nó đặt ra áp dụng cho tất cả các câu lệnh SQL được nhúng xuất hiện bên dưới điểm đặt trình xử lý, trừ khi một hành động khác được đặt cho cùng một điều kiện giữa đầu tiênEXEC kèo bóng đá pháp bất cứ khi nàovà câu lệnh kèo bóng đá pháp gây ra điều kiện, bất kể dòng điều khiển trong chương trình C. Vì vậy, cả hai trong hai trích đoạn chương trình C sau đây sẽ có hiệu ứng mong muốn:

/*
/*

34.8.2. SQLCA

Để xử lý kèo bóng đá pháp mạnh hơn, giao diện SQL được nhúng cung cấp một biến toàn cầu với tênSQLCA(khu vực giao tiếp kèo bóng đá pháp) có cấu trúc sau:

Cấu trúc

(Trong kèo bóng đá pháp chương trình đa luồng, mỗi luồng tự động có được bản sao của riêng mìnhSQLCA. Điều này hoạt động tương tự như việc xử lý biến C toàn cầu C tiêu chuẩnerrno.)

SQLCABao gồm cả cảnh báo và kèo bóng đá pháp. Nếu nhiều cảnh báo hoặc kèo bóng đá pháp xảy ra trong quá trình thực hiện một câu lệnh, thìSQLCAsẽ chỉ chứa thông tin về thông tin cuối cùng.

Nếu không có kèo bóng đá pháp xảy ra trong lần cuốikèo bóng đá phápcâu lệnh,sqlca.sqlcodesẽ là 0 vàSQLCA.kèo bóng đá phápsẽ là"00000". Nếu cảnh báo hoặc kèo bóng đá pháp xảy ra, thìsqlca.sqlcodesẽ âm vàsqlca.kèo bóng đá phápsẽ khác với"00000". kèo bóng đá pháp tích cựcsqlca.sqlcodeCho biết kèo bóng đá pháp điều kiện vô hại, chẳng hạn như truy vấn cuối cùng được trả về hàng không.SQLCodekèo bóng đá pháplà hai sơ đồ mã kèo bóng đá pháp khác nhau; Chi tiết xuất hiện bên dưới.

Nếu câu lệnh kèo bóng đá pháp cuối cùng thành công, thìsqlca.sqlerrd [1]Chứa OID của hàng đã xử lý, nếu có vàsqlca.sqlerrd [2]Chứa số lượng hàng được xử lý hoặc trả lại, nếu có thể áp dụng cho lệnh.

Trong trường hợp có kèo bóng đá pháp hoặc cảnh báo,sqlca.sqlerrm.sqlerrmcsẽ chứa một chuỗi mô tả kèo bóng đá pháp. Trườngsqlca.sqlerrm.sqlerrmlchứa độ dài của thông báo kèo bóng đá pháp được lưu trữ trongsqlca.sqlerrm.sqlerrmc(kết quả củastrlen (), không thực sự thú vị cho kèo bóng đá pháp lập trình viên C). Lưu ý rằng kèo bóng đá pháp số tin nhắn quá dài để phù hợp với kích thước cố địnhSQLERRMCmảng; Họ sẽ bị cắt ngắn.

Trong trường hợp cảnh báo,sqlca.sqlwarn [2]được đặt thànhW. (Trong tất cả các trường hợp khác, nó được đặt thành kèo bóng đá pháp cái gì đó khác vớiW.) Nếusqlca.sqlwarn [1]được đặt thànhW, thì kèo bóng đá pháp giá trị đã bị cắt ngắn khi nó được lưu trữ trong kèo bóng đá pháp biến máy chủ.sqlca.sqlwarn [0]được đặt thànhWNếu bất kỳ phần tử nào khác được đặt để chỉ ra cảnh báo.

Các trườngSQLCAID, SQLABC, SQLERRPvà các yếu tố còn lại củaSQLERRDSQLWARNHiện không chứa thông tin hữu ích.

Cấu trúcSQLCAkhông được xác định trong tiêu chuẩn SQL, nhưng được triển khai trong kèo bóng đá pháp số hệ thống cơ sở dữ liệu SQL khác. Các định nghĩa tương tự như cốt lõi, nhưng nếu bạn muốn viết các ứng dụng di động, thì bạn nên điều tra các triển khai khác nhau kèo bóng đá pháp cách cẩn thận.

Đây là kèo bóng đá pháp ví dụ kết hợp việc sử dụngBất cứ khi nàoSQLCA, In nội dung củaSQLCAKhi xảy ra kèo bóng đá pháp. Điều này có lẽ hữu ích cho các ứng dụng gỡ kèo bóng đá pháp hoặc tạo mẫu, trước khi cài đặt thêm"thân thiện với người dùng"Trình xử lý kèo bóng đá pháp.

EXEC kèo bóng đá pháp bất cứ khi nào sqlerror gọi print_sqlca ();

Kết quả có thể trông như sau (ở đây là kèo bóng đá pháp do tên bảng sai):

==== SQLCA ====

34.8.3.kèo bóng đá phápVs.SQLCode

Các trườngsqlca.kèo bóng đá pháp20000_20007sqlca.sqlcodelà hai sơ đồ khác nhau cung cấp mã kèo bóng đá pháp. Cả hai đều có nguồn gốc từ tiêu chuẩn SQL, nhưngSQLCodeđã được đánh dấu không dùng nữa trong phiên bản kèo bóng đá pháp-92 của tiêu chuẩn và đã được bỏ trong các phiên bản sau. Do đó, các ứng dụng mới được khuyến khích sử dụngkèo bóng đá pháp.

kèo bóng đá pháplà một mảng năm ký tự. Năm ký tự chứa các chữ số hoặc các chữ cái trong trường hợp biểu diễn các mã của các điều kiện cảnh báo và kèo bóng đá pháp khác nhau.kèo bóng đá phápCó sơ đồ phân cấp: Hai ký tự đầu tiên chỉ ra lớp chung của điều kiện, ba ký tự cuối cùng cho thấy kèo bóng đá pháp lớp con của điều kiện chung. Trạng thái thành công được biểu thị bằng mã00000. Thekèo bóng đá phápMã dành cho hầu hết các phần được xác định trong tiêu chuẩn kèo bóng đá pháp. ThePostgreSQLMáy chủ tự nhiên hỗ trợkèo bóng đá phápMã kèo bóng đá pháp; Do đó, mức độ nhất quán cao có thể đạt được bằng cách sử dụng sơ đồ mã kèo bóng đá pháp này trong tất cả các ứng dụng.Phụ lục A.

SQLCode, Sơ đồ mã kèo bóng đá pháp không dùng nữa, là một số nguyên đơn giản. Giá trị 0 biểu thị thành công, giá trị dương cho thấy thành công với thông tin bổ sung, giá trị âm cho biết kèo bóng đá pháp.PostgreSQLđã gán kèo bóng đá pháp số cụ thểSQLCodeGiá trị cho việc sử dụng của nó, được liệt kê dưới đây với giá trị số và tên biểu tượng của chúng. Hãy nhớ rằng đây không phải là di động cho các triển khai kèo bóng đá pháp khác.kèo bóng đá phápSơ đồ, tương ứngkèo bóng đá phápcũng được liệt kê. Tuy nhiên, không có bản đồ kèo bóng đá pháp-kèo bóng đá pháp hoặc kèo bóng đá pháp-nhiều giữa hai sơ đồ (thực sự là nhiều-nhiều), vì vậy bạn nên tham khảo toàn cầukèo bóng đá phápLiệt kê trongPhụ lục ATrong mỗi trường hợp.

Đây là những người được chỉ địnhSQLCodeGiá trị:

0 (ECPG_NO_ERROR)

Cho biết không có kèo bóng đá pháp. (SQLSTATE 00000)

100 (ECPG_NOT_FOUND)

Đây là kèo bóng đá pháp điều kiện vô hại chỉ ra rằng lệnh cuối cùng được truy xuất hoặc xử lý các hàng bằng không hoặc bạn đang ở cuối con trỏ. (SQLSTATE 02000)

Khi xử lý con trỏ trong vòng lặp, bạn có thể sử dụng mã này như kèo bóng đá pháp cách để phát hiện khi nào để hủy bỏ vòng lặp, như thế này:

WHER (1)

23142_23148Bất cứ khi nào không tìm thấy, hãy phá vỡThực hiện hiệu quả điều này trong nội bộ, vì vậy thường không có lợi thế trong việc viết điều này kèo bóng đá pháp cách rõ ràng.

-12 (ECPG_OUT_OF_MEMORY)

cho biết bộ nhớ ảo của bạn đã cạn kiệt. Giá trị số được xác định là-enomem. (kèo bóng đá pháp ye001)

-200 (ECPG_UNSUPPORTED)

Cho biết bộ tiền xử lý đã tạo ra kèo bóng đá pháp cái gì đó mà thư viện không biết. Có lẽ bạn đang chạy các phiên bản không tương thích của bộ tiền xử lý và thư viện.

-201 (ECPG_TOO_MANY_ARGUMENT)

Điều này có nghĩa là lệnh chỉ định nhiều biến máy chủ hơn lệnh dự kiến. (kèo bóng đá pháp 07001 hoặc 07002)

-202 (ecpg_too_few_argument)

Điều này có nghĩa là lệnh chỉ định ít biến máy chủ hơn so với lệnh dự kiến. (kèo bóng đá pháp 07001 hoặc 07002)

-203 (ECPG_TOO_MANY_MATCHES)

Điều này có nghĩa là kèo bóng đá pháp truy vấn đã trả về nhiều hàng nhưng câu lệnh chỉ được chuẩn bị để lưu trữ kèo bóng đá pháp hàng kết quả (ví dụ: vì các biến được chỉ định không phải là mảng). (SQLSTATE 21000)

-204 (ECPG_INT_FORMAT)

Biến máy chủ thuộc loạiintvà mốc dữ liệu trong cơ sở dữ liệu thuộc loại khác và chứa kèo bóng đá pháp giá trị không thể được hiểu làint. Thư viện sử dụngstrtol ()Đối với chuyển đổi này. (kèo bóng đá pháp 42804)

-205 (ECPG_UINT_FORMAT)

Biến máy chủ thuộc loạiunsign intvà mốc dữ liệu trong cơ sở dữ liệu thuộc loại khác và chứa kèo bóng đá pháp giá trị không thể được hiểu làunsign int. Thư viện sử dụngstrtoul ()Đối với chuyển đổi này. (kèo bóng đá pháp 42804)

-206 (ECPG_FLOAT_FORMAT)

Biến máy chủ thuộc loạifloatvà mốc dữ liệu trong cơ sở dữ liệu thuộc loại khác và chứa kèo bóng đá pháp giá trị không thể được hiểu làfloat. Thư viện sử dụngstrtod ()Đối với chuyển đổi này. (kèo bóng đá pháp 42804)

-207 (ECPG_NUMERIC_FORMAT)

Biến máy chủ thuộc loạiSốvà mốc trong cơ sở dữ liệu thuộc loại khác và chứa kèo bóng đá pháp giá trị không thể được hiểu làSốGiá trị. (kèo bóng đá pháp 42804)

-208 (ECPG_interval_format)

Biến máy chủ thuộc loạiIntervalvà mốc dữ liệu trong cơ sở dữ liệu thuộc loại khác và chứa kèo bóng đá pháp giá trị không thể được hiểu làKhoảngGiá trị. (kèo bóng đá pháp 42804)

-209 (ECPG_DATE_FORMAT)

Biến máy chủ thuộc loạingàyvà mốc dữ liệu trong cơ sở dữ liệu thuộc loại khác và chứa kèo bóng đá pháp giá trị không thể được hiểu làngàyGiá trị. (kèo bóng đá pháp 42804)

-210 (ECPG_TIMESTAMP_FORMAT)

Biến máy chủ thuộc loạiDấu thời gianvà mốc thời gian trong cơ sở dữ liệu thuộc loại khác và chứa kèo bóng đá pháp giá trị không thể được hiểu làDấu thời gianGiá trị. (kèo bóng đá pháp 42804)

-211 (ECPG_CONVERT_BOOL)

Điều này có nghĩa là biến máy chủ thuộc loạiboolvà mốc dữ liệu trong cơ sở dữ liệu không phải là'T'Nor'F'. (kèo bóng đá pháp 42804)

-212 (ECPG_EMPTY)

Câu lệnh được gửi đếnPostgreSQLMáy chủ trống. (Điều này thường không thể xảy ra trong một chương trình SQL nhúng, vì vậy nó có thể chỉ ra một kèo bóng đá pháp nội bộ.)

-213 (ECPG_MISSING_INDICATOR)

Giá trị null đã được trả về và không có biến chỉ báo null nào được cung cấp. (kèo bóng đá pháp 22002)

-214 (ECPG_NO_ARRAY)

kèo bóng đá pháp biến thông thường đã được sử dụng ở kèo bóng đá pháp nơi yêu cầu kèo bóng đá pháp mảng. (SQLSTATE 42804)

-215 (ECPG_DATA_NOT_ARRAY)

Cơ sở dữ liệu đã trả về kèo bóng đá pháp biến thông thường ở kèo bóng đá pháp nơi yêu cầu giá trị mảng. (SQLSTATE 42804)

-220 (ECPG_NO_CONN)

Chương trình đã cố gắng truy cập kèo bóng đá pháp kết nối không tồn tại. (SQLSTATE 08003)

-221 (ECPG_NOT_CONN)

Chương trình đã cố gắng truy cập một kết nối tồn tại nhưng không mở. (Đây là một kèo bóng đá pháp nội bộ.) (SQLSTATE YE002)

-230 (ECPG_INVALID_STMT)

Câu lệnh bạn đang cố gắng sử dụng chưa được chuẩn bị. (kèo bóng đá pháp 26000)

-239 (ECPG_Informix_Duplicate_Key)

kèo bóng đá pháp chính trùng lặp, vi phạm các ràng buộc duy nhất (chế độ tương thích thông tin). (SQLSTATE 23505)

-240 (ecpg_unknown_descriptor)

Mô tả được chỉ định không được tìm thấy. Tuyên bố bạn đang cố gắng sử dụng chưa được chuẩn bị.

-241 (ECPG_INVALID_DESCRIPTOR_INDEX)

Chỉ số mô tả được chỉ định nằm ngoài phạm vi. (kèo bóng đá pháp 07009)

-242 (ECPG_UNKNOWN_DESCRIPTOR_ITEM)

Một mục mô tả không hợp lệ đã được yêu cầu. (Đây là một kèo bóng đá pháp nội bộ.) (SQLSTATE YE002)

-243 (ECPG_VAR_NOT_NUMERIC)

Trong quá trình thực hiện kèo bóng đá pháp câu lệnh động, cơ sở dữ liệu đã trả về kèo bóng đá pháp giá trị số và biến máy chủ không phải là số. (SQLSTATE 07006)

-244 (ECPG_VAR_NOT_CHAR)

Trong quá trình thực hiện kèo bóng đá pháp câu lệnh động, cơ sở dữ liệu đã trả về kèo bóng đá pháp giá trị không phải là số và biến máy chủ là số. (SQLSTATE 07006)

-284 (ECPG_INFORMIX_SUBSELECT_NOT_ONE)

Kết quả của trình điều khiển con không phải là kèo bóng đá pháp hàng duy nhất (chế độ tương thích thông tin). (SQLSTATE 21000)

-400 (ECPG_PGSQL)

Một số kèo bóng đá pháp gây ra bởiPOSTGRESQLMáy chủ. Thông báo chứa thông báo kèo bóng đá pháp từPostgreSQLMáy chủ.

-401 (ECPG_TRANS)

ThePostgreSQLMáy chủ báo hiệu rằng chúng tôi không thể bắt đầu, cam kết hoặc cuộn lại giao dịch. (kèo bóng đá pháp 08007)

-402 (ECPG_CONNECT)

Kết nối cố gắng đến cơ sở dữ liệu không thành công. (kèo bóng đá pháp 08001)

-403 (ECPG_Duplicate_Key)

kèo bóng đá pháp chính trùng lặp, vi phạm ràng buộc duy nhất. (SQLSTATE 23505)

-404 (ECPG_SUBSELECT_NOT_ONE)

Kết quả cho trình điều khiển con không phải là kèo bóng đá pháp hàng duy nhất. (SQLSTATE 21000)

-602 (ECPG_WARNING_UNKNOWN_PORTAL)

Tên con trỏ không hợp lệ đã được chỉ định. (kèo bóng đá pháp 34000)

-603 (ECPG_WARNING_IN_TRANSACTION)

Giao dịch đang được tiến hành. (kèo bóng đá pháp 25001)

-604 (ECPG_WARNING_NO_TRANSACTION)

Không có giao dịch hoạt động (đang tiến hành). (kèo bóng đá pháp 25P01)

-605 (ECPG_WARNING_PORTAL_EXISTS)

Tên con trỏ hiện có đã được chỉ định. (kèo bóng đá pháp 42P03)