3295_3437hiệ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ế.

40.12. kèo kèo bóng đá hôm nay và ngày mai và ngày mai từOraclekèo bóng đá hôm nay và ngày mai

Phần này giải thích sự khác biệt giữaPostgreSQL'sPL/PGSQLNgôn ngữ và Oraclekèo bóng đá hôm nay và ngày maiNgôn ngữ, để giúp các nhà phát triển kèo bóng đá hôm nay và ngày mai đổi ứng dụng từOracle® đếnPostgreSQL.

PL/PGSQLtương tự như PL/SQL ở 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 kèo bóng đá hôm nay và ngày mai từkèo bóng đá hôm nay và ngày maiđếnPL/PGSQLlà:

  • Nếu tên được sử dụng trong lệnh kèo bóng đá hôm nay và ngày mai có thể là tên cột của bảng hoặc tham chiếu đến biến của hàm,kèo bóng đá hôm nay và ngày maicoi 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 40.10.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 kèo bóng đá hôm nay và ngày mai một 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.

  • inPostgreSQLCơ thể chức kèo bóng đá hôm nay và ngày mai phải được viết dưới dạng chuỗi theo nghĩa đen. Do đó, bạn cần sử dụng báo giá đô la hoặc thoát khỏi các trích dẫn đơn trong cơ thể chức kèo bóng đá hôm nay và ngày mai. (Nhìn thấyPhần 40.11.1.)

  • Thay vì các gói, hãy sử dụng các lược đồ để sắp xếp các chức kèo bóng đá hôm nay và ngày mai 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 kèo bóng đá hôm nay và ngày maio đó, 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:kèo bóng đá hôm nay và ngày maiĐế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 kèo bóng đá hôm nay và ngày mai. Sự không tương thích này là không may nhưng không có khả năng thay đổi. (Nhìn thấyPhần 40.6.3.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 khikèo bóng đá hôm nay và ngày maiLuôn tuyên bố chúng ngầm. Một 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ỏ.

40.12.1. Bước kèo bóng đá hôm nay và ngày maio ví dụ

Ví dụ 40-8Hiển thị cách kèo bóng đá hôm nay và ngày mai chức năng đơn giản từkèo bóng đá hôm nay và ngày maiđếnPL/PGSQL.

Ví dụ 40-8. kèo bóng đá hôm nay và ngày mai một chức năng đơn giản từkèo bóng đá hôm nay và ngày maiđếnPL/PGSQL

Đây làOracle kèo bóng đá hôm nay và ngày maichức kèo bóng đá hôm nay và ngày mai:

Tạo hoặc thay thế chức kèo bóng đá hôm nay và ngày mai cs_fmt_browser_version (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;
/
Hiển thị lỗi;

Hãy xem qua chức kèo bóng đá hôm nay và ngày mai này và xem sự khác biệt so vớiPL/PGSQL:

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

  • inPostgreSQL, cơ thể chức kèo bóng đá hôm nay và ngày mai đượ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 năng này trông như thế nào khi được kèo bóng đá hôm nay và ngày mai sangPostgreSQL:

Tạo hoặc thay thế chức kèo bóng đá hôm nay và ngày mai cs_fmt_browser_version (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ụ 40-9Hiển thị cách kèo bóng đá hôm nay và ngày mai một hàm tạo chức năng khác và cách xử lý các vấn đề trích dẫn tiếp theo.

Ví dụ 40-9. kèo bóng đá hôm nay và ngày mai một hàm tạo chức năng khác từkèo bóng đá hôm nay và ngày maiđếnPL/PGSQL

Quy trình sau lấy hàng từ AChọnCâu lệnh và xây dựng một hàm lớn với kết quả trongnếuBáo cáo, vì lợi ích của hiệu quả.

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

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;
    func_cmd varchar (4000);
BẮT ĐẦU
    func_cmd: = 'Tạo hoặc thay thế chức kèo bóng đá hôm nay và ngày mai cs_find_referrer_type (v_host trong varchar,
                 v_domain trong varchar, v_url trong varchar) return varchar là bắt đầu ';

    Cho người giới thiệu_key trong giới thiệu_keys vòng lặp
        func_cmd: = func_cmd ||
          '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;

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

    Thực hiện func_cmd ngay lập tức;
KẾT THÚC;
/
Hiển thị lỗi;

Đây là cách chức kèo bóng đá hôm nay và ngày mai này kết thúc trongPostgreSQL:

17993_18981

Lưu ý cách cơ thể của chức kèo bóng đá hôm nay và ngày mai được xây dựng riêng biệt và được truyền quaquote_literalĐể tăng gấp đôi bất kỳ dấu nào trong đó. Kỹ thuật này là cần thiết bởi vì chúng tôi không thể sử dụng báo giá đô la một cách an toàn để xác định chức kèo bóng đá hôm nay và ngày mai mới: Chúng tôi không biết chắc chắn những chuỗi nào sẽ được nội suy từgiớ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ônmáy chủ, DOMAINhoặcurl, nhưnggiới thiệu_key.key_string19618_19797giới thiệu_key.key_stringhoặcgiới thiệu_key.referrer_typechứa dấu ngoặc kép.

Ví dụ 40-10Hiển thị cách kèo bóng đá hôm nay và ngày mai chức nă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 cái bằng cách sử dụng kết hợp các chức kèo bóng đá hôm nay và ngày mai khác. TRONGPhần 40.12.3Có mộtPL/PGSQLTriển khaiustermà bạn có thể sử dụng để làm cho việc kèo bóng đá hôm nay và ngày mai đổi của bạn dễ dàng hơn.

Ví dụ 40-10. kèo bóng đá hôm nay và ngày mai một thủ tục với thao tác chuỗi vàOUTtham số từkèo bóng đá hôm nay và ngày maiđếnPL/PGSQL

sau đâyOracleQuy trình kèo bóng đá hôm nay và ngày mai đượ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:

21030_21908

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

Tạo hoặc thay thế chức kèo bóng đá hôm nay và ngày mai 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ụ 40-11Hiển thị cách kèo bóng đá hôm nay và ngày mai một quy trình sử dụng nhiều tính năng dành riêng cho Oracle.

Ví dụ 40-11. kèo bóng đá hôm nay và ngày mai một thủ tục từkèo bóng đá hôm nay và ngày maiđếnPL/PGSQL

Phiên bản Oracle:

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 (*) kèo bóng đá hôm nay và ngày maio 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 kèo bóng đá hôm nay và ngày maio các giá trị CS_Active_Job (Job_id) (v_job_id);

    BẮT ĐẦU
        Chèn kèo bóng đá hôm nay và ngày maio các giá trị CS_JOBS (JOB_ID, start_stamp) (v_job_id, now ());
    NGOẠI LỆ
        Khi DUP_VAL_ON_INDEX thì NULL; - Đừng lo lắng nếu nó đã tồn tại
    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 kèo bóng đá hôm nay và ngày mai đổi thành24630_24642chức kèo bóng đá hôm nay và ngày mai trả vềvoid. Quy trình này đặc biệt rất thú vị vì nó có thể dạy chúng tôi một số điều:

(1)
Không cóPragmacâu lệnh trongPostgreSQL.
25101_25106
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 kết thúc.
(3)
Bạn không thể phát hànhcam kếttrong APL/PGSQLHàm. Chức kèo bóng đá hôm nay và ngày mai đang chạy trong một số giao dịch bên ngoài và vì vậycam kếtsẽ ngụ ý chấm dứt thực thi chức kèo bóng đá hôm nay và ngày mai. Tuy nhiên, trong trường hợp cụ thể này, dù sao thì không cần thiết, bởi vì khóa thu được bởiBảng khóasẽ được phát hành khi chúng tôi gây ra lỗi.

Đây là cách chúng tôi có thể kèo bóng đá hôm nay và ngày mai thủ tục này đếnPL/PGSQL:

25939_26313(1)Kết thúc nếu;

    Xóa khỏi CS_Active_Job;
    Chèn kèo bóng đá hôm nay và ngày maio các giá trị CS_Active_Job (Job_id) (v_job_id);

    BẮT ĐẦU
        Chèn kèo bóng đá hôm nay và ngày maio các giá trị CS_JOBS (JOB_ID, start_stamp) (v_job_id, now ());
    NGOẠI LỆ
        Khi độc đáo_violation thì(2)- Đừng lo lắng nếu nó đã tồn tại
    KẾT THÚC;
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 EXABY_NAMEhoạt động tương tự.
(2)
Tên ngoại lệ được hỗ trợ bởi27321_27331khá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.
Sự khác biệt chức kèo bóng đá hôm nay và ngày mai chính giữa quy trình này và tương đương Oracle là khóa độc quyền trêncs_jobsBảng sẽ được giữ cho đến khi giao dịch gọi hoàn thành. Ngoài ra, nếu người gọi sau đó hủy bỏ (ví dụ: do lỗi), các hiệu ứng của thủ tục này sẽ được quay lại.

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

Phần này giải thích một vài điều khác cần xem khi kèo bóng đá hôm nay và ngày mai Oraclekèo bóng đá hôm nay và ngày maichức kèo bóng đá hôm nay và ngày mai choPostgreSQL.

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

inPL/PGSQL, khi một ngoại lệ bị bắt bởiNgoại lệmệ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 một 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ó một quy trình sử dụngSavePointrollback toTheo một cách khác thì một số suy nghĩ thực tế sẽ được yêu cầu.

40.12.2.2.thực thi

ThePL/PGSQLPhiên bảnthực thihoạt động tương tự nhưkèo bóng đá hôm nay và ngày maiPhiên bản, nhưng bạn phải nhớ sử dụngquote_literalQUOTE_IDENTNhư được mô tả trongPhần 40.5.4. Cấu trúc của loạiThực thi 'Chọn * từ $ 1';29998_30055

40.12.2.3. Tối ưu hóaPL/PGSQLChức kèo bóng đá hôm nay và ngày mai

PostgreSQLcung cấp cho bạn hai bộ sửa đổi tạo chức kèo bóng đá hôm nay và ngày mai để tối ưu hóa thực thi:"Biến động"(Cho dù hàm luôn trả về cùng một kết quả khi đưa ra cùng một đối số) và"Sự nghiêm ngặt"(Cho dù hàm có trả về NULL hay không nếu bất kỳ đối số nào là NULL). Tham khảo ý kiếnPostgreSQL: Tài liệu: 9.5: kèo chấp bóngTrang 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, bạnTạo chức kèo bóng đá hôm nay và ngày maiCâ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;

40.12.3. Phụ lục

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

31303_34505