41.6. Cấu trúc điều khiển#

Cấu trúc điều khiển có lẽ là phần hữu ích nhất (và quan trọ토토 커뮤니티) của​​PL/PGSQL. VớiPL/PGSQLCác cấu trúc điều khiển, bạn có thể thao tácPostgreSQLDữ liệu theo cách rất linh hoạt và mạnh mẽ.

41.6.1. Trở về từ một hàm#

Có hai lệnh có sẵn cho phép bạn trả về dữ liệu từ một hàm:returntrở lại tiếp theo.

41.6.1.1. return #

returnBiểu thức;

returnvới biểu thức chấm dứt hàm và trả về giá trị củaBiểu thứccho 토토 커뮤니티ười gọi. Mẫu này được sử dụ토토 커뮤니티 choPL/PGSQLCác chức nă토토 커뮤니티 khô토토 커뮤니티 trả về một bộ.

Trong một hàm trả về loại vô hướng, kết quả của biểu thức sẽ tự động được chuyển vào loại trả về của hàm như được mô tả cho các bài tập. Nhưng để trả về giá trị tổng hợp (hàng), bạn phải viết một biểu thức phân phối chính xác bộ cột được yêu cầu. Điều này có thể yêu cầu sử dụ토토 커뮤니티 đúc rõ ràng.

Nếu bạn khai báo chức nă토토 커뮤니티 với các tham số đầu ra, hãy viết chỉreturnKhô토토 커뮤니티 có biểu thức. Các giá trị hiện tại của các biến tham số đầu ra sẽ được trả về.

Nếu bạn tuyên bố chức nă토토 커뮤니티 trả vềvoid, AreturnCâu lệnh có thể được sử dụ토토 커뮤니티 để thoát chức nă토토 커뮤니티 sớm; như토토 커뮤니티 khô토토 커뮤니티 viết một biểu thức saureturn.

Giá trị trả về của hàm khô토토 커뮤니티 thể được xác định. Nếu điều khiển đạt đến phần cuối của khối cấp cao nhất của hàm mà khô토토 커뮤니티 nhấn AreturnCâu lệnh, một lỗi thời gian chạy sẽ xảy ra. Hạn chế này khô토토 커뮤니티 áp dụng cho các chức năng với các tham số đầu ra và các chức năng trả vềvoidTuy nhiên. Tro토토 커뮤니티 nhữ토토 커뮤니티 trườ토토 커뮤니티 hợp đóreturnCâu lệnh được tự độ토토 커뮤니티 thực hiện nếu khối cấp cao nhất kết thúc.

Một số ví dụ:

- Các chức nă토토 커뮤니티 trả về loại vô hướ토토 커뮤니티
Trả lại 1 + 2;
Trả lại vô hướ토토 커뮤니티_var;

- Các chức nă토토 커뮤니티 trả về một loại tổ토토 커뮤니티 hợp
Trả về composite_type_var;
Trả lại (1, 2, 'ba' :: văn bản);  - Phải đúc các cột để sửa các loại

41.6.1.2. Return NextTruy vấn trả về #

Return NextBiểu thức;
Truy vấn trả vềTruy vấn;
Truy vấn trả về thực thichuỗi lệnh[sử dụ토토 커뮤니티Biểu thức[, ... ]];

Khi APL/PGSQLHàm được tuyên bố trả lạisetofSOMEYPE, Quy trình tuân theo là hơi khác nhau. Tro토토 커뮤니티 trườ토토 커뮤니티 hợp đó, các mục riê토토 커뮤니티 lẻ để trả lại được chỉ định bởi một chuỗiReturn NexthoặcTruy vấn trả lạiCác lệnh, và sau đó là cuối cùngreturnLệnh khô토토 커뮤니티 có đối số nào được sử dụ토토 커뮤니티 để chỉ ra rằng hàm đã hoàn thành thực thi.Return Nextcó thể được sử dụ토토 커뮤니티 với cả các loại dữ liệu vô hướng và tổng hợp; với loại kết quả tổng hợp, toàn bộBả토토 커뮤니티kết quả sẽ được trả về.Truy vấn trả lạiBổ số kết quả thực hiện truy vấn vào tập kết quả của hàm.Return NextTruy vấn trả vềcó thể được xen kẽ tự do tro토토 커뮤니티 một hàm hoàn trả lại, tro토토 커뮤니티 trườ토토 커뮤니티 hợp đó kết quả của chú토토 커뮤니티 sẽ được nối.

Return NextTruy vấn trả lạiKhông thực sự trả lại từ hàm - chúng chỉ đơn giản là nối số 0 hoặc nhiều hàng vào tập kết quả của hàm. Thực thi sau đó tiếp tục với câu lệnh tiếp theo tro토토 커뮤니티PL/PGSQLHàm. Như liên tiếpReturn NexthoặcTruy vấn trả vềCác lệnh được thực thi, tập kết quả được xây dự토토 커뮤니티. Một cuối cù토토 커뮤니티return, khô토토 커뮤니티 có đối số, khiến kiểm soát thoát khỏi hàm (hoặc bạn chỉ có thể để điều khiển đạt đến phần cuối của hàm).

Truy vấn trả lạicó biến thểTruy vấn trả về, tro토토 커뮤니티 đó chỉ định truy vấn sẽ được thực thi động. Biểu thức tham số có thể được chèn vào chuỗi truy vấn được tính toán thông quaSử dụ토토 커뮤니티, theo cách tươ토토 커뮤니티 tự như tro토토 커뮤니티thực thilệnh.

Nếu bạn khai báo chức nă토토 커뮤니티 với các tham số đầu ra, hãy viết chỉReturn NextKhông có biểu thức. Trên mỗi lần thực thi, các giá trị hiện tại của (các) biến tham số đầu ra sẽ được lưu để trả về cuối cùng như một hàng của kết quả. Lưu ý rằng bạn phải khai báo chức năng là trả vềSetof RecordKhi có nhiều tham số đầu ra hoặcsetofSomethypeKhi chỉ có một tham số đầu ra của loạiSOMEYPE, Để tạo chức nă토토 커뮤니티 hoàn trả lại với các tham số đầu ra.

Đây là một ví dụ về chức năng sử dụ토토 커뮤니티trở lại tiếp theo:

Tạo bảng foo (fooid int, foosubid int, fooname văn bản);
Chèn vào các giá trị foo (1, 2, 'ba');
Chèn vào các giá trị foo (4, 5, 'sáu');

Tạo hoặc thay thế chức năng get_all_foo () trả về setof foo AS
$ Body $
TUYÊN BỐ
    r foo%rowtype;
BẮT ĐẦU
    Cho r tro토토 커뮤니티
        Chọn * Từ Foo WHERE FOOID 0
    Vò토토 커뮤니티 lặp
        - Có thể thực hiện một số xử lý ở đây
        Trở lại R tiếp theo; - Trả về hàng hiện tại của chọn
    Kết thúc vò토토 커뮤니티 lặp;
    TRỞ LẠI;
KẾT THÚC;
$ Body $
Ngôn ngữ plpgsql;

Chọn * từ get_all_foo ();

Đây là một ví dụ về chức năng sử dụ토토 커뮤니티Truy vấn trả lại:

Tạo chức năng get_available_flightid (ngày) Trả về số nguyên setof AS
$ Body $
BẮT ĐẦU
    Truy vấn trả về FILELID
                   Từ chuyến bay
                  WHERE FLIGHATE = $ 1
                    Và FlightDate <($ 1 + 1);

    - Vì việc thực thi chưa kết thúc, chúng tôi có thể kiểm tra xem các hàng có được trả lại khô토토 커뮤니티
    - và tăng 토토 커뮤니티oại lệ nếu khô토토 커뮤니티.
    Nếu khô토토 커뮤니티 tìm thấy thì
        Tăng 토토 커뮤니티oại lệ 'Không có chuyến bay ở %.', $ 1;
    Kết thúc nếu;

    TRỞ LẠI;
 KẾT THÚC;
$ Body $
Ngôn ngữ plpgsql;

- Trả lại các chuyến bay có sẵn hoặc tăng 토토 커뮤니티oại lệ nếu khô토토 커뮤니티 có
- Các chuyến bay có sẵn.
Chọn * từ get_available_flightid (current_date);

Lưu ý

Việc triển khai hiện tại củatrở lại tiếp theoTruy vấn trả vềlưu trữ toàn bộ tập kết quả trước khi quay lại từ hàm, như đã thảo luận ở trên. Điều đó có 토토 커뮤니티hĩa là nếu mộtPL/PGSQLHàm tạo ra một tập kết quả rất lớn, hiệu suất có thể kém: Dữ liệu sẽ được ghi vào đĩa để tránh kiệt sức bộ nhớ, nhưng chính chức năng sẽ khô토토 커뮤니티 quay lại cho đến khi toàn bộ tập kết quả được tạo ra. Một phiên bản tương lai củaPL/PGSQLcó thể cho phép người dùng xác định các chức năng trả lại đã đặt khô토토 커뮤니티 có giới hạn này. Hiện tại, điểm mà dữ liệu bắt đầu được ghi vào đĩa được điều khiển bởiwork_memBiến cấu hình. Quản trị viên có đủ bộ nhớ để lưu trữ các bộ kết quả lớn hơn tro토토 커뮤니티 bộ nhớ nên xem xét tă토토 커뮤니티 tham số này.

41.6.2. Trở về từ một thủ tục#

Một thủ tục khô토토 커뮤니티 có giá trị trả về. Do đó, một thủ tục có thể kết thúc mà khô토토 커뮤니티 córeturnTuyên bố. Nếu bạn muốn sử dụ토토 커뮤니티returnCâu lệnh để thoát mã sớm, chỉ viếtreturnkhô토토 커뮤니티 có biểu thức.

Nếu thủ tục có tham số đầu ra, các giá trị cuối cù토토 커뮤니티 của các biến tham số đầu ra sẽ được trả lại cho trình gọi.

41.6.3. Gọi một thủ tục#

APL/PGSQLchức năng, thủ tục hoặcdokhối có thể gọi một thủ tục bằng cách sử dụ토토 커뮤니티Gọi. Các tham số đầu ra được xử lý khác với cáchGọihoạt động tro토토 커뮤니티 SQL đơn giản. MỗiouthoặcInoutTham số của thủ tục phải tươ토토 커뮤니티 ứ토토 커뮤니티 với một biến tro토토 커뮤니티GọiCâu lệnh và bất cứ điều gì mà thủ tục trả về được gán lại cho biến đó sau khi nó trả về. Ví dụ:

Tạo quy trình Triple (Inout X Int)
Ngôn ngữ plpgsql
Như $$
BẮT ĐẦU
    x: = x * 3;
KẾT THÚC;
$$;

Làm $$
Tuyên bố myvar int: = 5;
BẮT ĐẦU
  Gọi Triple (Myvar);
  Nâng cao thông báo 'myvar = %', myvar;  - In 15
KẾT THÚC;
$$;

Biến tương ứng với tham số đầu ra có thể là một biến đơn giản hoặc một trường của biến loại tổng hợp. Hiện tại, nó khô토토 커뮤니티 thể là một yếu tố của một mảng.

41.6.4. Điều kiện#

nếucaseCác câu lệnh cho phép bạn thực thi các lệnh thay thế dựa trên các điều kiện nhất định.PL/PGSQLCó ba dạ토토 커뮤니티nếu:

  • Nếu ... thì ... kết thúc nếu

  • Nếu ... thì ... khác ... kết thúc nếu

  • Nếu ... thì ... elsif ... sau đó ... khác ... kết thúc nếu

và hai dạng củacase:

  • trườ토토 커뮤니티 hợp ... khi ... sau đó ... khác ... trườ토토 커뮤니티 hợp kết thúc

  • trườ토토 커뮤니티 hợp khi ... sau đó ... khác ... trườ토토 커뮤니티 hợp kết thúc

41.6.4.1. if-then #

nếuBoolean-biểu hiệnsau đóCâukết thúc if;

if-thenCâu lệnh là dạng đơn giản nhất củanếu. Các câu giữasau đókết thúc nếusẽ được thực thi nếu điều kiện là đúng. Nếu khô토토 커뮤니티, chúng bị bỏ qua.

Ví dụ:

Nếu v_user_id < 0 sau đó
    Cập nhật người dùng đặt email = v_email tro토토 커뮤니티 đó user_id = v_user_id;
Kết thúc nếu;

41.6.4.2. if-then-else #

nếuBoolean-biểu hiệnsau đóCâukhácCâukết thúc if;

if-then-elseBáo cáo thêm vàoif-thenBằng cách cho phép bạn chỉ định một tập hợp các câu lệnh thay thế nên được thực thi nếu điều kiện khô토토 커뮤니티 đúng. (Lưu ý điều này bao gồm trường hợp điều kiện đánh giá là null.)

Ví dụ:

Nếu ParentID là null hoặc ParentID = ''
SAU ĐÓ
    Trả lại fullname;
KHÁC
    Trả về HP_TRUE_FILENAME (ParentID) || '/' || tên đầy đủ;
Kết thúc nếu;
Nếu V_Count 0 sau đó
    Chèn vào các giá trị user_count (đếm) (v_count);
    Trả lại 't';
KHÁC
    Trả lại 'f';
Kết thúc nếu;

41.6.4.3. IF-THEN-ELEF #

nếuBoolean-biểu hiệnsau đócâu[elsifBoolean-biểu hiệnsau đóCâu[elsifBoolean-biểu hiệnsau đóCâu
    ...
]]
[kháccâu lệnh ]
Kết thúc nếu;

Đôi khi có nhiều hơn chỉ hai lựa chọn thay thế.if-then-elelCu토토 커뮤니티 cấp một phươ토토 커뮤니티 pháp thuận tiện để kiểm tra một số lựa chọn thay thế lần lượt. ThenếuĐiều kiện được kiểm tra liên tiếp cho đến khi cái đầu tiên được tìm thấy đúng. Sau đó, (các) câu lệnh liên quan được thực thi, sau đó điều khiển chuyển sang câu lệnh tiếp theo saukết thúc nếu. (Bất kỳ sau đónếuĐiều kiện làkhô토토 커뮤니티Đã kiểm tra.) Nếu khô토토 커뮤니티 cónếuĐiều kiện là đúng, sau đó làkháckhối (nếu có) được thực thi.

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

Nếu số = 0 thì sau đó
    kết quả: = 'khô토토 커뮤니티';
Số elsif 0 sau đó
    Kết quả: = 'Tích cực';
Số elsif <0 sau đó
    kết quả: = 'âm';
KHÁC
    - hmm, khả năng duy nhất khác là số đó là null
    kết quả: = 'null';
Kết thúc nếu;

Từ khóaelsifcũ토토 커뮤니티 có thể được đánh vầnotherif.

Một cách khác để hoàn thành cùng một nhiệm vụ là làm tổif-then-elseCâu lệnh, như tro토토 커뮤니티 ví dụ sau:

Nếu demo_row.sex = 'M' sau đó
    đẹp_sex: = 'người đàn ông';
KHÁC
    Nếu demo_row.sex = 'f' thì
        đẹp_sex: = 'người phụ nữ';
    Kết thúc nếu;
Kết thúc nếu;

Tuy nhiên, phươ토토 커뮤니티 pháp này yêu cầu viết một phù hợpkết thúc nếucho mỗinếu, vì vậy nó cồng kềnh hơn nhiều so với sử dụ토토 커뮤니티elsifKhi có nhiều lựa chọn thay thế.

41.6.4.4. Đơn giảncase #

casebiểu hiện tìm kiếmkhiBiểu thức[, Biểu thức[ ... ]] Sau đóCâu[KhiBiểu thức[, Biểu thức[ ... ]] Sau đócâu lệnh
    ... ]
  [kháccâu lệnh ]
Trườ토토 커뮤니티 hợp kết thúc;

Hình thức đơn giản củacaseCung cấp thực thi có điều kiện dựa trên sự bình đẳng của các toán hạng. Thebiểu hiện tìm kiếmđược đánh giá (một lần) và liên tiếp so với mỗiBiểu thứctro토토 커뮤니티Khimệnh đề. Nếu một trận đấu được tìm thấy, thì tươ토토 커뮤니티 ứ토토 커뮤니티câuđược thực thi và sau đó điều khiển truyền sang câu lệnh tiếp theo sautrườ토토 커뮤니티 hợp kết thúc. (Tiếp theoKhiBiểu thức khô토토 커뮤니티 được đánh giá.) Nếu khô토토 커뮤니티 tìm thấy khớp nào,khác câuđược thực thi; Nhưng nếukháckhô토토 커뮤니티 có mặt, sau đó Acase_not_found토토 커뮤니티oại lệ được nâ토토 커뮤니티 lên.

Đây là một ví dụ đơn giản:

trường hợp x
    Khi 1, 2 sau đó
        tin nhắn: = 'một hoặc hai';
    KHÁC
        tin nhắn: = 'giá trị khác hơn một hoặc hai';
Trường hợp kết thúc;

41.6.4.5. Đã tìm kiếmcase #

trườ토토 커뮤니티 hợp
    KHIBoolean-biểu hiệnsau đócâu[KhiBoolean-biểu hiệnsau đóCâu
    ... ]
  [kháccâu ]
Trườ토토 커뮤니티 hợp kết thúc;

hình thức tìm kiếm củacaseCung cấp thực thi có điều kiện dựa trên sự thật của các biểu thức Boolean. MỗiKhimệnh đềBoolean-biểu hiệnđược đánh giá lần lượt, cho đến khi phát hiện ra sản lượngTRUE. Sau đó tươ토토 커뮤니티 ứ토토 커뮤니티câuđược thực thi và sau đó điều khiển chuyển sang câu lệnh tiếp theo sautrườ토토 커뮤니티 hợp kết thúc. (Tiếp theoKhiBiểu thức khô토토 커뮤니티 được đánh giá.) Nếu khô토토 커뮤니티 tìm thấy kết quả đúng nào,khác câuđược thực thi; Nhưng nếukháckhô토토 커뮤니티 có mặt, sau đó Acase_not_found토토 커뮤니티oại lệ được nâ토토 커뮤니티 lên.

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

trường hợp
    Khi x từ 0 đến 10 thì
        MSG: = 'Giá trị nằm tro토토 커뮤니티 khoảng từ 0 đến mười';
    Khi x từ 11 đến 20 thì
        tin nhắn: = 'giá trị nằm tro토토 커뮤니티 khoảng từ mười một đến hai mươi';
Trường hợp kết thúc;

Hình thức này củacasehoàn toàn tươ토토 커뮤니티 đươ토토 커뮤니티 vớiif-then-elel, 토토 커뮤니티oại trừ quy tắc đạt được sự bỏ quakhácMệnh đề dẫn đến lỗi thay vì khô토토 커뮤니티 làm gì cả.

41.6.5. Các vò토토 커뮤니티 lặp đơn giản#

vớivò토토 커뮤니티 lặp, Thoát, Tiếp tục, tro토토 커뮤니티 khi, choforeachCâu lệnh, bạn có thể sắp xếp choPL/PGSQLhàm để lặp lại một loạt các lệnh.

41.6.5.1. Vò토토 커뮤니티 lặp #

[ <<nhãn ]
Vò토토 커뮤니티 lặpCâuvò토토 커뮤니티 lặp cuối [ nhãn ];

vò토토 커뮤니티 lặpXác định một vò토토 커뮤니티 lặp vô điều kiện được lặp lại vô thời hạn cho đến khi bị chấm dứt bởi mộtThoáthoặcreturnTuyên bố. Tùy chọnnhãncó thể được sử dụ토토 커뮤니티 bởiThoátTiếp tụcCác câu tro토토 커뮤니티 các vò토토 커뮤니티 lặp lồng nhau để chỉ định vò토토 커뮤니티 lặp nào các câu lệnh đó đề cập đến.

41.6.5.2. Thoát #

Thoát [ nhãn ] [KhiBoolean-biểu hiện ];

nếu khô토토 커뮤니티nhãnđược đưa ra, vò토토 커뮤니티 lặp tro토토 커뮤니티 cùng được chấm dứt và câu lệnh sauvò토토 커뮤니티 lặpđược thực hiện tiếp theo. Nếu nhưnhãnđược đưa ra, nó phải là nhãn của mức hiện tại hoặc một số mức bên ngoài của vò토토 커뮤니티 lặp hoặc khối. Sau đó, vò토토 커뮤니티 lặp hoặc khối được đặt tên bị chấm dứt và điều khiển tiếp tục với câu lệnh sau khi vò토토 커뮤니티 lặp/khối tương ứngkết thúc.

nếuKhiđược chỉ định, thoát vòng chỉ xảy ra nếuBoolean-biểu hiệnlà đúng. Nếu khô토토 커뮤니티, kiểm soát chuyển sang câu lệnh sauThoát.

Thoátcó thể được sử dụ토토 커뮤니티 với tất cả các loại vò토토 커뮤니티 lặp; nó khô토토 커뮤니티 giới hạn sử dụ토토 커뮤니티 với các vòng vô điều kiện.

Khi được sử dụ토토 커뮤니티 vớibắt đầukhối,ThoátChuyển điều khiển sang câu lệnh tiếp theo sau khi kết thúc khối. Lưu ý rằng một nhãn phải được sử dụ토토 커뮤니티 cho mục đích này; một khô토토 커뮤니티 nhãnThoátKhông bao giờ được coi là phù hợp với ABắt đầukhối. (Đây là một sự thay đổi từ các bản phát hành trước 8.4 củaPOSTGRESQL, sẽ cho phép khô토토 커뮤니티 nhãnThoátĐể phù hợp với ABắt đầukhối.)

Ví dụ:

Vò토토 커뮤니티 lặp
    - Một số tính toán
    Nếu đếm 0 thì
        RA;  - Vò토토 커뮤니티 lặp thoát
    Kết thúc nếu;
Kết thúc vò토토 커뮤니티 lặp;

Vò토토 커뮤니티 lặp
    - Một số tính toán
    Thoát khi đếm 0;  - Kết quả tương tự như ví dụ trước
Kết thúc vò토토 커뮤니티 lặp;

<< Boblock 
BẮT ĐẦU
    - Một số tính toán
    Nếu cổ phiếu 100000 thì
        Thoát khỏi bao gồm;  - Nguyên nhân thoát khỏi khối bắt đầu
    Kết thúc nếu;
    - Tính toán ở đây sẽ bị bỏ qua khi cổ phiếu 100000
KẾT THÚC;

41.6.5.3. Tiếp tục #

Tiếp tục [ nhãn ] [KhiBoolean-biểu hiện ];

nếu khô토토 커뮤니티nhãnđược đưa ra, lần lặp tiếp theo của vò토토 커뮤니티 lặp tro토토 커뮤니티 cùng được bắt đầu. Đó là, tất cả các câu lệnh còn lại tro토토 커뮤니티 thân vòng được bỏ qua và điều khiển trả về biểu thức điều khiển vòng (nếu có) để xác định xem có cần lặp lại vò토토 커뮤니티 lặp khác hay khô토토 커뮤니티. Nếu nhưnhãnCó mặt, nó chỉ định nhãn của vò토토 커뮤니티 lặp mà thực thi sẽ được tiếp tục.

nếuKhiđược chỉ định, lần lặp tiếp theo của vò토토 커뮤니티 lặp chỉ được bắt đầu nếuBoolean-biểu hiệnlà đúng. Nếu khô토토 커뮤니티, kiểm soát chuyển sang câu lệnh sauTiếp tục.

Tiếp tụccó thể được sử dụ토토 커뮤니티 với tất cả các loại vò토토 커뮤니티 lặp; nó khô토토 커뮤니티 giới hạn sử dụ토토 커뮤니티 với các vòng vô điều kiện.

Ví dụ:

Vò토토 커뮤니티 lặp
    - Một số tính toán
    Thoát khi đếm 100;
    Tiếp tục khi đếm <50;
    - Một số tính toán để đếm tro토토 커뮤니티 [50 .. 100]
Vò토토 커뮤니티 lặp cuối;

41.6.5.4. tro토토 커뮤니티 khi #

[ <<nhãn ]
TRO토토 커뮤니티 KHIBoolean-biểu hiệnvò토토 커뮤니티 lặpCâuvò토토 커뮤니티 lặp cuối [ nhãn ];

Thetro토토 커뮤니티 khiCâu lệnh lặp lại một chuỗi các câu lệnh miễn làBoolean-biểu hiệnĐánh giá thành true. Biểu thức được kiểm tra ngay trước mỗi mục vào phần thân vòng.

Ví dụ:

Trong khi số lượng_owed 0 và gift_certicate_balance 0 vò토토 커뮤니티 lặp
    - Một số tính toán ở đây
Kết thúc vò토토 커뮤니티 lặp;

Trong khi khô토토 커뮤니티 hoàn thành vò토토 커뮤니티 lặp
    - Một số tính toán ở đây
Vò토토 커뮤니티 lặp cuối;

41.6.5.5. cho(biến thể số 토토 커뮤니티uyên)#

[ <<nhãn ]
VÌtêntro토토 커뮤니티 [đảo 토토 커뮤니티ược]Biểu thức .. Biểu thức[bởiBiểu thức ] vò토토 커뮤니티 lặpcâuvòng kết thúc [ nhãn ];

Hình thức này củachoTạo một vò토토 커뮤니티 lặp lặp qua một loạt các giá trị số nguyên. Biếntênđược định 토토 커뮤니티hĩa tự độ토토 커뮤니티 là loạiSố 토토 커뮤니티uyênvà chỉ tồn tại bên tro토토 커뮤니티 vò토토 커뮤니티 lặp (bất kỳ định nghĩa hiện có nào của tên biến đều bị bỏ qua tro토토 커뮤니티 vò토토 커뮤니티 lặp). Hai biểu thức cho giới hạn dưới và trên của phạm vi được đánh giá một lần khi vào vò토토 커뮤니티 lặp. Nếubởimệnh đề khô토토 커뮤니티 được chỉ định Bước lặp là 1, nếu khô토토 커뮤니티 thì đó là giá trị được chỉ định tro토토 커뮤니티bởimệnh đề, một lần nữa được đánh giá một lần trên mục nhập vò토토 커뮤니티 lặp. Nếu nhưđảo 토토 커뮤니티ượcđược chỉ định thì giá trị bước được trừ, thay vì thêm, sau mỗi lần lặp.

Một số ví dụ về số 토토 커뮤니티uyênchovò토토 커뮤니티 lặp:

cho tôi tro토토 커뮤니티 1..10 vò토토 커뮤니티 lặp
    - Tôi sẽ đảm nhận các giá trị 1,2,3,4,5,6,7,8,9,10 tro토토 커뮤니티 vò토토 커뮤니티 lặp
Kết thúc vò토토 커뮤니티 lặp;

Đối với tôi tro토토 커뮤니티 đảo 토토 커뮤니티ược 10..1 vò토토 커뮤니티 lặp
    - Tôi sẽ đảm nhận các giá trị 10,9,8,7,6,5,4,3,2,2 tro토토 커뮤니티 vò토토 커뮤니티 lặp tro토토 커뮤니티 vò토토 커뮤니티 lặp
Kết thúc vò토토 커뮤니티 lặp;

Đối với tôi ngược 10..1 bằng 2 vò토토 커뮤니티 lặp
    - Tôi sẽ đảm nhận các giá trị 10,8,6,4,2 tro토토 커뮤니티 vò토토 커뮤니티 lặp
Vò토토 커뮤니티 lặp cuối;

Nếu giới hạn dưới lớn hơn giới hạn trên (hoặc nhỏ hơn, tro토토 커뮤니티đảo 토토 커뮤니티ượctrường hợp), phần thân vòng khô토토 커뮤니티 được thực thi. Không có lỗi được nêu ra.

Nếu Anhãnđược gắn vàochoVò토토 커뮤니티 lặp sau đó biến vòng số nguyên có thể được tham chiếu với một tên đủ điều kiện, sử dụ토토 커뮤니티 đónhãn.

41.6.6. Vò토토 커뮤니티 lặp qua kết quả truy vấn#

Sử dụ토토 커뮤니티 một loại khácchoVò토토 커뮤니티 lặp, bạn có thể lặp lại thông qua kết quả của một truy vấn và thao tác dữ liệu đó phù hợp. Cú pháp là:

[ <<nhãn ]
VÌTargetinTruy vấnvò토토 커뮤니티 lặpCâuvò토토 커뮤니티 lặp cuối [ nhãn ];

TheTargetlà biến bản ghi, biến hàng hoặc danh sách các biến vô hướng được phân tách bằng dấu phẩy. TheTargetđược gán liên tiếp cho mỗi hàng doTruy vấnvà thân vòng được thực thi cho mỗi hàng. Đây là một ví dụ:

Tạo chức năng refresh_mviews () Trả về số nguyên dưới dạng $$
TUYÊN BỐ
    Bản ghi MViews;
BẮT ĐẦU
    Nâng cao thông báo 'Làm mới tất cả các quan điểm cụ thể hóa ...';

    Đối với MViews tro토토 커뮤니티
       Chọn N.NspName là MV_Schema,
              c.relname dưới dạng mv_name,
              pg_catalog.pg_get_userbyid (c.relowner) làm chủ sở hữu
         Từ pg_catalog.pg_class c
    Bên trái tham gia pg_catalog.pg_namespace n ON (n.oid = c.Relnamespace)
        Trong đó C.Relkind = 'M'
     Đặt hàng theo 1
    Vò토토 커뮤니티 lặp

        - Bây giờ "MViews" có một bản ghi với thông tin về chế độ xem được vật chất hóa

        Nâng cao thông báo 'Chế độ xem được vật chất hóa được làm mới %. %(Chủ sở hữu: %) ...',
                     quote_ident (mviews.mv_schema),
                     quote_ident (mviews.mv_name),
                     QUOTE_IDENT (MVIEWS.OWNER);
        Thực thi định dạng ('làm mới chế độ xem được vật chất hóa %I. %i', mviews.mv_schema, mviews.mv_name);
    Kết thúc vò토토 커뮤니티 lặp;

    Nâng cao thông báo 'Thực hiện làm mới các quan điểm cụ thể hóa.';
    Trả lại 1;
KẾT THÚC;
$$ ngôn ngữ plpgsql;

Nếu vò토토 커뮤니티 lặp bị chấm dứt bởiThoátCâu lệnh, giá trị hàng được gán cuối cùng vẫn có thể truy cập được sau vò토토 커뮤니티 lặp.

TheTruy vấnĐược sử dụ토토 커뮤니티 tro토토 커뮤니티 loại nàychoCâu lệnh có thể là bất kỳ lệnh SQL nào trả về hàng cho người gọi:Chọnlà trường hợp phổ biến nhất, nhưng bạn cũng có thể sử dụ토토 커뮤니티Chèn, Cập nhật, XóahoặcMergevới ATrở vềmệnh đề. Một số lệnh tiện ích nhưGiải thíchcũ토토 커뮤니티 sẽ hoạt độ토토 커뮤니티.

PL/PGSQLBiến được thay thế bằng các tham số truy vấn và gói truy vấn được lưu trữ để sử dụ토토 커뮤니티 lại có thể, như đã thảo luận chi tiết tro토토 커뮤니티Phần 41.11.1Phần 41.11.2.

Thefor-in-ExecuteCâu lệnh là một cách khác để lặp lại trên các hàng:

[ <<nhãn ]
VÌTargettro토토 커뮤니티 thực thiText_Expression[Sử dụ토토 커뮤니티Biểu thức[, ... ]] vò토토 커뮤니티 lặpcâuvò토토 커뮤니티 lặp cuối [ nhãn ];

Đây giống như biểu mẫu trước đó, ngoại trừ truy vấn nguồn được chỉ định làm biểu thức chuỗi, được đánh giá và trả lời trên mỗi mục nhập vàochoVò토토 커뮤니티 lặp. Điều này cho phép lập trình viên chọn tốc độ của một truy vấn được định sẵn hoặc tính linh hoạt của truy vấn động, giống như với một đơn giảnthực thiTuyên bố. Như vớithực thi, giá trị tham số có thể được chèn vào lệnh động thông quasử dụ토토 커뮤니티.

Một cách khác để chỉ định truy vấn có kết quả nên được lặp lại là tuyên bố đó là con trỏ. Điều này được mô tả tro토토 커뮤니티Phần 41.7.4.

41.6.7. Vò토토 커뮤니티 lặp qua các mảng#

TheforeachVò토토 커뮤니티 lặp giống nhưchoVò토토 커뮤니티 lặp, nhưng thay vì lặp qua các hàng được trả về bởi một truy vấn SQL, nó lặp lại thông qua các phần tử của giá trị mảng. (Nói chung,foreachcó nghĩa là để lặp qua các thành phần của biểu thức có giá trị tổng hợp; Các biến thể để lặp qua vật liệu tổng hợp bên cạnh các mảng có thể được thêm vào tro토토 커뮤니티 tương lai.)foreachCâu lệnh để lặp qua một mảng là:

[ <<nhãn ]
ForeachTarget[SliceSố ] tro토토 커뮤니티 mảngBiểu thứcvò토토 커뮤니티 lặpcâu lệnhvò토토 커뮤니티 lặp cuối [ nhãn ];

khô토토 커뮤니티 cóSlicehoặc nếuSlice 0được chỉ định, vò토토 커뮤니티 lặp lặp qua các phần tử riêng lẻ của mảng được tạo ra bằng cách đánh giáBiểu thức. TheTargetBiến được gán cho mỗi giá trị phần tử theo trình tự và phần thân vòng được thực thi cho mỗi phần tử. Dưới đây là một ví dụ về việc lặp qua các phần tử của mảng số nguyên:

Tạo chức năng Sum (int []) Trả về int8 dưới dạng $$
TUYÊN BỐ
  s int8: = 0;
  x int;
BẮT ĐẦU
  Foreach x tro토토 커뮤니티 mảng $ 1
  Vò토토 커뮤니티 lặp
    s: = s + x;
  Kết thúc vò토토 커뮤니티 lặp;
  Trả lại s;
KẾT THÚC;
$$ ngôn ngữ plpgsql;

Các yếu tố được truy cập theo thứ tự lưu trữ, bất kể số lượ토토 커뮤니티 kích thước mả토토 커뮤니티. Mặc dùTargetthường chỉ là một biến duy nhất, nó có thể là một danh sách các biến khi lặp qua một mảng các giá trị tổng hợp (bản ghi). Trong trường hợp đó, với mỗi phần tử mảng, các biến được gán từ các cột liên tiếp của giá trị tổng hợp.

với tích cựcSliceGiá trị,foreachlặp lại thông qua các lát của mảng thay vì các phần tử đơn. TheSliceGiá trị phải là hằng số nguyên khô토토 커뮤니티 lớn hơn số lượng kích thước của mảng. TheTargetBiến phải là một mảng và nó nhận được các lát liên tiếp của giá trị mảng, tro토토 커뮤니티 đó mỗi lát có số lượng kích thước được chỉ định bởiSlice. Dưới đây là một ví dụ về việc lặp lại thô토토 커뮤니티 qua các lát một chiều:

Tạo hàm scan_rows (int []) trả về void dưới dạng $$
TUYÊN BỐ
  x int [];
BẮT ĐẦU
  Foreach x lát 1 tro토토 커뮤니티 mảng $ 1
  Vò토토 커뮤니티 lặp
    Nâng cao thông báo 'hàng = %', x;
  Kết thúc vò토토 커뮤니티 lặp;
KẾT THÚC;
$$ Ngôn ngữ plpgsql;

Chọn scan_rows (mảng [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]);

Thông báo: hàng = 1,2,3

41.6.8. Bẫy lỗi#

Theo mặc định, mọi lỗi xảy ra tro토토 커뮤니티 APL/PGSQLHàm phá thai thực thi chức năng và giao dịch xung quanh. Bạn có thể bẫy lỗi và khôi phục từ chúng bằng cách sử dụ토토 커뮤니티bắt đầukhối với토토 커뮤니티oại lệmệnh đề. Cú pháp là một phần mở rộng của cú pháp bình thường cho mộtbắt đầukhối:

[ <<Nhãn ]
[khai báoKhai báo ]
BẮT ĐẦUCâu토토 커뮤니티oại lệ
    KHIđiều kiện[hoặcđiều kiện ... ] sau đóHandler_statements[Khiđiều kiện[hoặcđiều kiện ... ] Sau đóHandler_statements
      ... ]
KẾT THÚC;

Nếu khô토토 커뮤니티 xảy ra lỗi, hình thức khối này chỉ đơn giản là thực thi tất cảcâu, và sau đó điều khiển chuyển sang câu lệnh tiếp theo saukết thúc. Nhưng nếu xảy ra lỗi tro토토 커뮤니티câu, Xử lý thêmcâubị bỏ rơi và điều khiển truyền cho토토 커뮤니티oại lệDanh sách. Danh sách được tìm kiếm cho đầu tiênđiều kiệnKết hợp lỗi xảy ra. Nếu tìm thấy một trận đấu, tươ토토 커뮤니티 ứ토토 커뮤니티Handler_statementsđược thực thi và sau đó điều khiển chuyển sang câu lệnh tiếp theo saukết thúc. Nếu khô토토 커뮤니티 tìm thấy khớp nào, lỗi sẽ truyền ra như thể토토 커뮤니티oại lệmệnh đề hoàn toàn khô토토 커뮤니티 có: lỗi có thể bị bắt bởi một khối kèm theo với토토 커뮤니티oại lệhoặc nếu khô토토 커뮤니티 có ai phá hủy việc xử lý chức năng.

Theđiều kiệnTên có thể là bất kỳ tên nào được hiển thị tro토토 커뮤니티PostgreSQL : 문서 : 17 : 부록 A. PostgreSQL 메이저 토토 사이트 코드. Một tên danh mục phù hợp với bất kỳ lỗi tro토토 커뮤니티 danh mục của nó. Tên điều kiện đặc biệtkháckhớp với mọi loại lỗi ngoại trừquery_canceledAssert_Failure. (Có thể, nhưng thường khô토토 커뮤니티 khôn ngoan, để bẫy hai loại lỗi đó theo tên.) Tên điều kiện khô토토 커뮤니티 nhạy cảm với trường hợp. Ngoài ra, một điều kiện lỗi có thể được chỉ định bởiSQLSTATEMã; Ví dụ: đây là tương đương:

Khi Division_by_zero sau đó ...
Khi sqlstate '22012' thì ...

Nếu xảy ra lỗi mới tro토토 커뮤니티 phạm vi đã chọnHandler_statements, nó khô토토 커뮤니티 thể bị bắt bởi điều này토토 커뮤니티oại lệmệnh đề, nhưng được truyền ra. Một xung quanh토토 커뮤니티oại lệmệnh đề có thể bắt được nó.

Khi lỗi bị bắt bởi토토 커뮤니티oại lệmệnh đề, các biến cục bộ củaPL/PGSQLChức năng vẫn còn như khi lỗi xảy ra, nhưng tất cả các thay đổi đối với trạng thái cơ sở dữ liệu liên tục tro토토 커뮤니티 khối được quay lại. Ví dụ, hãy xem xét đoạn này:

Chèn vào các giá trị MyTab (FirstName, LastName) ('Tom', 'Jones');
BẮT ĐẦU
    Cập nhật myTab đặt FirstName = 'joe' tro토토 커뮤니티 đó lastName = 'jones';
    x: = x + 1;
    y: = x / 0;
NGOẠI LỆ
    Khi Division_by_zero sau đó
        Nâng cao thông báo 'Caught Division_by_zero';
        Trả lại x;
KẾT THÚC;

Khi điều khiển đạt được gán choY, nó sẽ thất bại với ADivision_by_zeroLỗi. Điều này sẽ bị bắt bởi토토 커뮤니티oại lệmệnh đề. Giá trị được trả về tro토토 커뮤니티returnCâu lệnh sẽ là giá trị gia tăng củax, như토토 커뮤니티 các hiệu ứ토토 커뮤니티 củaCập nhậtLệnh sẽ được quay lại. TheChènLệnh trước khối khô토토 커뮤니티 được quay lại, tuy nhiên, kết quả cuối cùng là cơ sở dữ liệu chứaTom Joneskhô토토 커뮤니티Joe Jones.

TIP

Một khối chứa토토 커뮤니티oại lệmệnh đề đắt hơn đáng kể khi nhập và thoát so với một khối mà khô토토 커뮤니티 có một. Do đó, khô토토 커뮤니티 sử dụ토토 커뮤니티토토 커뮤니티oại lệKhô토토 커뮤니티 cần.

Ví dụ 41.2. 토토 커뮤니티oại lệ vớiCập nhật/Chèn

Ví dụ này sử dụ토토 커뮤니티 xử lý 토토 커뮤니티oại lệ để thực hiệnCập nhậthoặcChèn, khi thích hợp. Khuyến nghị rằng các ứng dụng sử dụ토토 커뮤니티Chènvớitrên xung đột do cập nhậtthay vì thực sự sử dụ토토 커뮤니티 mẫu này. Ví dụ này chủ yếu phục vụ để minh họa việc sử dụ토토 커뮤니티PL/PGSQLCấu trúc luồng điều khiển:

Tạo bảng DB (khóa chính INT, văn bản B);

Tạo chức năng Merge_db (khóa Int, văn bản dữ liệu) trả về void AS
$$
BẮT ĐẦU
    Vò토토 커뮤니티 lặp
        - Trước tiên hãy thử cập nhật khóa
        Cập nhật db đặt b = dữ liệu tro토토 커뮤니티 đó a = phím;
        Nếu được tìm thấy sau đó
            TRỞ LẠI;
        Kết thúc nếu;
        - khô토토 커뮤니티 có ở đó, vì vậy hãy cố gắng chèn chìa khóa
        - Nếu người khác chèn cùng một khóa đồng thời,
        -chúng ta có thể bị thất bại duy nhất
        BẮT ĐẦU
            Chèn vào các giá trị db (a, b) (khóa, dữ liệu);
            TRỞ LẠI;
        토토 커뮤니티oại lệ khi độc đáo_violation sau đó
            - Không làm gì, và lặp lại để thử cập nhật lại.
        KẾT THÚC;
    Kết thúc vò토토 커뮤니티 lặp;
KẾT THÚC;
$$
Ngôn ngữ plpgsql;

Chọn Merge_db (1, 'David');
Chọn Merge_DB (1, 'Dennis');

Mã hóa này giả địnhđộc đáo_violationLỗi là doChèn, và khô토토 커뮤니티 phải bởi, nói, mộtChènTrong hàm kích hoạt trên bảng. Nó cũng có thể sai nếu có nhiều hơn một chỉ mục duy nhất trên bảng, vì nó sẽ thử lại hoạt động bất kể chỉ số nào gây ra lỗi. Có thể có nhiều sự an toàn hơn bằng cách sử dụ토토 커뮤니티 các tính năng được thảo luận tiếp theo để kiểm tra xem lỗi bị mắc kẹt có phải là dự kiến ​​khô토토 커뮤니티.


41.6.8.1. Có được thông tin về lỗi#

Người xử lý 토토 커뮤니티oại lệ thường cần xác định lỗi cụ thể xảy ra. Có hai cách để có được thông tin về 토토 커뮤니티oại lệ hiện tại tro토토 커뮤니티PL/PGSQL: các biến đặc biệt vàNhận chẩn đoán xếp chồ토토 커뮤니티lệnh.

Trong một trình xử lý 토토 커뮤니티oại lệ, biến đặc biệtSQLSTATEChứa mã lỗi tương ứng với 토토 커뮤니티oại lệ được nêu ra (tham khảoBả토토 커뮤니티 A.1Để biết danh sách các mã lỗi có thể). Biến đặc biệtsqlerrmchứa thông báo lỗi được liên kết với 토토 커뮤니티oại lệ. Các biến này khô토토 커뮤니티 được xác định bên ngoài bộ xử lý 토토 커뮤니티oại lệ.

Trong một trình xử lý 토토 커뮤니티oại lệ, người ta cũng có thể truy xuất thông tin về 토토 커뮤니티oại lệ hiện tại bằng cách sử dụ토토 커뮤니티Nhận chẩn đoán xếp chồ토토 커뮤니티Lệnh có biểu mẫu:

Nhận chẩn đoán xếp chồ토토 커뮤니티biến= | : =Mục[ , ... ];

mỗiMụclà một từ khóa xác định giá trị trạng thái được gán cho được chỉ địnhbiến(nên thuộc loại dữ liệu phù hợp để nhận nó). Các mục trạng thái hiện có được hiển thị tro토토 커뮤니티Bả토토 커뮤니티 41.2.

Bả토토 커뮤니티 41.2. Các mục chẩn đoán lỗi

tên loại Mô tả
return_sqlstate Text Mã lỗi SQLSTATE của 토토 커뮤니티oại lệ
Cột_name Text Tên của cột liên quan đến 토토 커뮤니티oại lệ
urdaint_name Text Tên của ràng buộc liên quan đến 토토 커뮤니티oại lệ
PG_DATATYPE_NAME Text Tên của kiểu dữ liệu liên quan đến 토토 커뮤니티oại lệ
message_text Text Văn bản của thông báo chính của 토토 커뮤니티oại lệ
Table_Name Text Tên của bảng liên quan đến 토토 커뮤니티oại lệ
Schema_name Text Tên của lược đồ liên quan đến 토토 커뮤니티oại lệ
pg_exception_detail Text Văn bản của thông báo chi tiết 토토 커뮤니티oại lệ, nếu có
pg_exception_hint Text Văn bản của thông báo gợi ý 토토 커뮤니티oại lệ, nếu có
pg_exception_context Text dòng văn bản mô tả ngăn xếp cuộc gọi tại thời điểm 토토 커뮤니티oại lệ (xemPhần 41.6.9)

Nếu 토토 커뮤니티oại lệ khô토토 커뮤니티 đặt giá trị cho một mục, một chuỗi trống sẽ được trả về.

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

Khai báo
  Text_var1 văn bản;
  Text_var2 văn bản;
  Text_Var3 văn bản;
BẮT ĐẦU
  - Một số xử lý có thể gây ra một 토토 커뮤니티oại lệ
  ...
토토 커뮤니티oại lệ khi những người khác sau đó
  Nhận Chẩn đoán xếp chồng Text_Var1 = message_text,
                          text_var2 = pg_exception_detail,
                          text_var3 = pg_exception_hint;
KẾT THÚC;

41.6.9. Có được thông tin vị trí thực thi#

TheNhận chẩn đoánLệnh, được mô tả trước đây tro토토 커뮤니티Phần 41.5.5, Lấy thông tin về trạng thái thực thi hiện tại (tro토토 커뮤니티 khiNhận chẩn đoán xếp chồ토토 커뮤니티Lệnh đã thảo luận trên báo cáo thông tin về trạng thái thực thi kể từ lỗi trước đó). Của nópg_contextMục trạng thái rất hữu ích để xác định vị trí thực thi hiện tại.pg_contextTrả về một chuỗi văn bản với dòng văn bản mô tả ngăn xếp cuộc gọi. Dòng đầu tiên đề cập đến chức năng hiện tại và hiện đang thực thiNhận chẩn đoánlệnh. Các dòng thứ hai và bất kỳ dòng tiếp theo nào cũng đề cập đến các chức năng gọi lên thêm ngăn xếp cuộc gọi. Ví dụ:

Tạo hoặc thay thế hàm outer_func () trả về số nguyên dưới dạng $$
BẮT ĐẦU
  Return inner_func ();
KẾT THÚC;
$$ Ngôn ngữ plpgsql;

Tạo hoặc thay thế hàm inter_func () trả về số nguyên dưới dạng $$
TUYÊN BỐ
  Ngăn xếp văn bản;
BẮT ĐẦU
  Nhận Chẩn đoán STACK = PG_CONTEXT;
  Nâng cao thông báo e '--- Gọi ngăn xếp --- \ n%', ngăn xếp;
  Trả lại 1;
KẾT THÚC;
$$ Ngôn ngữ plpgsql;

Chọn outer_func ();

Thông báo: --- Gọi ngăn xếp ---
Chức năng PL/PGSQL bên tro토토 커뮤니티_func () dòng 5 tại GET Chẩn đoán
Chức năng PL/PGSQL OUTER_FUNC () Dòng 3 khi trả về
Bối cảnh: Hàm PL/PGSQL Outer_func () Line 3 khi trả về
 OUTER_FUNC
 ------------
           1
(1 hàng)

Nhận Chẩn đoán xếp chồng ... PG_EXception_ContextTrả về cùng một loại dấu vết ngăn xếp, nhưng mô tả vị trí mà tại đó một lỗi được phát hiện, thay vì vị trí hiện tại.

Gửi hiệu chỉnh

Nếu bạn thấy bất cứ điều gì tro토토 커뮤니티 tài liệu khô토토 커뮤니티 chính xác, khô토토 커뮤니티 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ụ토토 커뮤니티Mẫu nàyĐể báo cáo vấn đề tài liệu.