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

42.13. Chuyển từOracletỷ lệ kèo bóng đá

11898_11942PostgreSQL'sPL/PGSQLNgôn ngữ và Oracletỷ lệ kèo bóng đáNgôn ngữ, để giúp các nhà phát triển chuyển ứng dụng từOracle® đếnPostgreSQL.

PL/PGSQLtương tự như tỷ lệ kèo bóng đá ở nhiều khía cạnh. Nó là một ngôn ngữ bắt buộc có cấu trúc khối và tất cả các biến phải được khai báo. Bài tập, vòng lặp và điều kiện là tương tự nhau. Sự khác biệt chính bạn nên ghi nhớ khi chuyển từtỷ lệ kèo bóng đáđếnPL/PGSQLlà:

  • Nếu tên được sử dụng trong lệnh SQL có thể là tên cột của bảng hoặc tham chiếu đến biến của hàm,tỷ lệ kèo bóng đácoi nó là tên cột. Điều này tương ứng vớiPL/PGSQL'splpgsql.Varable_conflict=use_columnHành vi, không phải là mặc định, như được giải thích trongPhần 42.11.1. Tốt nhất là nên tránh những sự mơ hồ như vậy ngay từ đầu, nhưng nếu bạn phải chuyển tỷ lệ kèo bóng đá lượng lớn mã phụ thuộc vào hành vi này, cài đặtVarable_conflictcó thể là giải pháp tốt nhất.

  • inPostgreSQL13605_13755Phần 42.12.1.)

  • Tên loại dữ liệu thường cần dịch. Ví dụ: trong các giá trị chuỗi oracle thường được khai báo là loạiVarchar2, là loại không chuẩn SQL. TRONGPOSTGRESQL, sử dụng loạiVarcharhoặcTextThay vào đó. Tương tự, thay thế loạiSốvớiSốhoặc sử dụng tỷ lệ kèo bóng đá số loại dữ liệu số khác nếu có tỷ lệ kèo bóng đá loại thích hợp hơn.

  • Thay vì các gói, hãy sử dụng các lược đồ để sắp xếp các chức tỷ lệ kèo bóng đá của bạn thành các nhóm.

  • Vì không có gói nào, nên cũng không có biến cấp gói. Điều này có phần khó chịu. Thay vào đó, bạn có thể giữ trạng thái mỗi phiên trong các bảng tạm thời.

  • Số nguyênchovòng lặp vớiđảo ngượclàm việc khác nhau:tỷ lệ kèo bóng đáĐếm xuống từ số thứ hai xuống số thứ nhất, trong khiPL/PGSQLĐếm xuống từ số thứ nhất xuống số thứ hai, yêu cầu giới hạn vòng lặp được hoán đổi khi chuyển. Sự không tương thích này là không may nhưng không có khả tỷ lệ kèo bóng đá thay đổi. (Nhìn thấyPhần 42.6.5.5.)

  • ​​choVòng lặp qua các truy vấn (trừ con trỏ) cũng hoạt động khác nhau: Biến mục tiêu phải được khai báo, trong khitỷ lệ kèo bóng đáLuôn tuyên bố chúng ngầm. tỷ lệ kèo bóng đá lợi thế của điều này là các giá trị biến vẫn có thể truy cập được sau khi vòng lặp thoát.

  • Có nhiều sự khác biệt về chứng minh cho việc sử dụng các biến con trỏ.

42.13.1. Bước vào ví dụ

Ví dụ 42.9Hiển thị cách chuyển chức tỷ lệ kèo bóng đá đơn giản từtỷ lệ kèo bóng đáđếnPL/PGSQL.

Ví dụ 42.9. Chuyển một chức tỷ lệ kèo bóng đá đơn giản từ16610_16618đếnPL/PGSQL

Đây là tỷ lệ kèo bóng đáOracle tỷ lệ kèo bóng đáchức tỷ lệ kèo bóng đá:

Tạo hoặc thay thế chức tỷ lệ kèo bóng đá CS_FMT_BROWSER_VESTER (V_NAME VARCHAR2,
                                                  v_version varchar2)
Trả về Varchar2 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 tỷ lệ kèo bóng đá này và xem sự khác biệt so vớiPL/PGSQL:

  • tên loạiVarchar2phải được thay đổi thànhVarcharhoặcText. Trong các ví dụ trong phần này, chúng tôi sẽ sử dụngVarchar, nhưngTextthường là lựa chọn tốt hơn nếu bạn không cần giới hạn độ dài chuỗi cụ thể.

  • ThereturnTừ khóa trong nguyên mẫu chức tỷ lệ kèo bóng đá (không phải cơ thể chức tỷ lệ kèo bóng đá) trở thànhreturninPostgreSQL. Cũng,trở thànhASvà bạn cần thêm tỷ lệ kèo bóng đáNgôn ngữmệnh đề vìPL/PGSQLkhông phải là ngôn ngữ chức tỷ lệ kèo bóng đá duy nhất có thể.

  • inPostgreSQL, cơ thể chức tỷ lệ kèo bóng đá được coi là một chuỗi theo nghĩa đen, vì vậy bạn cần sử dụng dấu ngoặc kép hoặc báo giá đô la xung quanh nó. Điều này thay thế cho việc chấm dứt/theo cách tiếp cận của Oracle.

  • TheHiển thị lỗiLệnh không tồn tại trongPOSTGRESQLvà không cần thiết vì lỗi được báo cáo tự động.

Đây là cách chức tỷ lệ kèo bóng đá này trông như thế nào khi được chuyển sangPostgreSQL:

Tạo hoặc thay thế chức tỷ lệ kèo bóng đá CS_FMT_BROWSER_VESTER (V_Name Varchar,
                                                  v_version 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;
$$ ngôn ngữ plpgsql;

Ví dụ 42.10Hiển thị cách chuyển một hàm tạo chức tỷ lệ kèo bóng đá khác và cách xử lý các vấn đề trích dẫn tiếp theo.

Ví dụ 42.10. Chuyển một hàm tạo chức tỷ lệ kèo bóng đá khác từtỷ lệ kèo bóng đáđếnPL/PGSQL

Quy trình sau lấy hàng từ AChọnCâu lệnh và xây dựng một chức tỷ lệ kèo bóng đá lớn với kết quả trongnếu20190_20232

Đây là phiên bản Oracle:

20314_21053

Đây là cách chức tỷ lệ kèo bóng đá này kết thúc trongPostgreSQL:

Tạo hoặc thay thế thủ tục CS_UPDATE_REFERRER_TYPE_PROC () như $ func $
TUYÊN BỐ
    Giới thiệu_Keys con trỏ là
        Chọn * Từ CS_Referrer_Keys
        Đặt hàng bởi try_order;
    văn bản func_body;
    văn bản func_cmd;
BẮT ĐẦU
    func_body: = 'bắt đầu';

    Cho người giới thiệu_key trong giới thiệu_keys vòng lặp
        func_body: = func_body ||
          'Nếu v_' || giới thiệu_key.kind
          || 'Thích' || QUOTE_LITHER (giới thiệu_key.key_string)
          || 'Sau đó trả lại' || QUOTE_LITHER (giới thiệu_key.referrer_type)
          || '; Kết thúc nếu; ' ;
    Kết thúc vòng lặp;

    func_body: = func_body || 'Trả lại null; KẾT THÚC;';

    func_cmd: =
      'Tạo hoặc thay thế chức tỷ lệ kèo bóng đá cs_find_referrer_type (v_host varchar,
                                                        v_domain varchar,
                                                        v_url varchar)
        Trả về varchar là '
      || quote_literal (func_body)
      || 'Ngôn ngữ plpgsql;' ;

    Thực thi func_cmd;
KẾT THÚC;
$ func $ ngôn ngữ plpgsql;

Lưu ý cách cơ thể của chức tỷ lệ kèo bóng đá được xây dựng riêng biệt và được truyền quaquote_literal22307_22510giới thiệu_key.key_stringTrường. (Chúng tôi đang giả sử ở đây rằnggiới thiệu_key.kindcó thể được tin tưởng để luôn luônhost, DOMAINhoặcurl, nhưnggiới thiệu_key.key_stringCó thể là bất cứ điều gì, đặc biệt là nó có thể chứa các dấu hiệu đô la.) Hàm này thực sự là tỷ lệ kèo bóng đá cải tiến trên Oracle gốc, vì nó sẽ không tạo ra mã bị hỏng khigiới thiệu_key.key_stringhoặcgiới thiệu_key.referrer_typechứa dấu ngoặc kép.


Ví dụ 42.11Hiển thị cách chuyển chức tỷ lệ kèo bóng đá vớiOUTtham số và thao tác chuỗi.PostgreSQLkhông có tích hợpusterHàm, nhưng bạn có thể tạo một bằng cách sử dụng kết hợp các chức tỷ lệ kèo bóng đá khác. TRONGPhần 42.13.3Có tỷ lệ kèo bóng đáPL/PGSQLTriển khaiustermà bạn có thể sử dụng để làm cho việc chuyển đổi của bạn dễ dàng hơn.

Ví dụ 42.11. Chuyển tỷ lệ kèo bóng đá thủ tục với thao tác chuỗi vàouttham số từtỷ lệ kèo bóng đáđếnPL/PGSQL

sauOracleQuy trình tỷ lệ kèo bóng đá được sử dụng để phân tích URL và trả về một số phần tử (máy chủ, đường dẫn và truy vấn).

Đây là phiên bản Oracle:

Tạo hoặc thay thế quy trình CS_PARSE_URL (
    v_url trong varchar2,
    v_host out varchar2, - điều này sẽ được truyền lại
    v_path out varchar2, - cái này cũng vậy
    v_query out varchar2) - 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, '//');

    Nế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;

Đây là bản dịch có thể thànhPL/PGSQL:

Tạo hoặc thay thế chức tỷ lệ kèo bóng đá 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
Như $$
TUYÊN BỐ
    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, '//');

    Nế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;
$$ ngôn ngữ plpgsql;

Hàm này có thể được sử dụng như thế này:

Chọn * từ cs_parse_url ('http://foobar.com/query.cgi?baz');

Ví dụ 42.12Hiển thị cách chuyển một quy trình sử dụng nhiều tính tỷ lệ kèo bóng đá dành riêng cho Oracle.

Ví dụ 42.12. Chuyển tỷ lệ kèo bóng đá thủ tục từtỷ lệ kèo bóng đáđếnPL/PGSQL

Phiên bản Oracle:

27316_28055

Đây là cách chúng tôi có thể chuyển thủ tục này sangPL/PGSQL:

Tạo hoặc thay thế thủ tục CS_CREATE_JOB (V_JOB_ID Integer) AS $$
TUYÊN BỐ
    A_Rasty_Job_Count Integer;
BẮT ĐẦU
    Bảng khóa CS_JOBS ở chế độ độc quyền;

    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í
        Tăng ngoại lệ 'Không thể tạo tỷ lệ kèo bóng đá công việc mới: tỷ lệ kèo bóng đá công việc hiện đang chạy'; -28635_28881(2)
            - Đừng lo lắng nếu nó đã tồn tại
    KẾT THÚC;
    LÀM;
KẾT THÚC;
$$ ngôn ngữ plpgsql;

(1)

Cú pháp củaNângkhác biệt đáng kể so với tuyên bố của Oracle, mặc dù trường hợp cơ bảnNâng ngoại lệ_namehoạt động tương tự.

(2)

Tên ngoại lệ được hỗ trợ bởiPL/PGSQLkhác với Oracle. Tập hợp các tên ngoại lệ tích hợp lớn hơn nhiều (xemPhụ lục A). Hiện tại không có cách nào để khai báo tên ngoại lệ do người dùng xác định, mặc dù bạn có thể ném các giá trị SQLState chọn người dùng.


42.13.2. Những thứ khác để xem

Phần này giải thích tỷ lệ kèo bóng đá vài điều khác cần xem khi chuyển Oracletỷ lệ kèo bóng đáCác chức tỷ lệ kèo bóng đá thànhPostgreSQL.

42.13.2.1. Rollback ẩn sau các trường hợp ngoại lệ

inPL/PGSQL, Khi tỷ lệ kèo bóng đá ngoại lệ bị bắt bởi31149_31160mệnh đề, tất cả các thay đổi cơ sở dữ liệu kể từ khi khốiBắt đầuđược tự động quay lại. Nghĩa là, hành vi này tương đương với những gì bạn nhận được trong Oracle với:

Bắt đầu
    SavePoint S1;
    ... Mã ở đây ...
NGOẠI LỆ
    Khi ... sau đó
        Rollback sang S1;
        ... Mã ở đây ...
    Khi ... sau đó
        Rollback sang S1;
        ... Mã ở đây ...
KẾT THÚC;

Nếu bạn đang dịch tỷ lệ kèo bóng đá quy trình Oracle sử dụngSavePointrollback toTheo kiểu này, nhiệm vụ của bạn rất dễ dàng: Chỉ cần bỏ quaSavePointrollback to. Nếu bạn có tỷ lệ kèo bóng đá quy trình sử dụngSavePointrollback toTheo tỷ lệ kèo bóng đá cách khác thì tỷ lệ kèo bóng đá số suy nghĩ thực tế sẽ được yêu cầu.

42.13.2.2.thực thi

ThePL/PGSQLPhiên bảnthực thihoạt động tương tự nhưtỷ lệ kèo bóng đáPhiên bản, nhưng bạn phải nhớ sử dụngquote_literalQUOTE_IDENTNhư được mô tả trongPhần 42.5.4. Cấu trúc của loạiThực thi 'Chọn * từ $ 1';Sẽ không hoạt động đáng tin cậy trừ khi bạn sử dụng các chức tỷ lệ kèo bóng đá này.

42.13.2.3. Tối ưu hóaPL/PGSQLChức tỷ lệ kèo bóng đá

POSTGRESQLCung cấp cho bạn hai bộ sửa đổi tạo chức tỷ lệ kèo bóng đá để tối ưu hóa thực thi:biến động(Cho dù hàm luôn trả về cùng tỷ lệ kèo bóng đá kết quả khi đưa ra cùng tỷ lệ kèo bóng đá đối số) vàsự nghiêm ngặtHàng(Cho dù chức tỷ lệ kèo bóng đá có trả về NULL hay không nếu bất kỳ đối số nào là NULL). Tham khảo ý kiếnTạo chức tỷ lệ kèo bóng đáTrang tham khảo để biết chi tiết.

Khi sử dụng các thuộc tính tối ưu hóa này, của bạnTạo chức tỷ lệ kèo bóng đáCâu lệnh có thể trông giống như thế này:

Tạo hàm foo (...) Trả về số nguyên dưới dạng $$
...
$$ ngôn ngữ plpgsql nghiêm ngặt bất biến;

42.13.3. Phụ lục

Phần này chứa mã cho tỷ lệ kèo bóng đá tập hợp tương thích oracleusterCác chức tỷ lệ kèo bóng đá mà bạn có thể sử dụng để đơn giản hóa các nỗ lực chuyển đổi của mình.

34546_37751

Gửi hiệu chỉnh

Nếu bạn thấy bất cứ điều gì trong tài liệu không chính xác, không khớp Kinh nghiệm của bạn với tính tỷ lệ kèo bóng đá cụ thể hoặc yêu cầu làm rõ thêm, Vui lòng sử dụngMẫu nàyĐể báo cáo vấn đề tài liệu.