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 đá c1 phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

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

Các chức năng kèo bóng đá c1 Thực hiện danh sách các câu lệnh kèo bóng đá c1 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 chức năng 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 đá c1 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 đá c1 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 đá c1 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 đá c1 đượ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 đá c1 lệnh trongkèo bóng đá c1Ngôn ngữ có thể được đóng gói cùng nhau và được định nghĩa là một kèo bóng đá c1. Bên cạnh đóChọnTruy vấn, kèo bóng đá c1 lệnh có thể bao gồm kèo bóng đá c1 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 đá c1 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, SavePointvà một số lệnh tiện ích, ví dụ:VACUUM, trongkèo bóng đá c1kèo bóng đá c1.) 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 đá c1. 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 đá c1 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 đá c1;

Chọn Clean_emp ();

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

(1 hàng)

Lưu ý:Toàn bộ phần thân của kèo bóng đá c1 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 đá c1 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 đá c1. Vì vậy, ví dụ,Tạo bảng foo (...); Chèn vào kèo bóng đá c1 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 đá c1 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 đá c1 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 đá c1 (xemPhần 4.1.2.1).

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

Đối số của kèo bóng đá c1 SQL có thể được tham chiếu trong phần thân kèo bóng đá c1 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 đá c1, 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 đá c1 đố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 đá c1 để 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 đá c1 chỉ có thể được sử dụng làm giá trị dữ liệu, 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 đá c1 giá trị MyTable ($ 1);

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

Chèn vào kèo bóng đá c1 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 đá c1 đã được thêm vàoPostgreSQL9.2. kèo bóng đá c1 chức năng được sử dụng trong kèo bóng đá c1 máy chủ cũ hơn phải sử dụng$nký hiệu.

35.4.2.kèo bóng đá c1chức năng trên kèo bóng đá c1 loại cơ sở

đơn giản nhất có thểkèo bóng đá c1kèo bóng đá c1 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 đá c1 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 đá c1 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 đá c1 cho kết quả của kèo bóng đá c1 (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 đá c1. 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 đá c1kèo bóng đá c1 chức năng lấy kèo bóng đá c1 loại cơ sở làm đối số:

Tạo kèo bóng đá c1 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 đá c1 đối số và số sử dụng:

Tạo kèo bóng đá c1 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 đá c1 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;

Một người dùng có thể thực thi chức năng này để ghi nợ tài khoản 17 bằng 100,00 đô la 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 đá c1 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 đá c1 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 đá c1 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;

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

Khi viết các kèo bóng đá c1 với các đối số của các 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 đá c1;

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 đá c1 trả về loại tổng hợp. Đây là một ví dụ về một kèo bóng đá c1 trả về mộtEMPhàng:

Tạo kèo bóng đá c1 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 đá c1 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 đá c1 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 đá c1 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 đá c1 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ẽ nhận được kèo bóng đá c1 lỗi như thế này:

    23469_23554

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

Tạo kèo bóng đá c1 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ỉ trả về 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 đá c1 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 đá c1 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 35.4.7.

Khi bạn sử dụng một kèo bóng đá c1 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 đá c1 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 đá c1;

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

35.4.4.kèo bóng đá c1kèo bóng đá c1 với tham số đầu ra

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

Tạo kèo bóng đá c1 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 35.4.2. Giá trị thực của kèo bóng đá c1 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 đá c1 chức năng trả về một số cột. Ví dụ,

26586_26793

Đ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 đá c1. 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 đá c1;

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 đá c1 tên được gắn vào kèo bóng đá c1 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 đá c1 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 đá c1. Đ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 đá c1 tham số đầu vào, nhưng được xử lý đặc biệt như mô tả tiếp theo.

35.4.5.kèo bóng đá c1kèo bóng đá c1 có số lượng đối số

kèo chấp bóng đákèo bóng đá c1 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 đá c1 đối số, miễn là tất cả"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 đá c1 dưới dạng một mảng. kèo bóng đá c1 đượ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ụ:

Tạo kèo bóng đá c1 MLEAST (Variadic Arriceric []) Trả về số là $$
    Chọn tối thiểu ($ 1 [i]) từ Generate_subscripts ($ 1, 1) g (i);
$$ Ngôn ngữ SQL;

Chọn MLEAST (10, -1, 5, 4.4);
 MLEAST 
--------
     -1
(1 hàng)

một cách hiệu quả, tất cả kèo bóng đá c1 đố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 đá c1 variadic; Điều này đặc biệt tiện dụng khi một kèo bóng đá c1 variadic muốn chuyển tham số mảng của nó cho một kèo bóng đá c1 khác. Ngoài ra, đây là cách an toàn duy nhất để gọi một kèo bóng đá c1 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 đá c1 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 đá c1.

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 đá c1 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 đá c1 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 đá c1 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 (ARR: = mảng [10, -1, 5, 4.4]);

35.4.6.kèo bóng đá c1kèo bóng đá c1 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 đá c1 đượ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 đá c1
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.

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

Tất cả các kèo bóng đá c1 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 đá c1 được xác định để trả về một loại cơ sở, kèo bóng đá c1 bảng sẽ tạo ra một bảng một cột. Nếu kèo bóng đá c1 được xác định để trả về một loại tổng hợp, kèo bóng đá c1 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 đá c1;

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 đá c1 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.

35.4.8.kèo bóng đá c1kèo bóng đá c1 chức năng trả về bộ

Khi kèo bóng đá c1 SQL được khai báo là trả vềsetofanyype, 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ó đượ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 đá c1 trongtừmệnh đề. Trong trường hợp này, mỗi hàng được trả về bởi kèo bóng đá c1 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ó cùng nội dung 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 đá c1;

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 đá c1 cột được xác định bởi kèo bóng đá c1 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 đá c1;

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 đá c1 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 kèo bóng đá c1 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 đá c1 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 đá c1 ổ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)

37630_37821

Hiện tại, các chức năng trả về 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 đá c1 đượ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 đá c1. 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 đá c1 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 đá c1 đố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 đá c1 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 đá c1 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 đá c1 hàng kết quả. Bất kỳ hàng bổ sung nào được tạo ra bởiTrở về39463_39605

Lưu ý:Vấn đề chính với việc sử dụng kèo bóng đá c1 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 trả lại được đặt 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èo bóng đá c1 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 nên được sử dụng thay thế.

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

Có một cách khác để khai báo một kèo bóng đá c1 là trả về một tập hợp, đó là sử dụng cú phápBẢNG TRẢ LẠI (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 đá c1 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 đá c1 và do đó có thể di động hơn so với sử dụngsetof.

Ví dụ, ví dụ tổng hợp 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 đá c1;

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 đá c1 cột đầu ra vàoBảngList.

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

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

42331_42599

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 đá c1 đối số đa hình với một loại trả về cố định, nhưng không. Ví dụ:

43273_43673

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

43786_43974

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

44074_44579

35.4.11.kèo bóng đá c1chức năng với kèo bóng đá c1 đối chiếu

Khi kèo bóng đá c1 SQL có một hoặc nhiều tham số của các loại dữ liệu có thể lấy được, một đối chiếu được xác định cho mỗi cuộc gọi chức năng tùy thuộc vào các đối số được gán cho các đối số thực tế, như được mô tả trongPhần 22.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 đá c1 đối chiếu ngầm giữa kèo bóng đá c1 đối số) thì tất cả kèo bóng đá c1 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 đá c1 hoạt động nhạy cảm đối chiếu trong chức năng. Ví dụ: sử dụngAnyleastkèo bóng đá c1 đượ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ếumệnh đề 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 đá c1 chuỗi:

46234_46398

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 đá c1 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 đá c1 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 đá c1 loại dữ liệu văn bản.