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 / 7.2
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 kèo bóng đá euro phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

36.4. Ngôn ngữ truy vấn (kèo bóng đá euro) Chức năng

Các chức năng kèo bóng đá euro Thực hiện danh sách các câu lệnh kèo bóng đá euro tùy ý, trả về kết quả của truy vấn cuối cùng trong danh sách. Trong trường hợp đơn giản (không tập hợp), hàng đầu tiên của kết quả truy vấn cuối cùng sẽ được trả về. (Hãy nhớ rằng"Hàng đầu tiên"của một kết quả nhiều người không được xác định rõ trừ khi bạn sử dụngĐặt hàng bởi.) Nếu truy vấn cuối cùng xảy ra để trả về không có hàng nào, giá trị null sẽ được trả về.

Ngoài ra, có thể khai báo kèo bóng đá euro SQL để trả về một tập hợp (nghĩa là nhiều hàng) bằng cách chỉ định loại trả về của kèo bóng đá euro làsetofanypepehoặc tương đương bằng cách khai báo nó làBảng trả về (cột). Trong trường hợp này, tất cả kèo bóng đá euro hàng của kết quả truy vấn cuối cùng được trả về. Thông tin chi tiết khác xuất hiện bên dưới.

Phần thân của kèo bóng đá euro SQL phải là danh sách các câu lệnh SQL được phân tách bằng dấu chấm phẩy. Một dấu chấm phẩy sau tuyên bố cuối cùng là tùy chọn. Trừ khi kèo bóng đá euro được tuyên bố trả lạivoid, câu lệnh cuối cùng phải làChọnhoặc mộtChèn, Cập nhậthoặcXóaCó mộtTrở vềmệnh đề.

bất kỳ bộ sưu tập nào kèo bóng đá euro lệnh trongkèo bóng đá euroNgôn ngữ có thể được đóng gói cùng nhau và được định nghĩa là một kèo bóng đá euro. Bên cạnh đóChọnTruy vấn, kèo bóng đá euro lệnh có thể bao gồm kèo bóng đá euro truy vấn sửa đổi dữ liệu (Chèn, Cập nhậtXóa), cũng như các lệnh kèo bóng đá euro khác. (Bạn không thể sử dụng các lệnh điều khiển giao dịch, ví dụ:cam kết, SavePoint, và một số lệnh tiện ích, ví dụ:Nút hút, trongkèo bóng đá eurokèo bóng đá euro.) Tuy nhiên, lệnh cuối cùng phải làChọnhoặc cóTrở vềmệnh đề trả về bất cứ điều gì được chỉ định là loại trả về của kèo bóng đá euro. Ngoài ra, nếu bạn muốn xác định chức năng SQL thực hiện các hành động nhưng không có giá trị hữu ích để trả về, bạn có thể định nghĩa nó là trả vềvoid. Ví dụ, chức năng này loại bỏ kèo bóng đá euro hàng có mức lương âm từEMPBảng:

Tạo chức năng Clean_emp () trả về void As '
    Xóa khỏi EMP
        Trong đó tiền lương <0;
'Ngôn ngữ kèo bóng đá euro;

Chọn Clean_emp ();

 Clean_emp
-----------

(1 hàng)

Lưu ý:Toàn bộ phần thân của kèo bóng đá euro SQL được phân tích cú pháp trước khi bất kỳ trong số đó được thực thi. Trong khi kèo bóng đá euro SQL có thể chứa các lệnh thay đổi danh mục hệ thống (ví dụ:Tạo bảng), Các hiệu ứng của các lệnh đó sẽ không được nhìn thấy trong quá trình phân tích phân tích các lệnh sau trong kèo bóng đá euro. Vì vậy, ví dụ,Tạo bảng foo (...); Chèn vào kèo bóng đá euro giá trị foo (...);sẽ không hoạt động như mong muốn nếu được đóng gói thành một kèo bóng đá euro SQL duy nhất, vìfoochưa tồn tại khiChènLệnh được phân tích cú pháp. Nó được khuyến nghị sử dụngPL/PGSQLThay vì kèo bóng đá euro SQL trong loại tình huống này.

Cú pháp củatạo chức năngLệnh yêu cầu cơ thể chức năng được viết dưới dạng hằng số chuỗi. Thường thuận tiện nhất khi sử dụng báo giá đô la (xemPhần 4.1.2.4) cho hằng số chuỗi. Nếu bạn chọn sử dụng cú pháp không đổi chuỗi được trình bày đơn thông thường, bạn phải tăng gấp đôi dấu ngoặc kép (') và Backslashes (\) (giả sử cú pháp chuỗi thoát) trong phần thân của kèo bóng đá euro (xemPhần 4.1.2.1).

36.4.1. Đối số chokèo bóng đá euroChức năng

Đối số của kèo bóng đá euro SQL có thể được tham chiếu trong thân kèo bóng đá euro bằng tên hoặc số. Ví dụ về cả hai phương thức xuất hiện dưới đây.

Để sử dụng tên, khai báo đối số chức năng là có tên, và sau đó chỉ cần viết tên đó trong phần thân chức năng. Nếu tên đối số giống như bất kỳ tên cột nào trong lệnh SQL hiện tại trong kèo bóng đá euro, tên cột sẽ được ưu tiên. Để ghi đè này, đủ điều kiện tên đối số với tên của chức năng, đó làfunction_name.arging_name. .

Trong cách tiếp cận số cũ hơn, kèo bóng đá euro đối số được tham chiếu bằng cú pháp$n: $ 1đề cập đến đối số đầu vào đầu tiên,$ 2đến lần thứ hai, v.v. Điều này sẽ hoạt động cho dù đối số cụ thể có được khai báo với một tên hay không.

Nếu một đối số thuộc loại tổng hợp, thì ký hiệu dấu chấm, ví dụ:argname.FieldNamehoặc$ 1.FieldName, có thể được sử dụng để truy cập các thuộc tính của đối số. Một lần nữa, bạn có thể cần phải đủ điều kiện tên của đối số với tên kèo bóng đá euro để làm cho biểu mẫu có tên đối số không rõ ràng.

Các đối số chức năng kèo bóng đá euro chỉ có thể được sử dụng làm giá trị dữ liệu, chứ không phải là định danh. Do đó, ví dụ điều này là hợp lý:

Chèn vào kèo bóng đá euro giá trị MyTable ($ 1);

Nhưng điều này sẽ không hoạt động:

Chèn vào kèo bóng đá euro giá trị $ 1 ​​(42);

Lưu ý:Khả năng sử dụng tên để tham khảo các đối số chức năng kèo bóng đá euro đã được thêm vàoPostgreSQL9.2. kèo bóng đá euro chức năng được sử dụng trong kèo bóng đá euro máy chủ cũ hơn phải sử dụng$nký hiệu.

36.4.2.kèo bóng đá eurokèo bóng đá euro chức năng trên kèo bóng đá euro loại cơ sở

đơn giản nhất có thểkèo bóng đá eurokèo bóng đá euro không có đối số và chỉ cần trả về một loại cơ sở, chẳng hạn nhưSố nguyên:

Tạo kèo bóng đá euro một () trả về số nguyên dưới dạng $$
    Chọn 1 kết quả;
$$ Ngôn ngữ SQL;

- Cú pháp thay thế cho chuỗi theo nghĩa đen:
Tạo kèo bóng đá euro một () trả về số nguyên là '
    Chọn 1 kết quả;
'Ngôn ngữ SQL;

Chọn một ();

 một
-----
   1

Lưu ý rằng chúng tôi đã xác định một bí danh cột trong phần thân kèo bóng đá euro cho kết quả của kèo bóng đá euro (với tênresult), nhưng bí danh cột này không hiển thị bên ngoài kèo bóng đá euro. Do đó, kết quả được dán nhãnmộtthay vìresult.

Nó gần như dễ dàng để xác địnhkèo bóng đá eurokèo bóng đá euro chức năng lấy kèo bóng đá euro loại cơ sở làm đối số:

Tạo kèo bóng đá euro add_em (x Integer, y integer) Trả về số nguyên dưới dạng $$
    Chọn x + y;
$$ Ngôn ngữ SQL;

Chọn add_em (1, 2) làm câu trả lời;

 trả lời
--------
      3

Ngoài ra, chúng ta có thể phân phối với tên cho kèo bóng đá euro đối số và số sử dụng:

Tạo kèo bóng đá euro add_em (số nguyên, số nguyên) trả về số nguyên dưới dạng $$
    Chọn $ 1 + $ 2;
$$ Ngôn ngữ SQL;

Chọn add_em (1, 2) làm câu trả lời;

 trả lời
--------
      3

Đây là một chức năng hữu ích hơn, có thể được sử dụng để ghi nợ tài khoản ngân hàng:

Tạo kèo bóng đá euro TF1 (Số nguyên tài khoản, Số ghi nợ) Trả về số nguyên dưới dạng $$
    Cập nhật ngân hàng
        Đặt số dư = Số dư - Ghi nợ
        Trong đó tài khoản = tf1.accountno;
    Chọn 1;
$$ Ngôn ngữ SQL;

Người dùng có thể thực thi chức năng này để ghi nợ 17 $ 100,00 như sau:

Chọn TF1 (17, 100.0);

Trong ví dụ này, chúng tôi đã chọn tênAccountNoĐối với đối số đầu tiên, nhưng điều này giống như tên của một cột trongNgân hàngBảng. Trong vòngCập nhậtlệnh,AccountNođề cập đến cộtBank.accountno, vì vậytf1.accountnophải được sử dụng để tham khảo đối số. Tất nhiên chúng ta có thể tránh điều này bằng cách sử dụng một tên khác cho đối số.

Trong thực tế, người ta có thể muốn kết quả hữu ích hơn từ kèo bóng đá euro hơn là hằng số 1, vì vậy một định nghĩa có khả năng hơn là:

Tạo kèo bóng đá euro TF1 (Số nguyên tài khoản, Số ghi nợ) Trả về số nguyên dưới dạng $$
    Cập nhật ngân hàng
        Đặt số dư = Số dư - Ghi nợ
        Trong đó tài khoản = tf1.accountno;
    Chọn số dư từ ngân hàng nơi AccountNo = tf1.accountno;
$$ Ngôn ngữ SQL;

Điều chỉnh số dư và trả về số dư mới. Điều tương tự có thể được thực hiện trong một lệnh bằng cách sử dụngTrở về:

Tạo kèo bóng đá euro TF1 (Số nguyên tài khoản, Số ghi nợ) Trả về số nguyên dưới dạng $$
    Cập nhật ngân hàng
        Đặt số dư = Số dư - Ghi nợ
        WHERE ACCKNO = TF1.AccountNo
    Trả lại số dư;
$$ Ngôn ngữ SQL;

36.4.3.kèo bóng đá eurokèo bóng đá euro chức năng trên kèo bóng đá euro loại tổng hợp

Khi viết kèo bóng đá euro chức năng với kèo bóng đá euro đối số của kèo bóng đá euro loại tổng hợp, chúng ta không chỉ phải chỉ định đối số nào chúng ta muốn mà còn cả thuộc tính mong muốn (trường) của đối số đó. Ví dụ: giả sử rằngEMPlà một bảng chứa dữ liệu nhân viên, và do đó cũng là tên của loại tổng hợp của mỗi hàng của bảng. Đây là một chức năngdouble_salaryĐiều đó tính toán mức lương của ai đó sẽ là gì nếu nó được nhân đôi:

Tạo bảng EMP (
    tên văn bản,
    số tiền lương,
    Số nguyên tuổi,
    quan điểm tủ
);

Chèn vào các giá trị EMP ('Bill', 4200, 45, '(2,1)');

Tạo chức năng double_salary (EMP) trả về số là $$
    Chọn $ 1.Salary * 2 làm tiền lương;
$$ Ngôn ngữ kèo bóng đá euro;

Chọn tên, double_salary (emp.*) Là giấc mơ
    Từ EMP
    Trong đó emp.cubicle ~ = điểm '(2,1)';

 Tên | mơ
------+-------
 Hóa đơn |  8400

Lưu ý việc sử dụng cú pháp$ 1.SalaryĐể chọn một trường của giá trị hàng đối số. Cũng chú ý cách gọiChọnLệnh sử dụngTable_Name.*Để chọn toàn bộ hàng hiện tại của bảng làm giá trị tổng hợp. Hàng bảng có thể được tham chiếu thay thế chỉ bằng tên bảng, như thế này:

Chọn tên, double_salary (emp) là giấc mơ
    Từ EMP
    Trong đó emp.cubicle ~ = point '(2,1)';

Nhưng việc sử dụng này không được dùng để dễ bị nhầm lẫn. (Nhìn thấyPhần 8.16.5Để biết chi tiết về hai ký hiệu này cho giá trị tổng hợp của hàng bảng.)

Đôi khi thật tiện dụng khi xây dựng một giá trị đối số tổng hợp trên đường. Điều này có thể được thực hiện vớihàngXây dựng. Ví dụ: chúng ta có thể điều chỉnh dữ liệu được truyền đến chức năng:

Chọn tên, double_salary (hàng (tên, tiền lương*1.1, tuổi, tủ)) là giấc mơ
    Từ emp;

Cũng có thể xây dựng một kèo bóng đá euro trả về loại tổng hợp. Đây là một ví dụ về một kèo bóng đá euro trả về mộtEMPhàng:

Tạo kèo bóng đá euro new_emp () trả về emp là $$
    Chọn Text 'none' làm tên,
        1000.0 là tiền lương,
        25 như tuổi,
        điểm '(2,2)' như tủ;
$$ Ngôn ngữ SQL;

Trong ví dụ này, chúng tôi đã chỉ định từng thuộc tính có giá trị không đổi, nhưng bất kỳ tính toán nào cũng có thể được thay thế cho kèo bóng đá euro hằng số này.

Lưu ý hai điều quan trọng về việc xác định chức năng:

  • Thứ tự danh sách chọn trong truy vấn phải giống hệt như trong đó kèo bóng đá euro cột xuất hiện trong bảng được liên kết với loại tổng hợp. (Đặt tên kèo bóng đá euro cột, như chúng ta đã làm ở trên, không liên quan đến hệ thống.)

  • Bạn phải đánh máy kèo bóng đá euro biểu thức để phù hợp với định nghĩa của loại tổng hợp hoặc bạn sẽ gặp kèo bóng đá euro lỗi như thế này:

    23567_23652

Một cách khác để xác định cùng một kèo bóng đá euro là:

Tạo kèo bóng đá euro new_emp () trả về emp là $$
    Chọn Hàng ('Không', 1000.0, 25, '(2,2)') :: Emp;
$$ Ngôn ngữ SQL;

Ở đây chúng tôi đã viết AChọnĐó chỉ là một cột duy nhất của loại tổng hợp chính xác. Điều này không thực sự tốt hơn trong tình huống này, nhưng nó là một sự thay thế tiện dụng trong một số trường hợp - ví dụ: nếu chúng ta cần tính toán kết quả bằng cách gọi một kèo bóng đá euro khác trả về giá trị tổng hợp mong muốn.

Chúng ta có thể gọi trực tiếp chức năng này bằng cách sử dụng nó trong một biểu thức giá trị:

Chọn new_emp ();

         new_emp
------------------------------
 (Không, 1000.0,25, "(2,2)")

hoặc bằng cách gọi nó là kèo bóng đá euro bảng:

Chọn * từ new_emp ();

 Tên | Mức lương | Tuổi | ống
------+--------+-----+---------
 Không có | 1000.0 |  25 | (2,2)

Cách thứ hai được mô tả đầy đủ hơn trongPhần 36.4.7.

Khi bạn sử dụng một kèo bóng đá euro trả về loại tổng hợp, bạn có thể chỉ muốn một trường (thuộc tính) từ kết quả của nó. Bạn có thể làm điều đó với cú pháp như thế này:

Chọn (new_emp ()). Tên;

 tên
------
 Không có

dấu ngoặc đơn thêm là cần thiết để giữ cho trình phân tích cú pháp không bị nhầm lẫn. Nếu bạn cố gắng làm điều đó mà không có họ, bạn sẽ nhận được một cái gì đó như thế này:

Chọn new_emp (). Tên;
Lỗi: Lỗi cú pháp tại hoặc gần "."
Dòng 1: Chọn new_emp (). Tên;
                        ^

Một tùy chọn khác là sử dụng ký hiệu chức năng để trích xuất một thuộc tính:

chọn tên (new_emp ());

 tên
------
 Không có

Như đã giải thích trongPhần 8.16.5, ký hiệu trường và ký hiệu chức năng tương đương.

Một cách khác để sử dụng kèo bóng đá euro trả về loại tổng hợp là chuyển kết quả cho một chức năng khác chấp nhận loại hàng chính xác làm đầu vào:

Tạo chức năng getName (emp) trả về văn bản dưới dạng $$
    Chọn $ 1.name;
$$ Ngôn ngữ kèo bóng đá euro;

Chọn getName (new_emp ());
 GetName
---------
 Không có
(1 hàng)

36.4.4.kèo bóng đá eurokèo bóng đá euro với tham số đầu ra

Một cách khác để mô tả kết quả của kèo bóng đá euro là xác định nó vớitham số đầu ra, như trong ví dụ này:

Tạo kèo bóng đá euro add_em (in x int, in y int, out sum int)
Như 'Chọn x + y'
Ngôn ngữ SQL;

Chọn add_em (3,7);
 add_em
--------
     10
(1 hàng)

Điều này về cơ bản không khác với phiên bảnadd_emhiển thị trongPhần 36.4.2. Giá trị thực của kèo bóng đá euro tham số đầu ra là chúng cung cấp một cách thuận tiện để xác định kèo bóng đá euro chức năng trả về một số cột. Ví dụ,

26684_26891

Điều gì đã xảy ra ở đây là chúng tôi đã tạo ra một loại tổng hợp ẩn danh cho kết quả của kèo bóng đá euro. Ví dụ trên có kết quả cuối cùng như

Tạo loại sum_prod AS (Sum int, sản phẩm int);

Tạo chức năng sum_n_product (int, int) trả về sum_prod
Như 'Chọn $ 1 + $ 2, $ 1 * $ 2'
Ngôn ngữ kèo bóng đá euro;

Nhưng không phải bận tâm với định nghĩa loại tổng hợp riêng biệt thường rất tiện dụng. Lưu ý rằng kèo bóng đá euro tên được gắn vào kèo bóng đá euro tham số đầu ra không chỉ là trang trí mà còn xác định tên cột của loại tổng hợp ẩn danh. (Nếu bạn bỏ qua tên cho tham số đầu ra, hệ thống sẽ tự mình chọn tên.)

Lưu ý rằng các tham số đầu ra không được bao gồm trong danh sách đối số cuộc gọi khi gọi một kèo bóng đá euro như vậy từ SQL. Điều này là bởi vìPostgreSQLChỉ xem xét các tham số đầu vào để xác định chữ ký gọi của kèo bóng đá euro. Điều đó cũng có nghĩa là chỉ các tham số đầu vào quan trọng khi tham chiếu chức năng cho các mục đích như bỏ nó. Chúng ta có thể bỏ chức năng trên với một trong hai

chức năng thả sum_n_product (x int, y int, out sum int, out sản phẩm int);
Chức năng thả sum_n_product (int, int);

tham số có thể được đánh dấu làin(mặc định),out, InouthoặcVariadic. MỘTInoutTham số đóng vai trò là tham số đầu vào (một phần của danh sách đối số cuộc gọi) và tham số đầu ra (một phần của loại bản ghi kết quả).Variadictham số là kèo bóng đá euro tham số đầu vào, nhưng được xử lý đặc biệt như mô tả tiếp theo.

36.4.5.kèo bóng đá eurokèo bóng đá euro có số lượng đối số

PostgreSQL: Tàikèo bóng đá euro chức năng có thể được khai báo để chấp nhận số lượng biến số của kèo bóng đá euro đối số, miễn là tất cả kèo bóng đá euro"Tùy chọn"Đối số có cùng loại dữ liệu. Các đối số tùy chọn sẽ được chuyển đến kèo bóng đá euro dưới dạng một mảng. kèo bóng đá euro được khai báo bằng cách đánh dấu tham số cuối cùng làVariadic; Tham số này phải được khai báo là thuộc loại mảng. Ví dụ:

29277_29490

một cách hiệu quả, tất cả kèo bóng đá euro đối số thực tế tại hoặc ngoàiVariadicVị trí được thu thập thành một mảng một chiều, như thể bạn đã viết

Chọn MLEAST (mảng [10, -1, 5, 4.4]);    - không hoạt động

Bạn thực sự không thể viết điều đó, mặc dù - hoặc ít nhất, nó sẽ không phù hợp với định nghĩa chức năng này. Một tham số được đánh dấuVariadickhớp với một hoặc nhiều lần xuất hiện của loại phần tử của nó, không thuộc loại của chính nó.

Đôi khi, rất hữu ích khi có thể chuyển một mảng đã được xây dựng cho một kèo bóng đá euro variadic; Điều này đặc biệt tiện dụng khi một kèo bóng đá euro variadic muốn chuyển tham số mảng của nó cho một kèo bóng đá euro khác. Ngoài ra, đây là cách an toàn duy nhất để gọi một kèo bóng đá euro variadic được tìm thấy trong lược đồ cho phép người dùng không tin tưởng tạo đối tượng; nhìn thấyPhần 10.3. Bạn có thể làm điều này bằng cách chỉ địnhVariadicTrong cuộc gọi:

Chọn MLEAST (Mảng Variadic [10, -1, 5, 4.4]);

Điều này ngăn chặn việc mở rộng tham số variadic của kèo bóng đá euro vào loại phần tử của nó, do đó cho phép giá trị đối số mảng phù hợp với bình thường.VariadicChỉ có thể được đính kèm với đối số thực tế cuối cùng của cuộc gọi kèo bóng đá euro.

Chỉ địnhVariadicTrong cuộc gọi cũng là cách duy nhất để chuyển một mảng trống cho kèo bóng đá euro variadic, ví dụ:

Chọn MLEAST (mảng variadic [] :: Numeric []);

Đơn giản chỉ cần viếtChọn MLEAST ()Không hoạt động vì tham số variadic phải khớp với ít nhất một đối số thực tế. (Bạn có thể xác định chức năng thứ hai cũng có tênMLEAST, Không có tham số, nếu bạn muốn cho phép kèo bóng đá euro cuộc gọi đó.)

Các tham số phần tử mảng được tạo từ một tham số variadic được coi là không có bất kỳ tên nào của riêng họ. Điều này có nghĩa là không thể gọi một kèo bóng đá euro variadic bằng cách sử dụng các đối số được đặt tên (Phần 4.3), ngoại trừ khi bạn chỉ địnhVariadic. Ví dụ: điều này sẽ hoạt động:

Chọn MLEAST (Variadic Arr = Array [10, -1, 5, 4.4]);

Nhưng không phải sau:

Chọn MLEAST (ARR = 10);
Chọn mLeast (mảng = mảng [10, -1, 5, 4.4]);

36.4.6.kèo bóng đá eurokèo bóng đá euro với các giá trị mặc định cho các đối số

Các chức năng có thể được khai báo với các giá trị mặc định cho một số hoặc tất cả các đối số đầu vào. Các giá trị mặc định được chèn bất cứ khi nào kèo bóng đá euro được gọi với không đủ nhiều đối số thực tế. Vì các đối số chỉ có thể được bỏ qua từ cuối danh sách đối số thực tế, tất cả các tham số sau khi một tham số có giá trị mặc định cũng phải có các giá trị mặc định. . nhìn thấyPhần 10.3.

Ví dụ:

Tạo chức năng foo (A int, b int mặc định 2, c int mặc định 3)
Trả về int
Ngôn ngữ kèo bóng đá euro
Như $$
    Chọn $ 1 + $ 2 + $ 3;
$$;

Chọn foo (10, 20, 30);
 foo 
-----
  60
(1 hàng)

Chọn foo (10, 20);
 foo 
-----
  33
(1 hàng)

Chọn foo (10);
 foo 
-----
  15
(1 hàng)

Chọn foo ();  - thất bại vì không có mặc định cho đối số đầu tiên
Lỗi: function foo () không tồn tại

The=Dấu cũng có thể được sử dụng thay cho từ khóamặc định.

36.4.7.kèo bóng đá euroChức năng dưới dạng Nguồn bảng

Tất cả các kèo bóng đá euro SQL có thể được sử dụng trongtừmệnh đề của một truy vấn, nhưng nó đặc biệt hữu ích cho các chức năng trả về các loại tổng hợp. Nếu kèo bóng đá euro được xác định để trả về một loại cơ sở, kèo bóng đá euro bảng sẽ tạo ra một bảng một cột. Nếu kèo bóng đá euro được xác định để trả về một loại tổng hợp, kèo bóng đá euro bảng sẽ tạo một cột cho từng thuộc tính của loại tổng hợp.

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

Tạo bảng foo (fooid int, foosubid int, fooname văn bản);
Chèn vào các giá trị foo (1, 1, 'joe');
Chèn vào các giá trị foo (1, 2, 'ed');
Chèn vào các giá trị foo (2, 1, 'Mary');

Tạo chức năng getfoo (int) trả về foo dưới dạng $$
    Chọn * từ foo trong đó fooid = $ 1;
$$ Ngôn ngữ kèo bóng đá euro;

Chọn *, trên (fooname) từ getfoo (1) là t1;

 Fooid | Foosubid | Fooname | phía trên
-------+----------+---------+-------
     1 |        1 | Joe | Joe
(1 hàng)

Như ví dụ cho thấy, chúng ta có thể làm việc với các cột của kết quả của kèo bóng đá euro giống như khi chúng là cột của một bảng thông thường.

Lưu ý rằng chúng tôi chỉ có một hàng ra khỏi chức năng. Điều này là do chúng tôi không sử dụngsetof. Được mô tả trong phần tiếp theo.

36.4.8.kèo bóng đá eurokèo bóng đá euro chức năng trả về bộ

Khi kèo bóng đá euro SQL được khai báo là trả vềsetofanypepe, Truy vấn cuối cùng của chức năng được thực thi để hoàn thành và mỗi hàng nó xuất được trả về dưới dạng phần tử của tập kết quả.

Tính năng này thường được sử dụng khi gọi kèo bóng đá euro trongtừmệnh đề. Trong trường hợp này, mỗi hàng được trả về bởi kèo bóng đá euro trở thành một hàng của bảng được xem bởi truy vấn. Ví dụ: giả sử bảng đófooCó kèo bóng đá euro nội dung giống như trên và chúng tôi nói:

Tạo chức năng getfoo (int) trả về setof foo dưới dạng $$
    Chọn * từ foo trong đó fooid = $ 1;
$$ Ngôn ngữ kèo bóng đá euro;

Chọn * từ getfoo (1) là t1;

Sau đó chúng ta sẽ nhận được:

Fooid | Foosubid | Fooname
-------+----------+---------
     1 |        1 | Joe
     1 |        2 | Ed
(2 hàng)

Cũng có thể trả về nhiều hàng với kèo bóng đá euro cột được xác định bởi kèo bóng đá euro tham số đầu ra, như thế này:

Tạo tab bảng (y int, z int);
Chèn vào các giá trị tab (1, 2), (3, 4), (5, 6), (7, 8);

Tạo chức năng sum_n_product_with_tab (x int, out sum int, out sản phẩm int)
Trả về bản ghi Setof
Như $$
    Chọn $ 1 + tab.Y, $ 1 * Tab.y từ tab;
$$ Ngôn ngữ kèo bóng đá euro;

Chọn * từ sum_n_product_with_tab (10);
 tổng | sản phẩm
-----+---------
  11 |      10
  13 |      30
  15 |      50
  17 |      70
(4 hàng)

Điểm quan trọng ở đây là bạn phải viếtreturn setof recordĐể chỉ ra rằng kèo bóng đá euro trả về nhiều hàng thay vì chỉ một. Nếu chỉ có một tham số đầu ra, hãy viết loại tham số đó thay vìRecord.

thường hữu ích khi xây dựng kết quả của một truy vấn bằng cách gọi một kèo bóng đá euro hoàn trả lại nhiều lần, với các tham số cho mỗi lần gọi đến từ các hàng liên tiếp của bảng hoặc truy vấn con. Cách ưa thích để làm điều này là sử dụngbênTừ khóa, được mô tả trongPhần 7.2.1.5. Dưới đây là một ví dụ sử dụng chức năng hoàn trả thiết lập để liệt kê kèo bóng đá euro phần tử của cấu trúc cây:

Chọn * từ các nút;
   Tên | cha mẹ
-----------+--------
 Top |
 Trẻ em 1 | Đứng đầu
 Trẻ em2 | Đứng đầu
 Trẻ em 3 | Đứng đầu
 Subchild1 | Trẻ em1
 Subchild2 | Trẻ em1
(6 hàng)

Tạo chức năng listchildren (văn bản) trả về văn bản setof dưới dạng $$
    Chọn tên từ các nút trong đó cha mẹ = $ 1
$$ Ngôn ngữ kèo bóng đá euro ổn định;

Chọn * từ listchildren ('top');
 Listchildren
--------------
 Trẻ em1
 Con2
 Trẻ em3
(3 hàng)

Chọn tên, con từ các nút, listchildren bên (tên) là con;
  Tên |   đứa trẻ
--------+-----------
 Top | Trẻ em1
 Top | Con2
 Top | Trẻ em3
 Trẻ em 1 | Subchild1
 Trẻ em 1 | Subchild2
(5 hàng)

Ví dụ này không làm bất cứ điều gì mà chúng tôi không thể làm với một sự tham gia đơn giản, nhưng trong kèo bóng đá euro tính toán phức tạp hơn, tùy chọn đưa một số công việc vào một chức năng có thể khá thuận tiện.

Hiện tại, các chức năng hoàn trả cũng có thể được gọi trong danh sách chọn của một truy vấn. Đối với mỗi hàng mà truy vấn tự tạo, bộ trả về kèo bóng đá euro được gọi và một hàng đầu ra được tạo cho mỗi phần tử của tập kết quả của kèo bóng đá euro. Tuy nhiên, lưu ý rằng khả năng này bị phản đối và có thể bị xóa trong các bản phát hành trong tương lai. Ví dụ trước cũng có thể được thực hiện với các truy vấn như sau:

chọn listchildren ('top');
 Listchildren
--------------
 Trẻ em1
 Con2
 Trẻ em3
(3 hàng)

Chọn Tên, ListChildren (Tên) từ kèo bóng đá euro nút;
  Tên | Listchildren
--------+--------------
 Top | Trẻ em1
 Top | Con2
 Top | Trẻ em3
 Trẻ em 1 | Subchild1
 Trẻ em 1 | Subchild2
(5 hàng)

Trong lần cuốiChọn, Lưu ý rằng không có hàng đầu ra nào xuất hiện choChild2, Child3, v.v. Điều này xảy ra vìListchildrenTrả về một tập trống cho kèo bóng đá euro đối số đó, do đó không có hàng kết quả nào được tạo. Đây là hành vi tương tự như chúng ta có từ một kết quả tham gia vào chức năng khi sử dụngbênCú pháp.

Lưu ý:Nếu lệnh cuối cùng của kèo bóng đá euro làChèn, Cập nhậthoặcXóavớiTrở về, lệnh đó sẽ luôn được thực thi để hoàn thành, ngay cả khi kèo bóng đá euro không được khai báo vớisetofHoặc truy vấn gọi không tìm nạp tất cả kèo bóng đá euro hàng kết quả. Bất kỳ hàng bổ sung nào được tạo ra bởiTrở về39570_39712

Lưu ý:Vấn đề chính với việc sử dụng kèo bóng đá euro chức năng trả lại cài đặt trong danh sách chọn, thay vìtừmệnh đề, là việc đặt nhiều hơn một chức năng hoàn trả lại trong cùng một danh sách chọn không hoạt động rất hợp lý. .bênCú pháp tạo ra kết quả ít đáng ngạc nhiên hơn khi gọi nhiều chức năng trả lại đã đặt và thường được sử dụng thay thế.

36.4.9.kèo bóng đá eurochức năng trả vềBảng

Có một cách khác để khai báo một kèo bóng đá euro là trả về một tập hợp, đó là sử dụng cú phápBảng trả về (cột). Điều này tương đương với việc sử dụng một hoặc nhiềuouttham số cộng với đánh dấu kèo bóng đá euro là trả vềSETOF Record(hoặcsetofLoại tham số đầu ra duy nhất, nếu phù hợp). Ký hiệu này được chỉ định trong các phiên bản gần đây của tiêu chuẩn kèo bóng đá euro và do đó có thể di động hơn so với sử dụngsetof.

Ví dụ: ví dụ tổng hợp và sản phẩm trước đó cũng có thể được thực hiện theo cách này:

Tạo chức năng sum_n_product_with_tab (x int)
Trả về bảng (tổng int, sản phẩm int) là $$
    Chọn $ 1 + tab.Y, $ 1 * Tab.y từ tab;
$$ Ngôn ngữ kèo bóng đá euro;

Không được phép sử dụng rõ ràngouthoặcInouttham số vớiBẢNG TRẢ LẠIKý hiệu - Bạn phải đặt tất cả kèo bóng đá euro cột đầu ra vàoBảngDanh sách.

36.4.10. Đa hìnhkèo bóng đá eurochức năng

kèo bóng đá eurokèo bóng đá euro chức năng có thể được khai báo để chấp nhận và trả về kèo bóng đá euro loại đa hìnhAnyEuity, AnyArray, Anynonarray, AnyenumAnyrange. Nhìn thấyPhần 36.2.5Để giải thích chi tiết hơn về các kèo bóng đá euro đa hình. Đây là một kèo bóng đá euro đa hìnhmake_arrayxây dựng một mảng từ hai yếu tố kiểu dữ liệu tùy ý:

42438_42706

Lưu ý việc sử dụng typecast'A' :: TextĐể chỉ định rằng đối số thuộc loạiText. Điều này là bắt buộc nếu đối số chỉ là một chuỗi theo nghĩa đen, vì nếu không nó sẽ được coi là loạikhông xác địnhvà mảngkhông xác địnhkhông phải là loại hợp lệ. Không có typecast, bạn sẽ gặp lỗi như thế này:

Lỗi: Không thể xác định loại đa hình vì đầu vào có loại "không xác định"

Nó được phép có kèo bóng đá euro đối số đa hình với một loại trả về cố định, nhưng không. Ví dụ:

43380_43780

Đa hình có thể được sử dụng với các kèo bóng đá euro có đối số đầu ra. Ví dụ:

Tạo chức năng DUP (F1 AnyEuity, Out F2 AnyEuity, Out F3 AnyArray)
Như 'chọn $ 1, mảng [$ 1, $ 1]' ngôn ngữ kèo bóng đá euro;

Chọn * từ DUP (22);
 f2 |   F3
----+---------
 22 | 22,22

đa hình cũng có thể được sử dụng với các kèo bóng đá euro variadic. Ví dụ:

44181_44686

36.4.11.kèo bóng đá euroChức năng với kèo bóng đá euro đối chiếu

44854_45056Phần 23.2. Nếu một đối chiếu được xác định thành công (nghĩa là, không có xung đột nào của kèo bóng đá euro đối chiếu ngầm giữa kèo bóng đá euro đối số) thì tất cả kèo bóng đá euro tham số có thể lấy được được coi là có sự hợp tác đó ngầm. Điều này sẽ ảnh hưởng đến hành vi của kèo bóng đá euro hoạt động nhạy cảm đối chiếu trong chức năng. Ví dụ: sử dụngAnyleastkèo bóng đá euro được mô tả ở trên, kết quả của

Chọn AnyLeast ('ABC' :: Text, 'ABC');

sẽ phụ thuộc vào đối chiếu mặc định của cơ sở dữ liệu. TRONGCLocale Kết quả sẽ làABC, nhưng ở nhiều địa phương khác, nó sẽ làABC. Việc đối chiếu để sử dụng có thể bị ép buộc bằng cách thêm mộtđối chiếumệnh đề cho bất kỳ đối số nào, ví dụ

Chọn AnyLeast ('ABC' :: Text, 'ABC' đối chiếu "C");

Ngoài ra, nếu bạn muốn một chức năng hoạt động với một đối chiếu cụ thể bất kể nó được gọi là gì, chènđối chiếukèo bóng đá euro điều khoản khi cần thiết trong định nghĩa chức năng. Phiên bản này củaAnyleastsẽ luôn sử dụngen_usLocale để so sánh kèo bóng đá euro chuỗi:

Tạo chức năng AnyLeast (Variadic AnyArray) Trả về AnyEuity là $$
    Chọn tối thiểu ($ 1 [i] đối chiếu "en_us") từ Generate_subscripts ($ 1, 1) g (i);
$$ Ngôn ngữ kèo bóng đá euro;

Nhưng lưu ý rằng điều này sẽ gây ra lỗi nếu được áp dụng cho kiểu dữ liệu không thể thu được.

Nếu không có đối chiếu chung nào có thể được xác định trong số các đối số thực tế, thì kèo bóng đá euro SQL coi các tham số của nó là có đối chiếu mặc định của các loại dữ liệu (thường là đối chiếu mặc định của cơ sở dữ liệu, nhưng có thể khác nhau đối với các tham số của các loại miền).

Hành vi của kèo bóng đá euro tham số có ghép có thể được coi là một dạng đa hình giới hạn, chỉ áp dụng cho kèo bóng đá euro loại dữ liệu văn bản.