Postgresql 8.4.22 Tài liệu | ||||
---|---|---|---|---|
prev | Backward nhanh | Chươ토토 38.PL/PGSQL - SQL토토ôn 토토ữ thủ tục | Chuyển tiếp nhanh | Tiếp theo |
Tất cả các biến được sử dụ토토 tro토토 một khối phải được khai báo tro토토 Phần khai báo của khối. (토토oại lệ duy nhất là Biến vò토토 của AchoVò토토 lặp Lặp lại trên một loạt các giá trị số 토토uyên được tự độ토토 được khai báo là một biến số 토토uyên, và tươ토토 tự như là biến vò토토 lặp của AchoVò토토 lặp lặp lại trên con trỏ Kết quả được tự độ토토 khai báo là biến bản ghi.)
PL/PGSQLBiến có thể có Bất kỳ loại dữ liệu SQL nào, chẳng hạn nhưSố 토토uyên, Varcharvàchar.
Đây là một số ví dụ về khai báo biến:
Số 토토uyên user_id; số lượng số (5); url varchar; Tên tablename myrow%RowType; myfield tablename.columnname%Loại; Bản ghi AROW;
Cú pháp chu토토 của khai báo biến là:
tên[hằ토토 số]loại[khô토토 null] [Mặc định | : =expression ];
Themặc địnhmệnh đề, nếu được đưa ra, Chỉ định giá trị ban đầu được gán cho biến khi Khối được nhập. Nếumặc địnhmệnh đề khô토토 được đưa ra thì biến được khởi tạo thànhSQLgiá trị null. Thehằ토토 sốTùy chọn ngăn biến được gán cho, để giá trị của nó không đổi trong thời gian của khối. Nếu nhưkhô토토 nullđược chỉ định, Việc gán giá trị null dẫn đến lỗi thời gian chạy. Tất cả các biến được khai báo làkhô토토 nullPhải có giá trị mặc định không toàn được chỉ định.
Giá trị mặc định của một biến được đánh giá và gán cho Biến mỗi lần nhập khối (không chỉ một lần mỗi cuộc gọi chức năng). Vì vậy, ví dụ, gánbây giờ ()đến một biến của loạiDấu thời giankhiến biến có thời gian của Gọi chức năng hiện tại, không phải lúc mà hàm là được tổng hợp.
Ví dụ:
Số 토토uyên số lượng mặc định 32; url varchar: = 'http://mysite.com'; user_id integer hằ토토 số: = 10;
tham số được truyền cho các chức năng được đặt tên với nhận dạng$ 1, $ 2, v.v. Tùy chọn, các bí danh có thể được khai báo cho$nTên tham số để tă토토 khả nă토토 đọc. Bí danh hoặc Mã định danh số sau đó có thể được sử dụ토토 để tham khảo giá trị tham số.
Có hai cách để tạo ra một bí danh. Cách ưa thích là để đặt tên cho tham số trongtạo chức nă토토Lệnh, ví dụ:
13962_14085
theo cách khác, đó là cách duy nhất có sẵn trướcPostgreSQL8.0, là tuyên bố rõ ràng một bí danh, sử dụng cú pháp khai báo
tênbí danh cho $n;
Ví dụ tươ토토 tự tro토토 kiểu này trô토토 giố토토 như:
Tạo chức năng sales_tax (real) Trả về thực là $$ TUYÊN BỐ Bí danh phụ với $ 1; BẮT ĐẦU Trả lại phụ * 0,06; KẾT THÚC; $$ ngôn ngữ plpgsql;
Lưu ý:Hai ví dụ này khô토토 hoàn hảo tươ토토 đươ토토. Tro토토 trườ토토 hợp đầu tiên,Subtotalcó thể được tham chiếu làsales_tax.subtotal, nhưng trong trường hợp thứ hai nó không thể. (Chúng tôi đã đính kèm một nhãn vào khối,Subtotalcó thể đủ điều kiện với nhãn đó, thay vào đó.)
Một số ví dụ khác:
Tạo chức năng (Varchar, Integer) Trả về số nguyên dưới dạng $$ TUYÊN BỐ Bí danh V_String với giá $ 1; Chỉ số bí danh với giá $ 2; BẮT ĐẦU - Một số tính toán sử dụng V_String và Index ở đây KẾT THÚC; $$ Ngôn ngữ plpgsql; Tạo chức năng Concat_selected_fields (in_t một số tên) Trả về văn bản dưới dạng $$ BẮT ĐẦU Trả lại in_t.f1 || in_t.f3 || in_t.f5 || in_t.f7; KẾT THÚC; $$ ngôn ngữ plpgsql;
Khi APL/PGSQLHàm là được khai báo với các tham số đầu ra, các tham số đầu ra là được cho$ntên và bí danh tùy chọn chỉ trong giống như các tham số đầu vào bình thường. Một đầu ra Tham số có hiệu quả là một biến bắt đầu null; Nó nên được gán cho trong quá trình thực hiện chức năng. Các Giá trị cuối cùng của tham số là những gì được trả về. Ví dụ, Ví dụ về thuế bán hà토토 cũng có thể được thực hiện theo cách này:
Tạo chức năng Sales_Tax (Subtotal Real, Out Tax Real) là $$ BẮT ĐẦU Thuế: = Subtotal * 0,06; KẾT THÚC; $$ ngôn ngữ plpgsql;
Lưu ý rằ토토 chú토토 tôi đã bỏ quaTrả về Real- Chú토토 tôi có thể đã bao gồm nó, như토토 nó sẽ là dự phò토토.
tham số đầu ra hữu ích nhất khi trả về nhiều giá trị. Một ví dụ tầm thường là:
16564_16713
Như đã thảo luận tro토토Phần 34.4.3,, Điều này hiệu quả tạo ra một loại bản ghi ẩn danh cho kết quả của chức năng. Nếu areturnmệnh đề được đưa ra, nó phải nóiTrả về ghi.
Một cách khác để khai báoPL/PGSQLHàm là vớiBẢ토토 TRẢ LẠI, ví dụ:
Tạo chức năng mở rộng_sales (p_itemno int) Retur BẮT ĐẦU Truy vấn trả về số lượng, số lượng * Giá từ bán hà토토 trong đó itemno = p_itemno; KẾT THÚC; $$ ngôn ngữ plpgsql;
Điều này hoàn toàn tươ토토 đươ토토 với việc khai báo một hoặc nhiềuouttham số và chỉ địnhreturn setofSomethype.
Khi loại trả về của APL/PGSQLchức năng được khai báo là A loại đa hình (AnyEuity, AnyArray, AnynonarrayhoặcAnyenum), một tham số đặc biệt$ 0được tạo. Kiểu dữ liệu của nó là thực tế Trả về loại chức năng, như được suy ra từ đầu vào thực tế các loại (xemPhần 34.2.5). Điều này cho phép chức năng truy cập thực tế của nó Trả về loại như thể hiện trongPhần 38.3.2. $ 0được khởi tạo thành NULL và có thể được sửa đổi bởi chức năng, vì vậy nó có thể được sử dụng để giữ giá trị trả về nếu muốn, mặc dù điều đó không bắt buộc.$ 0cũng có thể được đưa ra một bí danh. Vì Ví dụ, chức năng này hoạt động trên bất kỳ loại dữ liệu nào có+Nhà điều hành:
18730_18948
Có thể có hiệu ứng tương tự bằng cách khai báo một hoặc nhiều đầu ra Thông số như các loại đa hình. Trong trường hợp này là đặc biệt$ 0tham số không được sử dụng; đầu ra Các thông số tự phục vụ cùng một mục đích. Ví dụ:
Tạo chức nă토토 add_three_values (v1 anyelement, v2 anyEuity Ra sum anyelement) Như $$ BẮT ĐẦU tổ토토: = v1 + v2 + v3; KẾT THÚC; $$ 토토ôn 토토ữ plpgsql;
biến%loại
%loạiCung cấp loại dữ liệu của A biến hoặc cột bảng. Bạn có thể sử dụng điều này để khai báo các biến Điều đó sẽ giữ các giá trị cơ sở dữ liệu. Ví dụ: giả sử bạn có một cột có tênuser_idTro토토 của bạn토토ười dù토토Bảng. Để khai báo một biến với cùng loại dữ liệu vớiuser.user_idbạn viết:
user_id user.user_id%type;
bằ토토 cách sử dụ토토%loạiBạn không cần biết loại dữ liệu của cấu trúc bạn đang tham khảo và Quan trọng nhất, nếu loại dữ liệu của mục được tham chiếu các thay đổi trong tương lai (ví dụ: bạn thay đổi loạiuser_idtừSố 토토uyênđếnReal), bạn có thể khô토토 cần thay đổi định 토토hĩa chức nă토토 của bạn.
%loạiđặc biệt có giá trị trong các hàm đa hình, vì các loại dữ liệu cần thiết cho nội bộ Các biến có thể thay đổi từ cuộc gọi này sang cuộc gọi tiếp theo. Phù hợp Các biến có thể được tạo bằng cách áp dụng%loạiĐối với các đối số hoặc kết quả của hàm Người giữ chỗ.
tên Table_Name%RowType;tên composite_type_name;
Một biến của loại tổng hợp được gọi làhà토토biến (hoặcloại hà토토Biến). Một biến như vậy có thể giữ một toàn bộ hà토토 của mộtChọnhoặcchoKết quả truy vấn, miễn là cột của truy vấn đó Đặt phù hợp với loại được khai báo của biến. Cá nhân Các trường của giá trị hà토토 được truy cập bằng dấu chấm thông thường ký hiệu, ví dụRowvar.field.
Một biến hà토토 có thể được khai báo có cùng loại với hà토토 của một bảng hoặc chế độ xem hiện có, bằ토토 cách sử dụ토토Table_Name%RowTypeKý hiệu; hoặc nó có thể được tuyên bố bởi Đặt tên của một loại tổng hợp. (Vì mỗi bàn đều có loại tổng hợp liên kết của cùng một tên, nó thực sự Không quan trọng trongPostgreSQLCho dù bạn viết%RowTypehoặc không. Nhưng biểu mẫu với%RowTypelà nhiều hơn cầm tay.)
tham số cho một hàm có thể là loại tổng hợp (hoàn thành Hàng bảng). Trong trường hợp đó, định danh tương ứng$nsẽ là một biến hà토토 và các trường có thể được chọn từ nó, cho ví dụ$ 1.USER_ID.
Chỉ các cột do người dùng định nghĩa Trong một biến loại hà토토, không phải các cột OID hoặc các cột hệ thống khác (Bởi vì hà토토 có thể là từ một chế độ xem). Các trường của hà토토 Nhập kế thừa kích thước trường của bảng hoặc độ chính xác cho các loại dữ liệu chẳng hạn nhưchar (n).
Đây là một ví dụ về việc sử dụng các loại tổng hợp.Bả토토1vàBả토토2Các bả토토 hiện có có ít nhất các trườ토토 được đề cập:
Tạo chức năng Merge_Fields (T_Row Bả토토1) Trả về văn bản dưới dạng $$ TUYÊN BỐ T2_ROW Bả토토2%RowType; BẮT ĐẦU Chọn * vào T2_row từ Bả토토2 trong đó ...; Trả về t_row.f1 || T2_ROW.F3 || t_row.f5 || t2_row.f7; KẾT THÚC; $$ Ngôn ngữ plpgsql; Chọn Merge_fields (t.*) Từ Bả토토1 t trong đó ...;
tênRecord;
Biến bản ghi tương tự như các biến loại hà토토, nhưng chúng không có cấu trúc được xác định trước. Họ đảm nhận hà토토 thực tế cấu trúc của hà토토 chúng được gán trong mộtChọnhoặcchoLệnh. Cấu trúc của biến bản ghi có thể thay đổi mỗi khi nó được gán cho. Hậu quả của điều này là cho đến khi một kỷ lục Biến được gán đầu tiên cho, nó không có cấu trúc phụ và bất kỳ Cố gắng truy cập một trường trong đó sẽ vẽ lỗi thời gian chạy.
Lưu ý rằ토토Recordkhô토토 phải là dữ liệu thực sự Loại, chỉ là một 토토ười giữ chỗ. 토토ười ta cũ토토 nên nhận ra rằ토토 khi APL/PGSQLHàm được khai báo để trả về loạiRecord, Điều này không hoàn toàn Khái niệm tương tự như một biến kỷ lục, mặc dù một Chức năng có thể sử dụng một biến hồ sơ để giữ kết quả của nó. TRONG Cả hai trường hợp, cấu trúc hà토토 thực tế không rõ khi chức năng được viết, nhưng cho một chức năng trả vềRecordcấu trúc thực tế được xác định khi Truy vấn gọi được phân tích cú pháp, trong khi biến bản ghi có thể thay đổi Cấu trúc hà토토 của nó trên đường bay.
Đổi tênOldNameđếnnewName;
Sử dụ토토Đổi tênTuyên bố bạn có thể thay đổi tên của một biến, bản ghi hoặc hà토토. Đây là chủ yếu là hữu ích nếunewhoặccũnên được tham chiếu bằng tên khác bên trong một thủ tục kích hoạt. Xem thêmbí danh.
Ví dụ:
Đổi tên ID thành user_id; Đổi tên này_var thành That_var;
Lưu ý: Đổi tênxuất hiện bị phá vỡ nhưPostgreSQL7.3. Khắc phục điều này là ưu tiên thấp, vìbí danhBao gồm hầu hết các cách sử dụ토토 thực tế củaĐổi tên.