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

33.4. Truy vấn kèo chấp bóng đá hôm nay ngữ (kèo chấp bóng đá hôm nay) Chức kèo chấp bóng đá hôm nay

kèo chấp bóng đá hôm nay SQL thực thi danh sách các câu lệnh SQL 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"của 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 chấp bóng đá hôm nay 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, kèo chấp bóng đá hôm nay chức năng có thể được tuyên bố để trả về một tập hợp, bằng cách chỉ định Loại trả về của chức năng 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 chấp bóng đá hôm nay được trả lại. Thông tin chi tiết khác xuất hiện dưới.

Cơ thể của kèo chấp bóng đá hôm nay SQL phải là danh sách các câu lệnh SQL 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 kèo chấp bóng đá hôm nay đượ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 chấp bóng đá hôm nayNgôn ngữ có thể được đóng gói cùng nhau và được định nghĩa là một kèo chấp bóng đá hôm nay. Bên cạnh đóChọnkèo chấp bóng đá hôm nay, các lệnh có thể bao gồm các kèo chấp bóng đá hôm nay sửa đổi dữ liệu (Chèn, Cập nhậtXóa), như cũng như các lệnh kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm naykèo chấp bóng đá hôm nay.) 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 kèo chấp bóng đá hôm nay. Ngoài ra, nếu bạn muốn xác định chức năng 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 chấp bóng đá hôm nay cơ thể không được kết thúc bằng mộtChọn. Vì Ví dụ, chức kèo chấp bóng đá hôm nay này loại bỏ các hàng có mức lương âm từ TheEMPBả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 chấp bóng đá hôm nay;

Chọn Clean_emp ();

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

(1 hàng)

Cú pháp củaTạo chức kèo chấp bóng đá hôm naylệnh yêu cầu cơ thể chức kèo chấp bóng đá hôm nay đượ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 chấp bóng đá hôm nay (xemPhần 4.1.2.1).

Đối số cho kèo chấp bóng đá hôm nay SQL được tham chiếu trong kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm nay 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);

33.4.1.kèo chấp bóng đá hôm nayCác chức kèo chấp bóng đá hôm nay trên các loại cơ sở

đơn giản nhất có thểkèo chấp bóng đá hôm naykèo chấp bóng đá hôm nay 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 kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm nay 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 kèo chấp bóng đá hôm nay cơ thể cho kết quả của kèo chấp bóng đá hôm nay (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 chấp bóng đá hôm nay. Do đó, kết quả được dán nhãnmộtthay vìresult.

Nó gần như dễ dàng xác địnhkèo chấp bóng đá hôm nayCác chức năng 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 kèo chấp bóng đá hôm nay là$ 1$ 2.

tạo kèo chấp bóng đá hôm nay 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 kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm nay 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ữ SQL;

Người dùng có thể thực thi chức kèo chấp bóng đá hôm nay 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ừ kèo chấp bóng đá hôm nay hơn là hằng số 1, do đó có nhiều khả năng Định nghĩa là

Tạo kèo chấp bóng đá hôm nay 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ữ SQL;

Điều chỉnh số dư và trả về số dư mới.

33.4.2.kèo chấp bóng đá hôm naykèo chấp bóng đá hôm nay trên composite Loại

Khi viết các chức kèo chấp bóng đá hôm nay 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$ 1$ 2) Nhưng cũng là thuộc tính (trường) mong muốn của 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 chấp bóng đá hôm naydouble_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 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 chấp bóng đá hôm nay;

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 đố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 của 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 kèo chấp bóng đá hôm nayề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 chức năng trả về loại tổng hợp. Đây là một ví dụ về một kèo chấp bóng đá hôm nay trả về đơnEMPhàng:

Tạo kèo chấp bóng đá hôm nay 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 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 chấp bóng đá hôm nay:

  • Thứ tự danh sách chọn trong kèo chấp bóng đá hôm nay phải là chính xác 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 của loại tổng hợp hoặc bạn sẽ gặp lỗi Như thế này:

    20350_20435
    

Một cách khác để xác định cùng một kèo chấp bóng đá hôm nay là:

Tạo kèo chấp bóng đá hôm nay 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ọnTrở lại Chỉ một cột duy nhất của 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 kèo chấp bóng đá hôm nay khác trả về tổng hợp mong muốn giá trị.

Chúng ta có thể gọi chức kèo chấp bóng đá hôm nay 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 33.4.4.

Khi bạn sử dụng một kèo chấp bóng đá hôm nay 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 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 chấp bóng đá hôm nay để 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)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 chấp bóng đá hôm nay và ký hiệu thuộc tính cho phép sử dụng các chức kèo chấp bóng đá hôm nay 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 a Cột thực của 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 kèo chấp bóng đá hôm nay 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 đúng Loại hàng 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 chấp bóng đá hôm nay;

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

Vẫn còn một cách khác để sử dụng một kèo chấp bóng đá hôm nay trả về một tổng hợp Loại là gọi nó là kèo chấp bóng đá hôm nay bảng, như được mô tả trongPhần 33.4.4.

33.4.3. Chức kèo chấp bóng đá hôm nay với đầu ra Tham số

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

Tạo kèo chấp bóng đá hôm nay add_em (in x int, in y int, out sum int)
Như 'Chọn $ 1 + $ 2'
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ản24634_24642hiển thị trongPhần 33.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 chấp bóng đá hôm nay thuận tiện trả về một số cột. Ví dụ,

24908_25121

Đ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 chấp bóng đá hôm nay. 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 năng sum_n_product (int, int) trả về sum_prod
Như 'Chọn $ 1 + $ 2, $ 1 * $ 2'
Ngôn ngữ kèo chấp bóng đá hôm nay;

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 năng như vậy từ kèo chấp bóng đá hôm nay. Đ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 chấp bóng đá hôm nay 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 chấp bóng đá hôm nay cho mục đích chẳng hạn như bỏ nó. Chúng tôi có thể bỏ chức kèo chấp bóng đá hôm nay trên với hoặc của

chức kèo chấp bóng đá hôm nay thả sum_n_product (x int, y int, out sum int, out sản phẩm int);
Chức kèo chấp bóng đá hôm nay 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à một tham số đầu vào (một phần của danh sách đối số gọi) và tham số đầu ra (một phần của loại bản ghi kết quả).

33.4.4.kèo chấp bóng đá hôm nayChức kèo chấp bóng đá hôm nay dưới dạng Nguồn bảng

Tất cả các kèo chấp bóng đá hôm nay 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 chức năng được xác định để trả về một loại cơ sở, kèo chấp bóng đá hôm nay bảng tạo ra một bàn một cột. Nếu kèo chấp bóng đá hôm nay được xác định để trả về một loại tổng hợp, kèo chấp bóng đá hôm nay 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 năng getfoo (int) trả về foo dưới dạng $$
    Chọn * từ foo trong đó fooid = $ 1;
$$ Ngôn ngữ kèo chấp bóng đá hôm nay;

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 chấp bóng đá hôm nay 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 chấp bóng đá hôm nay. Đây là bởi vì chúng tôi đã không sử dụngsetof. Đó là được mô tả trong phần tiếp theo.

33.4.5.kèo chấp bóng đá hôm naychức kèo chấp bóng đá hôm nay trả về Đặt

Khi kèo chấp bóng đá hôm nay SQL được khai báo là trả vềsetofanypepe,, Chức kèo chấp bóng đá hôm nay cuối cùngChọnkèo chấp bóng đá hôm nay 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 năng này thường được sử dụng khi gọi kèo chấp bóng đá hôm nay trong Thetừmệnh đề. Trong trường hợp này mỗi hàng được trả về bởi kèo chấp bóng đá hôm nay trở thành một hàng của bảng được nhìn thấy 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 chấp bóng đá hôm nay;

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)

Hiện tại, các chức năng hoàn trả cũng có thể được gọi vào Danh sách chọn của một kèo chấp bóng đá hôm nay. Cho mỗi hàng mà kèo chấp bóng đá hôm nay tự tạo ra, bộ trả về chức năng được gọi và Một hàng đầu ra được tạo cho từng phần tử của chức năng Kết quả đặt. Tuy nhiên, lưu ý rằng khả năng 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 năng ví dụ Trả về một tập hợp từ danh sách chọn:

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 chấp bóng đá hôm nay;

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ìListchildrenTrả 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.

33.4.6. Đa hìnhkèo chấp bóng đá hôm nayChức kèo chấp bóng đá hôm nay

kèo chấp bóng đá hôm nayCác chức kèo chấp bóng đá hôm nay có thể tuyên bố chấp nhận và trả lại các loại đa hìnhAnyEuityAnyArray. Nhìn thấyPhần 33.2.5Để giải thích chi tiết hơn về đa hình chức năng. Đây là một kèo chấp bóng đá hôm nay đa hìnhmake_arrayxây dựng một mảng từ hai Các yếu tố kiểu dữ liệu tùy ý:

31262_31532

Lưu ý việc sử dụng typecast'A' :: TextĐể chỉ định rằng đối số là của 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 "AnyArray"/"AnyEuity" 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ụ:

32268_32681

đa hình có thể được sử dụng với các chức kèo chấp bóng đá hôm nay có đầu ra lập luận. 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 chấp bóng đá hôm nay;

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