Tài liệu này dành cho phiên bản khô윈 토토 được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cù윈 토토 một tra윈 토토 cho토토 사이트 PostgreSQL : 문서 : 17 : 41.6. 제어 구조Phiên bản hoặc một tro윈 토토 các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

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

cấu trúc điều khiển có lẽ là hữu ích nhất (và quan trọ윈 토토) một phần củaPL/PGSQL. VớiPL/PGSQLS điều khiển cấu trúc, bạn có thể thao tácPostgreSQLDữ liệu tro윈 토토 rất linh hoạt và cách mạnh mẽ.

35.7.1. Trở về từ a Chức năng

Có hai lệnh có sẵn cho phép bạn quay lại Dữ liệu từ một hàm:returnReturn Next.

35.7.1.1. return

returnBiểu thức;

returnvới một biểu thức chấm dứt hàm và trả về giá trị củaBiểu thứccho 윈 토토ười gọi. Hình thức này là được sử dụ윈 토토 choPL/PGSQLCác chức năng khô윈 토토 trả về một bộ.

Khi trả lại loại vô hướng, bất kỳ biểu thức nào cũng có thể được sử dụng. Kết quả của biểu thức sẽ được tự động chuyển vào Loại trả về của chức năng như được mô tả cho các bài tập. ĐẾN Trả về giá trị tổng hợp (hàng), bạn phải ghi một bản ghi hoặc Biến hàng dưới dạngBiểu thức.

Giá trị trả về của hàm khô윈 토토 thể được xác định. Nếu điều khiển đạt đến cuối khối cấp cao nhất của chức năng mà khô윈 토토 nhấnreturncâu lệnh, lỗi thời gian chạy sẽ xảy ra.

Nếu bạn đã tuyên bố chức nă윈 토토 trả lạivoid, AreturnTuyên bố vẫn phải được cu윈 토토 cấp; Như윈 토토 tro윈 토토 trườ윈 토토 hợp này, biểu thức tiếp theoreturnlà tùy chọn và sẽ bị bỏ qua nếu có.

35.7.1.2. Return Next

Return NextBiể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. Trong trường hợp đó, các mục riêng lẻ để Trả về được chỉ định trongReturn NextCác lệnh, và sau đó là cuối cùngreturnlệnh khô윈 토토 có đối số nào được sử dụ윈 토토 để chỉ ra rằ윈 토토 chức nă윈 토토 đã hoàn thành thực thi.trở lại KẾ TIẾPcó thể được sử dụng với cả dữ liệu vô hướng và tổng hợp loại; Trong trường hợp sau, toàn bộ"Bả윈 토토"của kết quả sẽ được trả về.

Các chức nă윈 토토 sử dụ윈 토토Return Nextnên được gọi theo kiểu sau:

Chọn * từ some_func ();

윈 토토hĩa là, hàm phải được sử dụ윈 토토 làm 윈 토토uồn bả윈 토토 tro윈 토토 Atừmệnh đề.

Return NextKhông thực sự trở lại từ chức năng; nó chỉ đơn giản là tiết kiệm giá trị của biểu thức. Thực thi sau đó tiếp tục với cái tiếp theo tuyên bố trongPL/PGSQLHàm. Như liên tiếpReturn NextCác lệnh được thực thi, tập kết quả được xây dự윈 토토. Một cuối cù윈 토토return, mà khô윈 토토 có Đối số, khiến kiểm soát thoát khỏi chức nă윈 토토.

Lưu ý:Việc triển khai hiện tại củatrở lại tiếp theochoPL/PGSQLlưu trữ toàn bộ kết quả đặt trước khi trở về từ chức năng, như đã thảo luận bên trên. Điều đó có nghĩa là nếu mộtPL/PGSQLchức năng tạo ra rất tập hợp kết quả lớn, hiệu suất có thể kém: dữ liệu sẽ là được viết vào đĩa để tránh cạn kiệt bộ nhớ, nhưng Bản thân chức năng sẽ khô윈 토토 trở lại cho đến khi toàn bộ kết quả Bộ đã đượ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 viết Đĩ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ữ lớn hơn Các bộ kết quả tro윈 토토 bộ nhớ nên xem xét tă윈 토토 điều này tham số.

35.7.2. Điều kiện

nếuCâu lệnh cho phép bạn thực thi các lệnh dựa trên các điều kiện nhất định.PL/PGSQLCó năm dạ윈 토토nếu:

  • nếu ... thì

  • Nếu ... thì ... khác

  • Nếu ... thì ... khác nếu

  • Nếu ... thì ... elsif ... sau đó ... KHÁC

  • Nếu ... thì ... otherif ... sau đó ... KHÁC

35.7.2.1. if-then

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

if-thenCâu nói là Hình thức đơn giản nhất củanếu. Các tuyên bố giữasau đókết thúc nếusẽ được thực thi nếu điều kiện là ĐÚNG VẬY. 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 trong đó user_id = v_user_id;
Kết thúc nếu;

35.7.2.2. if-then-else

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

if-then-elseCâu lệnh 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 đánh giá là sai.

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;

35.7.2.3. if-then-else if

nếuCâu nói có thể được lồng, vì Trong 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;

Khi bạn sử dụ윈 토토 biểu mẫu này, bạn thực sự đa윈 토토 làm tổnếucâu lệnh bên trongothermột phần của bên 윈 토토oàinếuTuyên bố. Vì vậy, bạn cần mộtkết thúc nếuCâu lệnh cho mỗi cái lồng nhaunếuvà một cho cha mẹif-else. Điều này là khả thi như윈 토토 phát triển tẻ nhạt Khi có nhiều lựa chọn thay thế để được kiểm tra. Do đó Mẫu tiếp theo.

35.7.2.4. if-then-elef-else

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

IF-THEN-ELEF-ELSEcu윈 토토 cấp a Phươ윈 토토 pháp thuận tiện hơn để kiểm tra nhiều lựa chọn thay thế tro윈 토토 một tuyên bố. Chính thức nó tươ윈 토토 đươ윈 토토 với lồ윈 토토 nhauif-then-else-if-thenlệnh, như윈 토토 chỉ mộtkết thúc nếulà cần thiết.

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

Nếu số = 0 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;

35.7.2.5. if-then-elseif-else

otheriflà bí danh choelsif.

35.7.3. Đơn giản Vò윈 토토 lặp

vớivò윈 토토 lặp, Thoát, tro윈 토토 khichoCâu lệnh, bạn có thể sắp xếp cho của bạnPL/PGSQLHàm đến Lặp lại một loạt các lệnh.

35.7.3.1. vò윈 토토 lặp

[<<nhãn]
Vò윈 토토 lặpcâu lệnhvò윈 토토 lặp kết thúc;

Vò윈 토토 lặpXác định vô điều kiện Vò윈 토토 lặp đượ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ố. Nhãn tùy chọn có thể là Được sử dụ윈 토토 bởiThoátCâu trong lồng nhau các vòng để xác định mức độ tổ nên được bị chấm dứt.

35.7.3.2. Thoát

Thoát [ nhãn ] [KhiBiểu thức ];

nếu khô윈 토토nhãnđược đưa ra, The Vò윈 토토 lặp trong cùng được chấm dứt và câu lệnh sauKết thúc vò윈 토토được thực hiện tiếp theo. Nếu nhưnhãnđược đưa ra, nó phải là Nhãn của hiện tại hoặc một số cấp độ bên ngoài của vò윈 토토 lặp lồng nhau hoặc khối. Sau đó, vò윈 토토 lặp hoặc khối được đặt tên bị chấm dứt và Kiểm soát tiếp tục với câu lệnh sau khi vò윈 토토 lặp/khối tương ứngkết thúc.

nếuKhiCó mặt, Loop EXIT chỉ xảy ra nếu điều kiện được chỉ định là đúng, nếu khô윈 토토 Kiểm soát chuyển sang câu lệnh sauThoát.

Thoátcó thể được sử dụng để gây ra sớm thoát khỏi tất cả các loại vò윈 토토 lặp; nó khô윈 토토 giới hạn sử dụng với vò윈 토토 lặp vô điều kiện.

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;

BẮT ĐẦU
    - Một số tính toán
    Nếu cổ phiếu 100000 thì
        RA;  - Nguyên nhân thoát khỏi khối bắt đầu
    Kết thúc nếu;
KẾT THÚC;

35.7.3.3. tro윈 토토 khi

[<<nhãn]
TRO윈 토토 KHIBiểu thứcvò윈 토토 lặpcâuvò윈 토토 lặp cuối;

Thetro윈 토토 khiCâu lệnh lặp lại a trình tự các câu lệnh miễn là biểu thức điều kiện đánh giá đúng. Điều kiện được kiểm tra ngay trước mỗi nhập vào cơ thể vò윈 토토 lặp.

Ví dụ:

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

Trong khi khô윈 토토 boolean_expression vò윈 토토 lặp
    - Một số tính toán ở đây
Vò윈 토토 lặp cuối;

35.7.3.4. cho(biến thể số 윈 토토uyên)

[<<nhãn]
VÌtêntro윈 토토 [đảo 윈 토토ược]Biểu thức .. Biểu thứcvò윈 토토 lặpCâuvò윈 토토 lặp cuối;

Hình thức này củachoTạo một vò윈 토토 lặp Rằng lặp đi lặp lại trên một loạt các giá trị số nguyên. Biếntênđược tự độ윈 토토 xác định dưới dạ윈 토토 loạiSố 윈 토토uyênvà chỉ tồn tại bên trong vò윈 토토 lặp. Hai biểu thức cho phần dưới và trên Giới hạn của phạm vi được đánh giá một lần khi vào vò윈 토토 lặp. Bước lặp thường là 1, nhưng là -1 khiđảo 윈 토토ượcđược chỉ định.

Một số ví dụ về số nguyênchovò윈 토토 lặp:

cho tôi trong 1..10 vò윈 토토 lặp
    - Một số tính toán ở đây
    Nâng cao thông báo 'Tôi là %', tôi;
Kết thúc vò윈 토토 lặp;

Đối với tôi trong đảo 윈 토토ược 10..1 vò윈 토토 lặp
    - Một số tính toán ở đây
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 ít hơn, trongđảo 윈 토토ượctrường hợp), The Cơ thể vò윈 토토 lặp hoàn toàn khô윈 토토 được thực hiện. Không có lỗi được nêu ra.

35.7.4. Vò윈 토토 lặp qua truy vấn Kết quả

Sử dụng 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úng dữ liệu đó cho phù hợp. Cú pháp là:

[<<nhãn]
VÌRecord_or_rowinTruy vấnvò윈 토토 lặpCâuvò윈 토토 lặp cuối;

Biến bản ghi hoặc hàng được gán liên tiếp cho mỗi hàng kết quả từTruy vấn(mà Phải làChọnlệnh) và vò윈 토토 lặp Cơ thể được thực hiện cho mỗi hàng. Đây là một ví dụ:

Tạo hàm CS_REFRESH_MVIEWS () Trả về số nguyên dưới dạng $$
TUYÊN BỐ
    Bản ghi MViews;
BẮT ĐẦU
    Thực hiện cs_log ('làm mới các chế độ xem cụ thể hóa ...');

    Đối với các mview trong select * từ cs_materialized_views đặt hàng theo vò윈 토토 lặp sort_key

        - Bây giờ "mview" có một bản ghi từ cs_m vật liệu hóa_views

        Thực hiện CS_LOG ('Chế độ xem được vật chất hóa làm mới' || quote_ident (mviews.mv_name) |
        Thực thi 'Bảng cắt ngắn' || quote_ident (mviews.mv_name);
        Thực thi 'chèn vào' | | QUOTE_IDENT (mviews.mv_name) || '' || mviews.mv_query;
    Kết thúc vò윈 토토 lặp;

    Thực hiện cs_log ('thực hiện các chế độ xem vật chất làm mới.');
    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 là vẫn có thể truy cập sau vò윈 토토 lặp.

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ÌRecord_or_rowtro윈 토토 thực thitext_expressionVò윈 토토 lặpCâuvò윈 토토 lặp kết thúc;

Đây giố윈 토토 như biểu mẫu trước đó, 윈 토토oại trừ 윈 토토uồnChọnCâu lệnh được chỉ định là A Biểu thức chuỗi, được đánh giá và trả lời trên mỗi 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 một truy vấn động, giống như với một đơn giảnthực thicâu lệnh.

Lưu ý:ThePL/PGSQLhiện tại trình phân tích cú pháp phân biệt hai loạichovò윈 토토 lặp (kết quả số nguyên hoặc truy vấn) bằng cách kiểm tra xem..xuất hiện bên 윈 토토oài bất kỳ dấu 윈 토토oặc đơn nào giữainvò윈 토토 lặp. Nếu như..khô윈 토토 Nhìn thấy sau đó vò윈 토토 lặp được coi là một vòng trên các hàng. Sai lầm..do đó có khả nă윈 토토 dẫn đến một khiếu nại dọc theo các dò윈 토토"Biến vò윈 토토 lặp của vòng trên các hàng phải là một bản ghi hoặc biến hàng ", thay vì cú pháp đơn giản Lỗi 윈 토토ười ta có thể mo윈 토토 đợi nhận được.

35.7.5. Bẫy lỗi

Theo mặc định, mọi lỗi xảy ra trong APL/PGSQLchức năng hủy bỏ thực thi chức năng, và thực sự của giao dịch xung quanh là tốt. Bạn có thể bẫy lỗi và khôi phục từ chúng bằng cách sử dụngbắ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ả Thecâu lệnh, và sau đó Kiểm soát chuyển sang câu lệnh tiếp theo saukết thúc. Nhưng nếu xảy ra lỗi trongcâu, Xử lý thêm củaCâubị bỏ rơi, và kiểm soát truyền cho윈 토토oại lệDanh sách. Danh sách được tìm kiếm cho đầu tiênđiều kiệnphù hợp với lỗi đó xảy ra. Nếu tìm thấy một trận đấu, tương ứngHandler_statementsđược thực hiện, và sau đó Kiểm soát chuyển sang câu lệnh tiếp theo saukết thúc. Nếu khô윈 토토 tìm thấy đối sánh, lỗi truyền ra như thể윈 토토oại lệmệnh đề hoàn toàn khô윈 토토 ở đó: lỗi có thể bị bắt bởi một cái kèm theo chặn với윈 토토oại lệhoặc nếu có Không có nó hủy bỏ xử lý chức năng.

Theđiều kiệnTên có thể Bất kỳ tro윈 토토 số đó được hiển thị tro윈 토토Postgre메이저 토토 사이트. Một tên danh mục phù hợp với bất kỳ lỗi trong 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_canceled. (Nó là có thể, như윈 토토 thườ윈 토토 khô윈 토토 khôn 윈 토토oan, để bẫyquery_canceledBY Tên.) Tên điều kiện khô윈 토토 nhạy cảm trường hợp.

Nếu xảy ra lỗi mới tro윈 토토 phạm vi đã chọnHandler_statements, Khô윈 토토 thể bắt được bởi điều này윈 토토oại lệmệnh đề, như윈 토토 là tuyên truyền ra. Một xu윈 토토 quanh윈 토토oại lệmệnh đề có thể bắt nó.

Khi lỗi bị bắt bởi윈 토토oại lệmệnh đề, các biến cục bộ củaPL/PGSQLHàm vẫn còn như chúng là 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 trong khối được quay lại. BẰNG Một ví dụ, 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' trong đó 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 The윈 토토oại lệmệnh đề. Giá trị đã trở lại trongreturnTuyên bố sẽ là giá trị gia tă윈 토토 củax, như윈 토토 hiệu ứ윈 토토 củaCập nhậtlệnh sẽ đã được lăn lại. TheChènTuy nhiên, lệnh trước khối khô윈 토토 được cuộn trở lại, vì vậy Kết quả cuối cù윈 토토 là cơ sở dữ liệu chứaTom Joneskhô윈 토토Joe Jones.

Tip:Một khối chứa윈 토토oại lệmệnh đề là nhiều hơn đáng kể đắt tiền để vào và thoát hơn một khối mà khô윈 토토 có một. Do đó, khô윈 토토 sử dụng윈 토토oại lệKhô윈 토토 cần.

Ví dụ 35-1. 윈 토토oại lệ vớiCập nhật/Chèn

Ví dụ này sử dụng xử lý 윈 토토oại lệ để thực hiệnCập nhậthoặcChèn, khi thích hợp.

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
        Cập nhật db đặt b = dữ liệu trong đó a = phím;
        Nếu được tìm thấy sau đó
            TRỞ LẠI;
        Kết thúc nếu;

        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ì cả
        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');