Phần này giải thích sự khác biệt giữaPostgreSQL'sPL/PGSQLNgôn ngữ và OraclePL/SQLNgôn ngữ, để giúp các nhà phát triển chuyển đổi ứng dụng từOracle® đếnPostgreSQL.
PL/PGSQL12211_12451PL/SQLđế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 được sử dụng trong lệnh hoặc tham chiếu đến biến của hàm,PL/SQLcoi nó là tên cột. Theo mặc định,PL/PGSQLsẽ đưa ra kèo chấp bóng đá hôm nay lỗi phàn nàn rằng tên này không rõ ràng. Bạn có thể chỉ địnhplpgsql.Varable_conflict
=use_column
Để thay đổi hành vi này để khớpPL/SQL, như được giải thích trongPhần 41.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 kèo chấp bóng đá hôm nay lượng lớn mã phụ thuộc vào hành vi này, cài đặtVarable_conflict
có thể là giải pháp tốt nhất.
inPostgreSQLCơ thể chức kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm nay. (Nhìn thấyPhần 41.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ại14145_14155
, là loại không chuẩn SQL. TRONG14225_14237, sử dụng loạiVarchar
hoặcText
Thay vào đó. Tương tự, thay thế loạiSố
vớiSố
hoặc sử dụng kèo chấp bóng đá hôm nay số loại dữ liệu số khác nếu có kèo chấp bóng đá hôm nay 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 kèo chấp bóng đá hôm nay 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êncho
vòng lặp vớiđảo ngược
làm việc khác nhau:PL/SQLĐế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ả kèo chấp bóng đá hôm nay thay đổi. (Nhìn thấyPhần 41.6.5.5.)
cho
Vò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 khiPL/SQLLuôn tuyên bố chúng ngầm. kèo chấp bóng đá hôm nay 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ỏ.
Ví dụ 41.9Hiển thị cách chuyển chức kèo chấp bóng đá hôm nay đơn giản từPL/SQLđếnPL/PGSQL.
Ví dụ 41.9. Chuyển một chức kèo chấp bóng đá hôm nay đơn giản từPL/SQLđếnPL/PGSQL
Đây là kèo chấp bóng đá hôm nayOracle PL/SQLchức kèo chấp bóng đá hôm nay:
Tạo hoặc thay thế chức kèo chấp bóng đá hôm nay 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 kèo chấp bóng đá hôm nay này và xem sự khác biệt so vớiPL/PGSQL:
tên loạiVarchar2
phải được thay đổi thànhVarchar
hoặcText
. Trong các ví dụ trong phần này, chúng tôi sẽ sử dụngVarchar
, nhưngText
thườ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ể.
Thereturn
Từ khóa trong nguyên mẫu chức kèo chấp bóng đá hôm nay (không phải cơ thể hàm) trở thànhreturn
inPostgreSQL. Cũng,là
trở thànhAS
và 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 chấp bóng đá hôm nay duy nhất có thể.
inPostgreSQL, cơ thể chức kèo chấp bóng đá hôm nay đượ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.
The18824_18837
Lệnh không tồn tại trongPostgreSQL, và không cần thiết vì lỗi được báo cáo tự động.
Đây là cách chức kèo chấp bóng đá hôm nay này trông như thế nào khi được chuyển sangPostgreSQL:
19174_19470
Ví dụ 41.10Hiển thị cách chuyển một hàm tạo ra một chức kèo chấp bóng đá hôm nay khác và cách xử lý các vấn đề trích dẫn tiếp theo.
Ví dụ 41.10. Chuyển một hàm tạo chức kèo chấp bóng đá hôm nay khác từPL/SQLđếnPL/PGSQL
Quy trình sau lấy hàng từ AChọn
Câu lệnh và xây dựng kèo chấp bóng đá hôm nay hàm lớn với kết quả trongnếu
Câu lệnh, 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 chấp bóng đá hôm nay cs_find_referrer_type (v_host trong varchar2, v_domain trong varchar2, v_url trong varchar2) return varchar2 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 chấp bóng đá hôm nay 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 kèo chấp bóng đá hôm nay 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 kèo chấp bóng đá hôm nay đượ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 chấp bóng đá hôm nay 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_string
Trường. (Chúng tôi đang giả sử ở đây rằnggiới thiệu_key.kind
có thể được tin tưởng để luôn luônmáy chủ
, DOMAIN
hoặcurl
, nhưnggiới thiệu_key.key_string
22969_23148giới thiệu_key.key_string
hoặc23232_23260
chứa dấu ngoặc kép.
Ví dụ 41.11Hiển thị cách chuyển chức kèo chấp bóng đá hôm nay vớiout
tham số và thao tác chuỗi.PostgreSQLkhông có tích hợpuster
Hàm, nhưng bạn có thể tạo một cách sử dụng kết hợp các chức kèo chấp bóng đá hôm nay khác. TRONGPhần 41.13.3Có kèo chấp bóng đá hôm nayPL/PGSQLTriển khaiuster
mà 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ụ 41.11. Chuyển kèo chấp bóng đá hôm nay thủ tục với thao tác chuỗi vàOUT
tham số từPL/SQLđếnPL/PGSQL
sau đâyOracleQuy trình PL/SQL được sử dụng để phân tích URL và trả về kèo chấp bóng đá hôm nay 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ế thủ tục 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 kèo chấp bóng đá hôm nay 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ụ 41.12Hiển thị cách chuyển một quy trình sử dụng nhiều tính kèo chấp bóng đá hôm nay dành riêng cho Oracle.
Ví dụ 41.12. Chuyển kèo chấp bóng đá hôm nay thủ tục từPL/SQLđếnPL/PGSQL
Phiên bản Oracle:
27438_28177
Đây là cách chúng tôi có thể chuyển thủ tục này đếnPL/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 kèo chấp bóng đá hôm nay công việc mới: kèo chấp bóng đá hôm nay công việc hiện đang chạy'; -(1) 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, 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; LÀM; KẾT THÚC; $$ ngôn ngữ plpgsql;
Cú pháp của |
|
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. |
Phần này giải thích kèo chấp bóng đá hôm nay vài điều khác cần xem khi chuyển OraclePL/SQLCác chức kèo chấp bóng đá hôm nay thànhPostgreSQL.
inPL/PGSQL, khi kèo chấp bóng đá hôm nay 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 kèo chấp bóng đá hôm nay quy trình Oracle sử dụngSavePoint
vàrollback to
Theo kiểu này, nhiệm vụ của bạn rất dễ dàng: Chỉ cần bỏ quaSavePoint
vàrollback to
. Nếu bạn có kèo chấp bóng đá hôm nay quy trình sử dụngSavePoint
vàrollback to
Theo kèo chấp bóng đá hôm nay cách khác thì kèo chấp bóng đá hôm nay số suy nghĩ thực tế sẽ được yêu cầu.
thực thi
#ThePL/PGSQLphiên bảnthực thi
hoạt động tương tự nhưPL/SQLPhiên bản, nhưng bạn phải nhớ sử dụngquote_literal
vàQUOTE_IDENT
như được mô tả trongPhần 41.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 kèo chấp bóng đá hôm nay này.
PostgreSQLcung cấp cho bạn hai bộ sửa đổi tạo chức kèo chấp bóng đá hôm nay để tối ưu hóa thực thi:biến độngHàng(Cho dù hàm luôn trả về cùng kèo chấp bóng đá hôm nay kết quả khi đưa ra cùng kèo chấp bóng đá hôm nay đối số) vàsự nghiêm ngặt”(Cho dù hàm trả về NULL nếu bất kỳ đối số nào là NULL). Tham khảo ý kiếnTạo chức kèo chấp bóng đá hôm nayTrang 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 kèo chấp bóng đá hôm nay
Câu lệnh có thể trông giống như thế này:
34333_34425
Phần này chứa mã cho kèo chấp bóng đá hôm nay tập hợp tương thích oracleuster
Các chức kèo chấp bóng đá hôm nay 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.
34980_38185
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 kèo chấp bóng đá hôm nay 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.