Phần này thảo luận về tỷ lệ kèo bóng đá số chi tiết triển khai thường xuyên quan trọng đối vớiPL/PGSQLNgười dùng để biết.
Các câu lệnh và biểu thức SQL tỷ lệ kèo bóng đá aPL/PGSQLHàm có thể tham khảo tỷ lệ kèo bóng đá biến và tham số của hàm. Đằng sau hậu trường,PL/PGSQL10884_11099
Chèn vào tỷ lệ kèo bóng đá giá trị foo (foo) (foo (foo));
Sự xuất hiện đầu tiên củafoo
phải là tỷ lệ kèo bóng đá tên bảng, do đó nó sẽ không được thay thế, ngay cả khi hàm có tỷ lệ kèo bóng đá biến có tênfoo
. Sự xuất hiện thứ hai phải là tên của tỷ lệ kèo bóng đá cột của bảng đó, vì vậy nó cũng sẽ không được thay thế. Tương tự như vậy, sự xuất hiện thứ ba phải là tỷ lệ kèo bóng đá tên hàm, vì vậy nó cũng sẽ không được thay thế cho. Chỉ có sự xuất hiện cuối cùng là tỷ lệ kèo bóng đá ứng cử viên là tỷ lệ kèo bóng đá tham chiếu đến tỷ lệ kèo bóng đá biến củaPL/PGSQLchức năng.
Một cách khác để hiểu điều này là thay thế biến chỉ có thể chèn các giá trị dữ liệu vào lệnh SQL; Nó không thể tự động thay đổi đối tượng cơ sở dữ liệu nào được tham chiếu bởi lệnh. (Nếu bạn muốn làm điều đó, bạn phải xây dựng một chuỗi lệnh một cách linh hoạt, như được giải thích tỷ lệ kèo bóng đáPhần 43.5.4.)
Vì tên của các biến không khác với tên của các cột bảng, nên có thể có sự mơ hồ tỷ lệ kèo bóng đá các câu lệnh cũng đề cập đến các bảng: một tên nhất định có nghĩa là đề cập đến cột bảng hoặc một biến không? Hãy thay đổi ví dụ trước thành
Chèn vào Dest (col) Chọn Foo + Bar từ SRC;
ở đây,Dest
vàSRC
phải là tên bảng vàcol
phải là tỷ lệ kèo bóng đá cột củaDest
, nhưngfoo
vàBar
có thể là tỷ lệ kèo bóng đá cách hợp lý là các biến của hàm hoặc cột củaSRC
.
Theo mặc định,PL/PGSQLsẽ báo cáo lỗi nếu tên tỷ lệ kèo bóng đá câu lệnh SQL có thể đề cập đến một biến hoặc cột bảng. Bạn có thể khắc phục sự cố như vậy bằng cách đổi tên biến hoặc cột hoặc bằng cách đủ điều kiện tham chiếu mơ hồ hoặc bằng cách nóiPL/PGSQLGiải thích nào để thích.
Giải pháp đơn giản nhất là đổi tên biến hoặc cột. tỷ lệ kèo bóng đá quy tắc mã hóa chung là sử dụng tỷ lệ kèo bóng đá quy ước đặt tên khác cho13422_13432Biến hơn bạn sử dụng cho tên cột. Ví dụ: nếu bạn liên tục đặt tên cho tỷ lệ kèo bóng đá biến chức năngV_
tỷ lệ kèo bóng đá khi không có tên cột nào của bạn bắt đầu bằngcái gì đó
V_
, sẽ không xảy ra xung đột.
Ngoài ra, bạn có thể đủ điều kiện tham khảo mơ hồ để làm cho chúng rõ ràng. tỷ lệ kèo bóng đá ví dụ trên,src.foo
sẽ là một tham chiếu không rõ ràng cho cột bảng. Để tạo một tham chiếu rõ ràng về một biến, hãy khai báo nó tỷ lệ kèo bóng đá một khối được dán nhãn và sử dụng nhãn của khối (xemPhần 43.2). Ví dụ,
14187_14315
ở đâyblock.foo
có nghĩa là biến ngay cả khi có cộtfoo
inSRC
. tỷ lệ kèo bóng đá tham số chức năng, cũng như tỷ lệ kèo bóng đá biến đặc biệt nhưtìm thấy
, có thể đủ điều kiện theo tên của chức năng, vì chúng được khai báo hoàn toàn tỷ lệ kèo bóng đá một khối bên ngoài được dán nhãn với tên của chức năng.
Đôi khi không thực tế khi sửa tất cả các tài liệu tham khảo mơ hồ tỷ lệ kèo bóng đá một cơ thể lớnPL/PGSQLMã. tỷ lệ kèo bóng đá những trường hợp như vậy, bạn có thể chỉ định rằngPL/PGSQLnên giải quyết tỷ lệ kèo bóng đá tài liệu tham khảo mơ hồ là biến (tương thích vớiPL/PGSQL'hành vi trướcPostgreSQL9.0) hoặc là cột bảng (tương thích với tỷ lệ kèo bóng đá số hệ thống khác nhưOracle).
Để thay đổi hành vi này trên cơ sở toàn hệ thống, hãy đặt tham số cấu hìnhplpgsql.varable_conflict
đến một tỷ lệ kèo bóng đáERROR
, use_varable
hoặcuse_column
(tỷ lệ kèo bóng đá đóERROR
là mặc định của nhà máy). Tham số này ảnh hưởng đến các tổng hợp các câu lệnh tiếp theo tỷ lệ kèo bóng đáPL/PGSQLCác chức năng, nhưng không phải là câu lệnh đã được biên dịch tỷ lệ kèo bóng đá phiên hiện tại. Bởi vì thay đổi cài đặt này có thể gây ra những thay đổi bất ngờ tỷ lệ kèo bóng đá hành vi của15930_15940Các chức năng, nó chỉ có thể được thay đổi bởi tỷ lệ kèo bóng đá siêu người dùng.
Bạn cũng có thể đặt hành vi trên cơ sở từng chức năng, bằng cách chèn một tỷ lệ kèo bóng đá các lệnh đặc biệt này khi bắt đầu văn bản chức năng:
#varable_conflict lỗi #varable_conflict use_varable #varable_conflict use_column
tỷ lệ kèo bóng đá lệnh này chỉ ảnh hưởng đến hàm chúng được viết và ghi đè cài đặt củaplpgsql.varable_conflict
. tỷ lệ kèo bóng đá ví dụ là
Tạo chức năng Stamp_user (ID int, văn bản bình luận) Trả về void dưới dạng $$ #varable_conflict use_varable TUYÊN BỐ Dấu thời gian curtime: = bây giờ (); BẮT ĐẦU Cập nhật người dùng đặt Last_Modified = curtime, bình luận = bình luận tỷ lệ kèo bóng đá đó người dùng.id = id; KẾT THÚC; $$ ngôn ngữ plpgsql;
tỷ lệ kèo bóng đáCập nhật
tỷ lệ kèo bóng đánh,curtime
, bình luận
vàid
sẽ đề cập đến biến và tham số của hàm cho dù hay khôngNgười dùng
Có tỷ lệ kèo bóng đá cột của tỷ lệ kèo bóng đá tên đó. Lưu ý rằng chúng tôi phải đủ điều kiện tham khảouser.id
tỷ lệ kèo bóng đáWHERE
mệnh đề để làm cho nó tham khảo cột bảng. Nhưng chúng tôi không phải đủ điều kiện tham khảobình luận
Là mục tiêu tỷ lệ kèo bóng đáCập nhật
Danh sách, vì về mặt cú pháp phải là tỷ lệ kèo bóng đá cột củaNgười dùng
. Chúng ta có thể viết cùng tỷ lệ kèo bóng đá chức năng mà không phụ thuộc vàoVarable_conflict
17587_17610
Tạo chức năng Stamp_user (ID int, văn bản bình luận) Trả về void dưới dạng $$ << fn TUYÊN BỐ Dấu thời gian curtime: = bây giờ (); BẮT ĐẦU Cập nhật người dùng đặt last_modified = fn.curtime, bình luận = stamp_user.comment tỷ lệ kèo bóng đá đó người dùng.id = stamp_user.id; KẾT THÚC; $$ ngôn ngữ plpgsql;
Thay thế biến không xảy ra tỷ lệ kèo bóng đá chuỗi lệnh được trao chothực thi
hoặc một tỷ lệ kèo bóng đá những biến thể của nó. Nếu bạn cần chèn một giá trị khác nhau vào một lệnh như vậy, hãy làm như vậy như là một phần của việc xây dựng giá trị chuỗi hoặc sử dụngsử dụng
, như được minh họa tỷ lệ kèo bóng đáPhần 43.5.4.
Thay thế biến hiện chỉ hoạt động tỷ lệ kèo bóng đáChọn
, Chèn
, Cập nhật
, Xóa
và các lệnh chứa một tỷ lệ kèo bóng đá số này (chẳng hạn nhưGiải thích
vàTạo bảng ... như chọn
), bởi vì động cơ SQL chính chỉ cho phép các tham số truy vấn tỷ lệ kèo bóng đá các lệnh này. Để sử dụng tên hoặc giá trị không liên tục tỷ lệ kèo bóng đá các loại câu lệnh khác (được gọi chung là các câu lệnh tiện ích), bạn phải xây dựng câu lệnh Utility dưới dạng chuỗi vàthực thi
it.
ThePL/PGSQLPhiên dịch phân tích cú pháp văn bản nguồn của hàm và tạo một cây lệnh nhị phân bên tỷ lệ kèo bóng đá lần đầu tiên hàm được gọi (tỷ lệ kèo bóng đá mỗi phiên). Cây hướng dẫn dịch hoàn toànPL/PGSQLCấu trúc tuyên bố, nhưng cá nhânSQLBiểu thức vàSQLCác lệnh được sử dụng tỷ lệ kèo bóng đá hàm không được dịch ngay lập tức.
như mỗi biểu thức vàSQLLệnh được thực thi đầu tiên tỷ lệ kèo bóng đá hàm,PL/PGSQLPhân tích phiên dịch và phân tích lệnh để tạo tỷ lệ kèo bóng đá câu lệnh đã chuẩn bị, sử dụngSPINgười quản lýspi_prepare
Hàm. Các lần truy cập tiếp theo đến biểu thức hoặc lệnh đó tái sử dụng câu lệnh đã chuẩn bị. Do đó, một chức năng với các đường dẫn mã có điều kiện hiếm khi được truy cập sẽ không bao giờ phải chịu chi phí phân tích các lệnh không bao giờ được thực thi tỷ lệ kèo bóng đá phiên hiện tại. Một bất lợi là các lỗi tỷ lệ kèo bóng đá một biểu thức hoặc lệnh cụ thể không thể được phát hiện cho đến khi phần đó của hàm đạt được tỷ lệ kèo bóng đá thực thi. (Lỗi cú pháp tầm thường sẽ được phát hiện tỷ lệ kèo bóng đá quá trình phân tích cú pháp ban đầu, nhưng bất cứ điều gì sâu hơn sẽ không được phát hiện cho đến khi thực hiện.)
20782_20792(hay chính xác hơn là Trình quản lý SPI) có thể cố gắng hơn nữa để lưu trữ kế hoạch thực thi được liên kết với bất kỳ câu lệnh được chuẩn bị cụ thể nào. Nếu một kế hoạch được lưu tỷ lệ kèo bóng đá bộ nhớ cachPL/PGSQLGiá trị biến) có thể được sử dụng để tối ưu hóa kế hoạch đã chọn. Nếu câu lệnh không có tham số hoặc được thực thi nhiều lần, Trình quản lý SPI sẽ xem xét việc tạo tỷ lệ kèo bóng đáchungKế hoạch không phụ thuộc vào tỷ lệ kèo bóng đá giá trị tham số cụ thể và lưu trữ để sử dụng lại. Thông thường, điều này sẽ chỉ xảy ra nếu kế hoạch thực thi không nhạy cảm lắm với tỷ lệ kèo bóng đá giá trị củaPL/PGSQLcác biến được tham chiếu tỷ lệ kèo bóng đá đó. Nếu có, tạo ra một kế hoạch mỗi lần là một chiến thắng ròng. Nhìn thấyChuẩn bịĐể biết thêm thông tin về hành vi của tỷ lệ kèo bóng đá câu lệnh được chuẩn bị.
vìPL/PGSQLLưu các câu lệnh đã chuẩn bị và đôi khi các kế hoạch thực thi theo cách này, các lệnh SQL xuất hiện trực tiếp tỷ lệ kèo bóng đá APL/PGSQLHàm phải tham khảo cùng một bảng và cột trên mỗi lần thực thi; nghĩa là, bạn không thể sử dụng tham số làm tên của bảng hoặc cột tỷ lệ kèo bóng đá lệnh SQL. Để khắc phục hạn chế này, bạn có thể xây dựng các lệnh động bằng cách sử dụngPL/PGSQL thực thi
Tuyên bố - với giá thực hiện phân tích phân tích mới và xây dựng tỷ lệ kèo bóng đá kế hoạch thực thi mới trên mỗi lần thực thi.
Bản chất có thể thay đổi của các biến bản ghi thể hiện một vấn đề khác tỷ lệ kèo bóng đá kết nối này. Khi các trường của biến bản ghi được sử dụng tỷ lệ kèo bóng đá các biểu thức hoặc câu lệnh, các loại dữ liệu của các trường không được thay đổi từ một cuộc gọi của hàm tiếp theo, vì mỗi biểu thức sẽ được phân tích bằng cách sử dụng loại dữ liệu có mặt khi lần đầu tiên đạt được biểu thức.thực thi
Có thể được sử dụng để giải quyết vấn đề này khi cần thiết.
Nếu cùng tỷ lệ kèo bóng đá hàm được sử dụng làm kích hoạt cho nhiều hơn tỷ lệ kèo bóng đá bảng,PL/PGSQL23022_23344Key
Ngay cả khi nó có các loại khác nhau tỷ lệ kèo bóng đá các bảng khác nhau.
23450_23675
Bộ nhớ đệm tuyên bố đôi khi có thể có tác dụng đáng ngạc nhiên tỷ lệ kèo bóng đá việc giải thích các giá trị nhạy cảm với thời gian. Ví dụ: có một sự khác biệt giữa những gì hai chức năng này làm:
Tạo hàm logfunc1 (văn bản logtxt) trả về void dưới dạng $$ BẮT ĐẦU Chèn vào tỷ lệ kèo bóng đá giá trị logtable (logtxt, 'now'); KẾT THÚC; $$ ngôn ngữ plpgsql;
và:
Tạo hàm logfunc2 (văn bản logtxt) trả về void dưới dạng $$ TUYÊN BỐ Dấu thời gian Curtime; BẮT ĐẦU Curtime: = 'Bây giờ'; Chèn vào tỷ lệ kèo bóng đá giá trị logtable (logtxt, curtime); KẾT THÚC; $$ ngôn ngữ plpgsql;
tỷ lệ kèo bóng đá trường hợplogfunc1
, ThePostgreSQLTrình phân tích cú pháp chính biết khi phân tíchChèn
Đó là chuỗi'Bây giờ'
nên được hiểu làDấu thời gian
, vì cột đích củalogtable
là loại đó. Do đó,'bây giờ'
sẽ được chuyển đổi thành ADấu thời gian
hằng số khiChèn
được phân tích và sau đó được sử dụng tỷ lệ kèo bóng đá tất cả các lời mời củalogfunc1
tỷ lệ kèo bóng đá suốt vòng đời của phiên. Không cần phải nói, đây không phải là điều mà lập trình viên muốn. Một ý tưởng tốt hơn là sử dụngbây giờ ()
hoặccurrent_timestamp
chức năng.
tỷ lệ kèo bóng đá trường hợplogfunc2
, ThePostgreSQLTrình phân tích cú pháp chính không biết loại nào'Bây giờ'
nên trở thành và do đó nó trả về giá trị dữ liệu của loạiText
25441_25466Bây giờ
. tỷ lệ kèo bóng đá quá trình gán tiếp theo cho biến cục bộcurtime
, ThePL/PGSQLPhiên dịch chuyển chuỗi này vàoTimestamp
gõ bằng cách gọiTextout
vàTimestamp_in
Hàm cho chuyển đổi. Vì vậy, tem thời gian tính toán được cập nhật trên mỗi lần thực hiện như người lập trình viên mong đợi. Mặc dù điều này xảy ra hoạt động như mong đợi, nhưng nó không hiệu quả khủng khiếp, vì vậy hãy sử dụngbây giờ ()
Hàm vẫn sẽ là tỷ lệ kèo bóng đá ý tưởng tốt hơn.
27172_27398Mẫu nàyĐể báo cáo vấn đề tài liệu.