ngày 8 tháng 5 năm 2025:2542_2604 | 2667_2703
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 / 7.1
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ế.

19.11. Chuyển từ kèo bóng đá euro PL/SQL

tác giả:Roberto Mello ()

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/PGSQL​​Ngô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.

19.11.1. Sự khác biệt chính

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.

19.11.1.1. Trích dẫn tôi về điều đó: thoát khỏi đĩa đơn Báo giá

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âychấ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)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ư;

19.11.2. Hàm chuyển

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, outInoutCá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óusterchứ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ữuuster25983_26078Phần 19.11.6cho mã.

19.11.3. Thủ tục

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:

(1)
Không có28264_28272Tuyên bố TRONGPostgreSQL.
(2)
Nếu bạn làmBảng khóainPL/PGSQL, Khóa sẽ không được phát hành cho đến khi giao dịch gọi điện hoàn thành.
(3)
Bạn cũng không thể có giao dịch trongPL/PGSQLThủ tục. Toàn bộ chức kèo bóng đá euro (và các chức kèo bóng đá euro khác được gọi từ đó) là được thực hiện trong một giao dịch vàPostgreSQLQuay lại kết quả nếu Có gì đó không ổn. Do đó chỉ có mộtBắt đầuCâu lệnh được cho phép.
(4)
Ngoại lệ khi phải được thay thế bằng mộtnếucâu lệnh.

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 ';
(1)
Lưu ý cách bạn có thể nêu ra thông báo (hoặc lỗi) trongPL/PGSQL.

19.11.4. Gói

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 ';

19.11.5. Những thứ khác để xem Vì

19.11.5.1. Thực thi

ThePOSTGRESQLPhiên bảnthực thihoạt động tốt, nhưng bạn có Để nhớ sử dụngquote_literal (văn bản)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.

19.11.5.2. Tối ưu hóaPL/PGSQLChức kèo bóng đá euro

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);