tác giả:Roberto Mello (
<rmello@fslc.usu.edu
)
Phần này giải thích sự khác biệt giữa PL/SQL và của kèo bóng đá euroPostgreSQL'sPL/PGSQLNgôn ngữ với hy vọng giúp đỡ Nhà phát triển ứng dụng cổng từ kèo bóng đá euro đếnPostgreSQL. Hầu hết các mã ở đây là từ Thearsdigita Mô -đun ClickStreammà tôi đã chuyển sangPostgreSQLKhi tôi thực tập vớiOpenForce Inc.Vào mùa hè năm 2000.
PL/PGSQLtương tự như kèo bóng đá euro trong nhiều khía cạnh. Nó là một ngôn ngữ bắt buộc có cấu trúc khối (Tất cả các biến phải được khai báo). kèo bóng đá euro có nhiều hơn nữa các tính năng của nóPostgreSQLĐối tác, nhưngPL/PGSQLCho phép cho rất nhiều chức kèo bóng đá euro và nó đang được cải thiện liên tục.
Một số điều bạn nên ghi nhớ khi chuyển từ kèo bóng đá euro ĐẾNPostgreSQL:
Không có tham số mặc định trongPostgreSQL.
Bạn có thể quá tải các chức kèo bóng đá euro trongPostgreSQL. Điều này thường được sử dụng để làm việc xung quanh việc thiếu các tham số mặc định.
Bài tập, vòng lặp và điều kiện tương tự nhau.
Không cần con trỏ trongPostgreSQL, chỉ cần đặt truy vấn vào Đối với câu lệnh (xem ví dụ bên dưới)
inPostgreSQLbạnCầnĐể thoát trích dẫn đơn. Nhìn thấyPhần 19.11.1.1.
inPostgreSQLBạn cần thoát khỏi các trích dẫn đơn bên trong định nghĩa chức kèo bóng đá euro của bạn. Cái này đôi khi có thể dẫn đến mã khá thú vị, đặc biệt là nếu bạn đang tạo một chức kèo bóng đá euro tạo (các) chức kèo bóng đá euro khác, như TRONGVí dụ 19-6. Một điều cần ghi nhớ khi thoát khỏi rất nhiều Trích dẫn duy nhất là, ngoại trừ phần bắt đầu/kết thúc Trích dẫn, tất cả những người khác sẽ có số lượng thậm chí.
Bảng 19-1đưa ra tin sốt dẻo. (Bạn sẽ thích điều này nhỏ biểu đồ.)
Bảng 19-1. Trích dẫn duy nhất biểu đồ thoát
không. của trích dẫn | sử dụng | Ví dụ | result |
---|---|---|---|
1 | Để bắt đầu/chấm dứt các cơ quan chức kèo bóng đá euro |
Tạo hàm foo () trả về số nguyên là '...' Ngôn ngữ 'plpgsql'; |
cũng như |
2 | Trong các bài tập, chọn các câu lệnh, để phân định chuỗi, v.v. |
a_output: = '' blah ''; Chọn * Từ người dùng trong đó f_name = '' foobar ''; |
Chọn * Từ người dùng ở đâu f_name = 'foobar'; |
4 | Khi bạn cần hai trích dẫn duy nhất trong kết quả của mình Chuỗi không kết thúc chuỗi đó. |
a_output: = a_output || '' Và tên Như '' '' foobar '' '' và ... '' |
và tên như 'foobar' và ... |
6 | Khi bạn muốn báo giá gấp đôi trong kết quả của mình sợi dâyvàchấm dứt chuỗi đó. |
a_output: = a_output || '' Và tên Như '' '' foobar '' '' '' ' |
và tên như 'foobar' |
10 | Khi bạn muốn hai trích dẫn duy nhất trong kết quả Chuỗi (chiếm 8 trích dẫn)vàChấm dứt điều đó Chuỗi (2 thêm). Bạn có thể sẽ chỉ cần điều đó nếu Bạn đã sử dụng một chức kèo bóng đá euro để tạo các chức kèo bóng đá euro khác (như trongVí dụ 19-6). |
17035_17253 |
Nếu v _ <... thích '' <... '' sau đó trả về '' <... ''; kết thúc nếu như; |
Ví dụ 19-5. Một hàm đơn giản
Đây là chức năng của kèo bóng đá euro:
Tạo hoặc thay thế chức kèo bóng đá euro cs_fmt_browser_version (v_name trong varchar, v_version trong varchar) Trả lại Varchar là BẮT ĐẦU Nếu v_version là null thì Trả lại v_name; Kết thúc nếu; Trả lại v_name || '/' || v_version; KẾT THÚC; / Hiển thị lỗi;
Hãy xem qua chức kèo bóng đá euro này và xem sự khác biệt đối vớiPL/PGSQL:
PostgreSQLkhông đã đặt tên cho các tham số. Bạn phải bí danh rõ ràng Bên trong chức kèo bóng đá euro của bạn.
kèo bóng đá euro có thể cóin, outvàInoutCác tham số được truyền đến các chức kèo bóng đá euro. TheInoutví dụ, có nghĩa là tham số sẽ nhận được một giá trị và trả về một giá trị khác.PostgreSQLChỉ có"trong"tham số và chức kèo bóng đá euro chỉ có thể trả về một giá trị duy nhất.
ThereturnTừ khóa trong Nguyên mẫu chức kèo bóng đá euro (không phải cơ thể chức kèo bóng đá euro) trở thànhreturninPostgreSQL.
trênPostgreSQLCác chức kèo bóng đá euro được tạo bằng cách sử dụng các trích dẫn đơn lẻ làm dấu phân cách, Vì vậy, bạn phải thoát khỏi các trích dẫn đơn trong các chức kèo bóng đá euro của mình (Đôi khi có thể khá khó chịu; xemPhần 19.11.1.1).
The/Hiển thị lỗiLệnh không không tồn tại trongPostgreSQL.
Vì vậy, hãy xem chức kèo bóng đá euro này trông như thế nào khi được chuyển sangPostgreSQL:
Tạo hoặc thay thế chức kèo bóng đá euro cs_fmt_browser_version (varchar, varchar) Trả về varchar là ' TUYÊN BỐ bí danh v_name với giá $ 1; bí danh V_version với giá $ 2; BẮT ĐẦU Nếu v_version là null thì trả lại v_name; Kết thúc nếu; Trả lại v_name || ''/'' || v_version; KẾT THÚC; 'Ngôn ngữ' plpgsql ';
Ví dụ 19-6. Một chức kèo bóng đá euro tạo ra một chức kèo bóng đá euro khác Chức kèo bóng đá euro
Quy trình sau lấy hàng từ AChọnTuyên bố và xây dựng một chức kèo bóng đá euro lớn với kết quả trongnếuCâu lệnh, vì lợi ích của hiệu quả. Đặc biệt chú ý Sự khác biệt trong con trỏ,choVòng lặp, và nhu cầu thoát khỏi các trích dẫn đơn trongPostgreSQL.
Tạo hoặc thay thế thủ tục CS_UPDATE_REFERRER_TYPE_PROC IS Giới thiệu con trỏ_Keys là Chọn * Từ CS_Referrer_Keys Đặt hàng bởi try_order; A_output varchar (4000); BẮT ĐẦU A_OUTPUT: = 'Tạo hoặc thay thế chức kèo bóng đá euro CS_FIND_REFERRER_TYPE (V_HOST IN VARCHAR, V_DOMAIN IN VARCHAR, v_url trong varchar) varchar trả về bắt đầu '; Cho người giới thiệu_key trong giới thiệu_keys vòng lặp a_output: = a_output || 'Nếu v_' || giới thiệu_key.kind || 'Thích' '' || Giới thiệu_key.key_string || '' 'Sau đó trả về' '' || giới thiệu_key.referrer_type || '' '; Kết thúc nếu; '; Kết thúc vòng lặp; a_output: = a_output || 'Trả lại null; KẾT THÚC;'; Thực hiện A_Output ngay lập tức; KẾT THÚC; / Hiển thị lỗi
Đây là cách chức kèo bóng đá euro này kết thúc trongPostgreSQL:
21744_23019
Ví dụ 19-7. Một thủ tục có nhiều chuỗi Thao tác và ra tham số
Quy trình kèo bóng đá euro sau đây được sử dụng để phân tích cú pháp A URL và trả về một số yếu tố (máy chủ, đường dẫn và truy vấn). Nó là một thủ tục vì trongPL/PGSQLchỉ có một giá trị đã trả về (xemPhần 19.11.3). TRONGPostgreSQL,, Một cách để làm việc xung quanh điều này là chia thủ tục trong Ba chức kèo bóng đá euro khác nhau: một để trả về máy chủ, một chức kèo bóng đá euro khác cho đường dẫn và một truy vấn khác cho truy vấn.
Tạo hoặc thay thế thủ tục CS_PARSE_URL (
v_url trong varchar,
v_host out varchar, - điều này sẽ được truyền lại
v_path out varchar, - cái này cũng vậy
v_query out varchar) - và cái này
là
Số nguyên A_POS1;
Số nguyên A_POS2;
bắt đầu
v_host: = null;
v_path: = null;
V_Query: = null;
a_pos1: = uster (v_url, '//'); -PostgreSQLNếu a_pos1 = 0 thì
TRỞ LẠI;
Kết thúc nếu;
a_pos2: = uster (v_url, '/', a_pos1 + 2);
Nếu a_pos2 = 0 thì
V_host: = Subrtr (V_URL, A_POS1 + 2);
v_path: = '/';
TRỞ LẠI;
Kết thúc nếu;
V_host: = Subrtr (V_URL, A_POS1 + 2, A_POS2 - A_POS1 - 2);
a_pos1: = uster (v_url, '?', a_pos2 + 1);
Nếu a_pos1 = 0 thì
v_path: = Subrtr (V_URL, A_POS2);
TRỞ LẠI;
Kết thúc nếu;
V_Path: = Subrtr (V_URL, A_POS2, A_POS1 - A_POS2);
V_Query: = Subrtr (V_URL, A_POS1 + 1);
KẾT THÚC;
/
Hiển thị lỗi;
24809_24868PostgreSQL:
Tạo hoặc thay thế chức kèo bóng đá euro CS_PARSE_URL_HOST (VARCHAR) Trả về Varchar là ' TUYÊN BỐ bí danh V_URL với giá $ 1; v_host varchar; v_path varchar; Số nguyên A_POS1; Số nguyên A_POS2; Số nguyên A_POS3; BẮT ĐẦU v_host: = null; a_pos1: = uster (v_url, '' // ''); Nếu a_pos1 = 0 thì TRỞ LẠI ''''; - Trả lại một khoảng trống Kết thúc nếu; a_pos2: = uster (v_url, ''/'', a_pos1 + 2); Nếu a_pos2 = 0 thì V_host: = Subrtr (V_URL, A_POS1 + 2); v_path: = ''/''; Trả lại v_host; Kết thúc nếu; V_host: = Subrtr (V_URL, A_POS1 + 2, A_POS2 - A_POS1 - 2); Trả lại v_host; KẾT THÚC; 'Ngôn ngữ' plpgsql ';
Lưu ý: PostgreSQLkhông có
uster
chức kèo bóng đá euro, vì vậy bạn có thể làm việc xung quanh nó bằng cách sử dụng kết hợp của các chức kèo bóng đá euro khác. Tôi cảm thấy mệt mỏi khi làm điều này và tạo ra sở hữuuster
25983_26078Phần 19.11.6cho mã.
26383_26541Inouthoặcouttham số.
Một ví dụ:
Tạo hoặc thay thế thủ tục CS_CREATE_JOB (V_JOB_ID in Integer) IS IS A_Rasty_Job_Count Integer; Pragma tự trị_transaction;(1)Bắt đầu Bảng khóa CS_JOBS ở chế độ độc quyền;(2)Chọn Đếm (*) vào A_Rasty_Job_Count Từ CS_JOBS Trong đó end_stamp là null; Nếu a_rasty_job_count 0 thì LÀM; - Khóa miễn phí(3)RAISE_APPLICATION_ERROR (-20000, 'Không thể tạo một công việc mới: một công việc hiện đang chạy.'); Kết thúc nếu; Xóa khỏi CS_Active_Job; Chèn vào các giá trị CS_Active_Job (Job_id) (v_job_id); BẮT ĐẦU Chèn vào các giá trị CS_JOBS (JOB_ID, Start_stamp) (v_job_id, sysdate); Ngoại lệ khi DUP_VAL_ON_INDEX sau đó null; - Đừng lo lắng nếu nó đã tồn tại(4)Kết thúc; LÀM; KẾT THÚC; / Hiển thị lỗi
Các quy trình như thế này có thể dễ dàng chuyển đổi thànhPostgreSQLchức kèo bóng đá euro trả về MỘTSố nguyên. Quy trình này đặc biệt thú vị bởi vì nó có thể dạy chúng ta một số điều:
Vì vậy, hãy xem một trong những cách chúng ta có thể chuyển thủ tục này đếnPL/PGSQL:
29581_30540(1)Kết thúc nếu; Trả lại 0; KẾT THÚC; 'Ngôn ngữ' plpgsql ';
Lưu ý:Tôi chưa tự làm nhiều với các gói, Vì vậy, nếu có những sai lầm ở đây, xin vui lòng cho tôi biết.
Gói là một cách mà kèo bóng đá euro cung cấp cho bạn để gói gọn PL/SQL Các câu lệnh và chức năng thành một thực thể, như các lớp Java, nơi bạn xác định các phương thức và đối tượng. Bạn có thể truy cập những điều này Đối tượng/Phương thức với"."(dot). Đây là một ví dụ về một nhà tiên tri Gói từ ACS 4 (TheHệ thống cộng đồng Arsdigita):
Tạo hoặc thay thế gói ACS thân gói BẰNG Chức kèo bóng đá euro add_user ( user_id in user.user_id%gõ null mặc định, Object_Type trong ACS_OBjects.Object_Type%Loại mặc định 'người dùng', creation_date trong acs_objects.creation_date%loại sysdate mặc định, creation_user trong acs_objects.creation_user%loại mặc định null, creation_ip trong acs_objects.creation_ip%loại mặc định null, ... ) Trả về người dùng.user_id%Loại LÀ v_user_id users.user_id%loại; v_rel_id thành viên_rels.rel_id%loại; BẮT ĐẦU v_user_id: = acs_user.new (user_id, object_type, creation_date, creation_user, creation_ip, email, ... Trả lại v_user_id; KẾT THÚC; Kết thúc ACS; / Hiển thị lỗi
Chúng tôi chuyển cái này sangPOSTGRESQLBằng cách tạo các đối tượng khác nhau của gói kèo bóng đá euro AS chức năng với một quy ước đặt tên tiêu chuẩn. Chúng tôi phải trả tiền chú ý đến một số chi tiết khác, như thiếu mặc định tham số trongPostgreSQLchức kèo bóng đá euro. Gói trên sẽ trở thành một cái gì đó giống như cái này:
Tạo hàm ACS__ADD_USER (Integer, Integer, Varchar, Timestamp, Integer, Integer, ...) Trả về số nguyên là ' TUYÊN BỐ user_id bí danh với giá $ 1; Object_type bí danh với giá $ 2; Creation_date bí danh với giá 3 đô la; Creation_user bí danh với giá 4 đô la; Creation_ip bí danh với giá $ 5; ... v_user_id users.user_id%loại; v_rel_id thành viên_rels.rel_id%loại; BẮT ĐẦU v_user_id: = acs_user__new (user_id, object_type, creation_date, creation_user, creation_ip, ...); ... Trả lại v_user_id; KẾT THÚC; 'Ngôn ngữ' plpgsql ';
ThePOSTGRESQLPhiên bảnthực thihoạt động tốt, nhưng bạn có
Để nhớ sử dụngquote_literal (văn bản)
vàQUOTE_STRING (văn bản)
Như được mô tả trongPhần 19.5.4. Cấu trúc của loạithực thi '' chọn * từ $ 1 '';sẽ không hoạt động
Trừ khi bạn sử dụng các chức kèo bóng đá euro này.
POSTGRESQLcung cấp cho bạn hai Bộ điều chỉnh tạo chức kèo bóng đá euro để tối ưu hóa thực thi:isCachable(chức kèo bóng đá euro luôn trả về cùng một kết quả khi được đưa ra cùng một đối số) vàISSTRICT34822_34892Tạo CHỨC NĂNGTham chiếu để biết chi tiết.
Để sử dụng các thuộc tính tối ưu hóa này, bạn phải sử dụngvớiCông cụ sửa đổi trong bạnTạo chức kèo bóng đá euroCâu lệnh. Thứ gì đó giống:
Tạo hàm foo (...) Trả về số nguyên là ' ... 'Ngôn ngữ' plpgsql ' Với (ISSTRICT, isCachable);
prev | Trang chủ | NEXT |
ví dụ | 39725_39729 | PL/TCL - TCL Ngôn ngữ thủ tục |