Postgresql 8.3.23 Tài liệu | ||||
---|---|---|---|---|
prev | Backward nhanh | Chương 34. Mở rộngkèo bóng đá pháp | Chuyển tiếp nhanh | Tiếp theo |
Hàm kèo bóng đá pháp thực thi danh sách các câu lệnh kèo bóng đá pháp tùy ý, Trả lại kết quả của truy vấn cuối cùng trong danh sách. Trong đơn giản (không đặt) trường hợp, hàng đầu tiên của kết quả truy vấn cuối cùng sẽ là trả lại. (Hãy nhớ rằng"Đầu tiên hàng ngang"kèo bóng đá pháp kết quả đa dòng không được xác định rõ ràng trừ khi bạn sử dụngĐặt hàng bởi.) Nếu kèo bóng đá pháp 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, SQL chức kèo bóng đá pháp có thể được khai báo để trả về một tập hợp, bằng cách chỉ định Loại trả về của chức kèo bóng đá pháp làsetofanypepe. Trong trường hợp này, tất cả các hàng của Kết quả cuối cùng của kèo bóng đá pháp được trả lại. Thông tin chi tiết khác xuất hiện dưới.
Cơ thể của hàm kèo bóng đá pháp phải là danh sách các câu lệnh kèo bóng đá pháp tách biệt bởi dấu chấm phẩy. Một dấu chấm phẩy sau tuyên bố cuối cùng là không bắt buộc. Trừ khi hàm được tuyên bố trả lạivoid, Câu lệnh cuối cùng phải làChọn.
Bất kỳ bộ sưu tập lệnh nào trongkèo bóng đá phápkèo bóng đá pháp ngữ có thể được đóng gói cùng nhau và được định nghĩa là một hàm. Bên cạnh đóChọnkèo bóng đá pháp, các lệnh có thể bao gồm các kèo bóng đá pháp sửa đổi dữ liệu (Chèn, Cập nhậtvàXóa), như cũng như các lệnh kèo bóng đá pháp khác. (Ngoại lệ duy nhất là bạn Không thể đặtBắt đầu, cam kết, rollbackhoặcSavePointlệnh thành Akèo bóng đá phápHàm.) Tuy nhiên, Lệnh cuối cùng phải làChọnĐiều đó Trả về bất cứ điều gì được chỉ định là loại trả về của hàm. Ngoài ra, nếu bạn muốn xác định chức kèo bóng đá pháp SQL thực hiện hành động nhưng không có giá trị hữu ích để trả lại, bạn có thể định nghĩa nó là Trở vềvoid. Trong trường hợp đó, chức kèo bóng đá pháp cơ thể không được kết thúc bằng mộtChọn. Vì Ví dụ, chức kèo bóng đá pháp này loại bỏ các hàng có mức lương âm từ TheEMPBảng:
Tạo chức kèo bóng đá pháp Clean_emp () trả về void As ' Xóa khỏi EMP Trong đó tiền lương <0; 'Ngôn ngữ SQL; Chọn Clean_emp (); Clean_emp ----------- (1 hàng)
Cú pháp kèo bóng đá phápTạo chức kèo bóng đá phápLệnh yêu cầu cơ thể chức kèo bóng đá pháp được viết dưới dạng chuỗi không thay đổi. Thường thuận tiện nhất khi sử dụng báo giá đô la (nhìn thấyPhần 4.1.2.2) cho hằng số chuỗi. Nếu bạn chọn sử dụng Cú pháp không đổi chuỗi một chuỗi được trích xuất thông thường, bạn phải tăng gấp đôi dấu ngoặc đơn (') và dấu gạch chéo ngược (\) (Giả sử cú pháp chuỗi thoát) trong phần thân của chức kèo bóng đá pháp (xemPhần 4.1.2.1).
Đối số cho hàm kèo bóng đá pháp được tham chiếu trong hàm cơ thể sử dụng cú pháp$n: $ 1đề cập đến Đối với đối số đầu tiên,$ 2đến lần thứ hai, Và như vậy. Nếu một đối số thuộc loại tổng hợp, thì dấu chấm ký hiệu, ví dụ:$ 1.name, có thể được sử dụng để Các thuộc tính kèo bóng đá pháp cập của đối số. Các đối số chỉ có thể được sử dụng như giá trị dữ liệu, không phải là định danh. Vì vậy, ví dụ đây là hợp lý:
Chèn vào các giá trị MyTable ($ 1);
Nhưng điều này sẽ không hoạt động:
Chèn vào các giá trị $ 1 (42);
đơn giản nhất có thểkèo bóng đá phápHàm không có đối số và chỉ cần trả về một loại cơ sở, như vậy BẰNGSố nguyên:
Tạo hàm một () trả về số nguyên dưới dạng $$ Chọn 1 kết quả; $$ Ngôn ngữ kèo bóng đá pháp; - Cú pháp thay thế cho chuỗi theo nghĩa đen: Tạo hàm một () trả về số nguyên là ' Chọn 1 kết quả; 'Ngôn ngữ kèo bóng đá pháp; 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 hàm cơ thể cho kết quả kèo bóng đá pháp hàm (với tênresult), nhưng bí danh cột này không hiển thị bên ngoài chức kèo bóng đá pháp. 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 đá phápCác chức kèo bóng đá pháp lấy các loại cơ sở làm lập luận. Trong ví dụ dưới đây, hãy chú ý cách chúng tôi đề cập đến Đối số trong hàm là$ 1và$ 2.
Tạo hàm add_em (số nguyên, số nguyên) trả về số nguyên dưới dạng $$ Chọn $ 1 + $ 2; $$ Ngôn ngữ kèo bóng đá pháp; Chọn add_em (1, 2) làm câu trả lời; trả lời -------- 3
Đây là một chức kèo bóng đá pháp hữu ích hơn, có thể được sử dụng để ghi nợ Tài khoản ngân hàng:
Tạo hàm TF1 (Số nguyên, Số) Trả về Số nguyên là $$ Cập nhật ngân hàng Đặt số dư = Số dư - $ 2 Trong đó tài khoản = $ 1; Chọn 1; $$ Ngôn ngữ kèo bóng đá pháp;
Người dùng có thể thực thi chức kèo bóng đá pháp này để ghi nợ tài khoản 17 bằng cách $ 100,00 như sau:
Chọn TF1 (17, 100.0);
Trong thực tế, người ta có thể muốn một kết quả hữu ích hơn từ hàm hơn là hằng số 1, do đó có nhiều khả kèo bóng đá pháp Định nghĩa là:
Tạo hàm TF1 (Số nguyên, số) Trả về số là $$ Cập nhật ngân hàng Đặt số dư = Số dư - $ 2 Trong đó tài khoản = $ 1; Chọn số dư từ ngân hàng nơi tài khoản = $ 1; $$ Ngôn ngữ kèo bóng đá pháp;
Điều chỉnh số dư và trả về số dư mới.
Khi viết các chức kèo bóng đá pháp với các đối số của các loại tổng hợp, chúng tôi
không chỉ chỉ định đối số nào chúng ta muốn (như chúng ta đã làm ở trên
với$ 1và$ 2) Nhưng cũng là thuộc tính (trường) mong muốn kèo bóng đá pháp
lập luận đó. 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
bàn. Đây là một chức kèo bóng đá phápdouble_salary
Điều đó tính toán những gì ai đó
Mức lương sẽ là 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ủ ); Tạo chức kèo bóng đá pháp double_salary (EMP) trả về số là $$ Chọn $ 1.Salary * 2 làm tiền lương; $$ Ngôn ngữ SQL; 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 kèo bóng đá pháp đối số Giá trị hàng. Cũng chú ý cách gọiChọnLệnh sử dụng*Để chọn toàn bộ hàng hiện tại kèo bóng đá pháp bảng làm tổng hợp giá trị. Hàng bảng có thể được tham chiếu thay thế chỉ bằng cách sử dụ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 bối rối.
Đôi khi thật tiện dụng khi xây dựng một đối số tổng hợp giá trị trên đường bay. Điều này có thể được thực hiện vớihàngXây dựng. Ví dụ, chúng tôi có thể điều chỉnh dữ liệu được truyền đến chức kèo bóng đá pháp:
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 chức kèo bóng đá pháp trả về loại tổng hợp. Đây là một ví dụ về một hàm trả về đơnEMPhàng:
Tạo hàm 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ữ kèo bóng đá pháp;
Trong ví dụ này, chúng tôi đã chỉ định từng thuộc tính với giá trị không đổi, nhưng bất kỳ tính toán nào cũng có thể được thay thế cho các hằng số này.
Lưu ý hai điều quan trọng về việc xác định chức kèo bóng đá pháp:
Thứ tự danh sách chọn trong kèo bóng đá pháp phải chính xác là Giống như cái trong đó các cột xuất hiện trong bảng liên kết với loại tổng hợp. (Đặt tên các cột, như Chúng tôi đã làm ở trên, không liên quan đến hệ thống.)
Bạn phải đánh máy các biểu thức để khớp với Định nghĩa kèo bóng đá pháp loại tổng hợp hoặc bạn sẽ gặp lỗi Như thế này:
Lỗi: Hàm tuyên bố trả về EMP trả về Varchar thay vì văn bản tại cột 1
Một cách khác để xác định cùng một hàm là:
Tạo hàm new_emp () trả về emp là $$ Chọn Hàng ('Không', 1000.0, 25, '(2,2)') :: Emp; $$ Ngôn ngữ kèo bóng đá pháp;
Ở đây chúng tôi đã viết AChọnTrở lại Chỉ một cột duy nhất kèo bóng đá pháp loại tổng hợp chính xác. Đây không phải là 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 hàm khác trả về tổng hợp mong muốn giá trị.
Chúng ta có thể gọi chức kèo bóng đá pháp này trực tiếp trong một trong hai cách:
Chọn new_emp (); new_emp ------------------------------ (Không, 1000.0,25, "(2,2)") 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 34.4.4.
Khi bạn sử dụng một hàm 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ả kèo bóng đá pháp 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 cần thiết để giữ cho trình phân tích cú pháp khỏi bối rối. 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 "." tại nhân vật 17 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 kèo bóng đá pháp để trích xuất một thuộc tính. Cách đơn giản để giải thích điều này là chúng ta có thể sử dụng Các ký hiệuthuộc tính (bảng)vàBảng.Attributionthay thế cho nhau.
chọn Tên (new_emp ()); tên ------ Không có
- Điều này giống như: - Chọn emp.Name với tư cách là thanh niên từ emp ở nơi emp.age <30; Chọn Tên (EMP) làm trẻ từ EMP nơi Age (EMP) <30; thanh niên ----------- Sam Andy
Tip:Sự tương đương giữa ký hiệu chức kèo bóng đá pháp và ký hiệu thuộc tính cho phép sử dụng các chức kèo bóng đá pháp Trên các loại tổng hợp để mô phỏng"Được tính toán các trường ". Ví dụ: sử dụng Định nghĩa trước chodouble_salary (emp), chúng ta có thể viết
Chọn emp.name, emp.double_salary từ EMP;Một ứng dụng sử dụng điều này sẽ không cần phải trực tiếp nhận thức được rằngdouble_salarykhông phải là a Cột thực kèo bóng đá pháp bảng. (Bạn cũng có thể mô phỏng tính toán các trường có chế độ xem.)
Một cách khác để sử dụng hàm trả về loại tổng hợp là để chuyển kết quả cho một chức kèo bóng đá pháp khác chấp nhận đúng Loại hàng làm đầu vào:
Tạo chức kèo bóng đá pháp getName (EMP) Trả về văn bản dưới dạng $$ Chọn $ 1.name; $$ Ngôn ngữ SQL; Chọn getName (new_emp ()); GetName --------- Không có (1 hàng)
Vẫn là một cách khác để sử dụng một hàm trả về một tổng hợp Loại là gọi nó là hàm bảng, như được mô tả trongPhần 34.4.4.
Một cách khác để mô tả kết quả kèo bóng đá pháp hàm là Xác định nó vớitham số đầu ra, như Trong ví dụ này:
Tạo hàm add_em (in x int, in y int, out sum int) Như 'Chọn $ 1 + $ 2' Ngôn ngữ kèo bóng đá pháp; 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 34.4.1. Giá trị thực của các tham số đầu ra là chúng cung cấp cách xác định các chức kèo bóng đá pháp thuận tiện trả về một số cột. Ví dụ,
24910_25123
Đ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ả kèo bóng đá pháp hàm. Các 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 kèo bóng đá pháp sum_n_product (int, int) trả về sum_prod Như 'Chọn $ 1 + $ 2, $ 1 * $ 2' Ngôn ngữ SQL;
Nhưng không phải bận tâm với loại tổng hợp riêng biệt Định nghĩa thường tiện dụng.
Lưu ý rằng các tham số đầu ra không được bao gồm trong Gọi danh sách đối số khi gọi một chức kèo bóng đá pháp 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ức kèo bóng đá pháp Gọi chữ ký. Điều đó cũng có nghĩa là chỉ có đầu vào tham số quan trọng khi tham chiếu chức kèo bóng đá pháp cho mục đích chẳng hạn như bỏ nó. Chúng tôi có thể bỏ chức kèo bóng đá pháp trên với hoặc của
chức kèo bóng đá pháp thả sum_n_product (x int, y int, out sum int, out sản phẩm int); Chức kèo bóng đá pháp thả sum_n_product (int, int);
tham số có thể được đánh dấu làin(The mặc định),OUThoặcInout. MỘTInouttham số đóng vai trò là tham số đầu vào (một phần kèo bóng đá pháp danh sách đối số gọi) và tham số đầu ra (một phần kèo bóng đá pháp loại bản ghi kết quả).
Tất cả các hàm kèo bóng đá pháp 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 kèo bóng đá pháp trả về các loại tổng hợp. Nếu chức kèo bóng đá pháp được xác định để trả về một loại cơ sở, hàm bảng tạo ra một bàn một cột. Nếu hàm được xác định để trả về một loại tổng hợp, hàm bảng tạo ra một cột cho mỗi 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 kèo bóng đá pháp getfoo (int) trả về foo dưới dạng $$ Chọn * từ foo trong đó fooid = $ 1; $$ Ngôn ngữ SQL; 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 chức kèo bóng đá pháp 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 kèo bóng đá pháp. Đây là bởi vì chúng tôi đã không sử dụngsetof. Đó là được mô tả trong phần tiếp theo.
Khi hàm kèo bóng đá pháp được khai báo là trả vềsetofanypepe,, Chức kèo bóng đá pháp cuối cùngChọnkèo bóng đá pháp là được thực hiện để hoàn thành và mỗi hàng nó xuất ra một phần tử của tập kết quả.
Tính kèo bóng đá pháp này thường được sử dụng khi gọi chức kèo bóng đá pháp trong Thetừmệnh đề. Trong trường hợp này mỗi hàng được trả về bởi hàm trở thành một hàng của bảng được nhìn thấy bởi kèo bóng đá pháp. 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 kèo bóng đá pháp getfoo (int) trả về setof foo dưới dạng $$ Chọn * từ foo trong đó fooid = $ 1; $$ Ngôn ngữ SQL; 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 các cột được xác định bởi các tham số đầu ra, như thế này:
29332_29498
Điểm quan trọng ở đây là bạn phải viếtreturn SetOf Recordđể chỉ ra rằng Hàm trả về nhiều hàng thay vì chỉ một. Nếu có Chỉ có một tham số đầu ra, hãy viết loại tham số đó thay thế kèo bóng đá phápRecord.
Hiện tại, các bộ trả về các chức kèo bóng đá pháp cũng có thể được gọi vào Danh sách chọn của một truy vấn. Cho mỗi hàng mà truy vấn tự tạo ra, bộ trả về chức kèo bóng đá pháp được gọi và Một hàng đầu ra được tạo cho từng phần tử của chức kèo bóng đá pháp Kết quả đặt. Tuy nhiên, lưu ý rằng khả kèo bóng đá pháp này không được chấp nhận và có thể được loại bỏ trong các bản phát hành trong tương lai. Sau đây là một chức kèo bóng đá pháp ví dụ Trả về một tập hợp từ danh sách chọn:
Tạo chức kèo bóng đá pháp 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ữ SQL; 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) Chọn listchildren ('top'); Listchildren -------------- Trẻ em1 Con2 Trẻ em3 (3 hàng) Chọn Tên, ListChildren (Tên) từ các 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
Hàng đầu ra xuất hiện choChild2,
Child3, v.v. Điều này xảy ra vìListchildren
Trả về một bộ trống
Đối với các đối số đó, vì vậy không có hàng kết quả nào được tạo.
kèo bóng đá phápCác chức kèo bóng đá pháp có thể
tuyên bố chấp nhận và trả lại các loại đa hìnhAnyEuity, AnyArray,
AnynonarrayvàAnyenum. Nhìn thấyPhần
34.2.5Để giải thích chi tiết hơn về đa hình
chức kèo bóng đá pháp. Đây là một hàm đa hìnhmake_array
xây dựng một mảng từ hai
Các yếu tố kiểu dữ liệu tùy ý:
31957_32227
Lưu ý việc sử dụng typecast'A' :: TextĐể chỉ định rằng đối số là kèo bóng đá pháp kiểuText. Đ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 thì nó sẽ là được coi là loạikhông xác địnhvà mảngkhông xác địnhkhông phải là loại hợp lệ. Mà 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ó các đối số đa hình với một cố định Loại trở lại, nhưng Converse thì không. Ví dụ:
32951_33353
Đa hình có thể được sử dụng với các chức kèo bóng đá pháp có đầu ra lập luận. Ví dụ:
33479_33669