Postgresql 8.4.22 Tài liệu | ||||
---|---|---|---|---|
prev | Backward nhanh | Chương 38.kèo tỷ số bóng đá euro hôm nay - SQLNgôn ngữ thủ tục | Chuyển tiếp nhanh | NEXT |
Phần này thảo luận về kèo tỷ số bóng đá euro hôm nay số chi tiết thực hiện thường xuyên quan trọng đối vớikèo tỷ số bóng đá euro hôm nayNgười dùng để biết.
Khikèo tỷ số bóng đá euro hôm nayChuẩn bị a Câu lệnh hoặc biểu thức SQL để thực thi, bất kỳkèo tỷ số bóng đá euro hôm nayTên biến xuất hiện trong câu lệnh hoặc biểu thức được thay thế bằng ký hiệu tham số,$n. Giá trị hiện tại của biến sau đó được cung cấp kèo tỷ số bóng đá euro hôm nay dạng giá trị cho tham số bất cứ khi nào câu lệnh hoặc biểu thức là thực hiện. Ví dụ, hãy xem xét chức năng
Tạo hàm logfunc (văn bản logtxt) Trả về void kèo tỷ số bóng đá euro hôm nay dạng $$ TUYÊN BỐ Dấu thời gian curtime: = bây giờ (); BẮT ĐẦU Chèn vào các giá trị logtable (logtxt, curtime); KẾT THÚC; $$ ngôn ngữ plpgsql;
TheChènTuyên bố sẽ được xử lý kèo tỷ số bóng đá euro hôm nay cách hiệu quả là
Chuẩn bịstatement_name(văn bản, dấu thời gian) như Chèn vào các giá trị logtable ($ 1, $ 2);
Theo dõi trên mỗi lần thực hiện bởithực thiVới các giá trị thực tế hiện tại của Hai biến. (Lưu ý: Ở đây chúng ta đang nói về SQL chính động cơthực thilệnh, khôngkèo tỷ số bóng đá euro hôm nay'sthực thi.)
Sự thay thế cơ chế sẽ thay thế bất kỳ mã thông báo nào phù hợp với kèo tỷ số bóng đá euro hôm nay Tên của biến.Điều này đặt ra các bẫy khác nhau cho không hay. Ví dụ: sử dụng tên biến là xấu Điều đó giống như bất kỳ bảng hoặc tên cột nào mà bạn cần tham chiếu trong các truy vấn trong hàm, bởi vì những gì bạn Nghĩ là kèo tỷ số bóng đá euro hôm nay bảng hoặc tên cột vẫn sẽ được thay thế. Trong Ví dụ trên, giả sử rằnglogtablecó tên cộtlogtxtvàlogtimevà chúng tôi cố gắng viếtChènAS
12359_12435
Điều này sẽ được đưa vào trình phân tích cú pháp SQL chính là
Chèn vào giá trị logtable ($ 1, logtime) ($ 1, $ 2);
Kết quả là lỗi cú pháp như thế này:
Lỗi: Lỗi cú pháp tại hoặc gần "$ 1" Dòng 1: Chèn vào giá trị logtable ($ 1, logtime) ($ 1, $ 2) ^ Truy vấn: Chèn vào giá trị logtable ($ 1, logtime) ($ 1, $ 2) Bối cảnh: Câu lệnh SQL trong chức năng kèo tỷ số bóng đá euro hôm nay "LogFunc2" Gần dòng 5
Ví dụ này khá dễ chẩn đoán, vì nó dẫn đến kèo tỷ số bóng đá euro hôm nay lỗi cú pháp rõ ràng. Khó khăn hơn nhiều là những trường hợp Thay thế được cho phép về mặt cú pháp, vì duy nhất Triệu chứng có thể là hành vi sai của chức năng. Trong kèo tỷ số bóng đá euro hôm nay trường hợp, người dùng đã viết kèo tỷ số bóng đá euro hôm nay cái gì đó như thế này:
13272_13428
Và tự hỏi tại sao tất cả các mục bảng của anh ấy dường như là vô hiệu. Của Tất nhiên những gì đã xảy ra ở đây là truy vấn đã trở thành
Chọn $ 1 từ bảng trong đó phím = $ 2
Và do đó, đó chỉ là kèo tỷ số bóng đá euro hôm nay cách chỉ địnhValgiá trị hiện tại của chính nó cho chính nó cho mỗi hàng.
kèo tỷ số bóng đá euro hôm nay quy tắc mã hóa thường được sử dụng để tránh các bẫy như vậy là Sử dụng kèo tỷ số bóng đá euro hôm nay quy ước đặt tên khác chokèo tỷ số bóng đá euro hôm nayBiến so với bạn sử dụng cho bảng và tên cột. Ví dụ: nếu tất cả các biến của bạn được đặt tênV_cái gì đóTrong khi không có bảng nào của bạn hoặc tên cột bắt đầu bằngV_, Bạn đang làm Khá an toàn.
kèo tỷ số bóng đá euro hôm nay cách giải quyết khác là sử dụng tên đủ điều kiện (chấm) cho Các thực thể SQL. Ví dụ chúng tôi có thể viết kèo tỷ số bóng đá euro hôm nay cách an toàn Ví dụ trên như
14424_14506
vìkèo tỷ số bóng đá euro hôm naySẽ không thay thế kèo tỷ số bóng đá euro hôm nay biến cho kèo tỷ số bóng đá euro hôm nay thành phần dấu vết của kèo tỷ số bóng đá euro hôm nay người có trình độ tên. Tuy nhiên, giải pháp này không hoạt động trong mọi trường hợp - bạn Không thể đủ điều kiện kèo tỷ số bóng đá euro hôm nay tên trong kèo tỷ số bóng đá euro hôm nayChèn14772_15071
kèo tỷ số bóng đá euro hôm nay kỹ thuật khác bạn có thể sử dụng là gắn nhãn vào chặn trong đó các biến của bạn được khai báo, sau đó đủ điều kiện Tên biến trong các lệnh SQL của bạn (xemPhần 38.2). Ví dụ,
<< PL TUYÊN BỐ văn bản val; BẮT ĐẦU ... Cập nhật bảng đặt col = pl.val trong đó ...
Đây không phải là giải pháp cho vấn đề xung đột, vì kèo tỷ số bóng đá euro hôm nay cái tên không đủ tiêu chuẩn trong lệnh SQL vẫn còn có nguy cơ bị giải thích"sai"Cách. Nhưng nó rất hữu ích để làm rõ Mục đích của mã có khả năng mơ hồ.
Thay thế biến không xảy ra trong chuỗi lệnh được trao chothực thihoặc kèo tỷ số bóng đá euro hôm nay trong số nó biến thể. Nếu bạn cần chèn kèo tỷ số bóng đá euro hôm nay giá trị khác nhau vào kèo tỷ số bóng đá euro hôm nay lệnh, làm như vậy như là kèo tỷ số bóng đá euro hôm nay phần của việc xây dựng giá trị chuỗi, như được minh họa trongPhần 38.5.4.
Thay thế biến hiện chỉ hoạt động trongChọn, Chèn, Cập nhậtvàXóalệnh, vì động cơ SQL chính chỉ cho phép các ký hiệu tham số trong các lệnh này. Để sử dụng a Tên hoặc giá trị không liên tục trong 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 tiện ích kèo tỷ số bóng đá euro hôm nay dạng chuỗi vàthực thiit.
Thekèo tỷ số bóng đá euro hôm nayThông dịch viên Phân tích văn bản nguồn của chức năng và tạo ra kèo tỷ số bóng đá euro hôm nay nội bộ cây hướng dẫn nhị phân lần đầu tiên hàm được gọi (trong mỗi phiên). Cây hướng dẫn dịch hoàn toàn Thekèo tỷ số bóng đá euro hôm nayTuyên bố cấu trúc, nhưng cá nhânSQLBiểu thức vàSQLCác lệnh được sử dụng trong hàm không được dịch ngay lập tức.
như mỗi biểu thức vàSQLlệnh đầu tiên được thực thi trong
chức năng,kèo tỷ số bóng đá euro hôm nayThông dịch viên tạo ra kèo tỷ số bóng đá euro hôm nay kế hoạch thực thi đã chuẩn bị (sử dụngSPINgười quản lýspi_prepare
vàspi_saveplan
chức năng).Các lượt truy cập tiếp theo đến biểu thức đó hoặc
lệnh tái sử dụng kế hoạch đã chuẩn bị. Do đó, kèo tỷ số bóng đá euro hôm nay chức năng với
mã có điều kiện chứa nhiều câu lệnh
Các kế hoạch thực thi có thể được yêu cầu sẽ chỉ chuẩn bị và tiết kiệm
những kế hoạch thực sự được sử dụng trong suốt cuộc đời của
Kết nối cơ sở dữ liệu. Điều này có thể giảm đáng kể tổng số
Lượng thời gian cần thiết để phân tích và tạo các kế hoạch thực thi
cho các câu trong kèo tỷ số bóng đá euro hôm naykèo tỷ số bóng đá euro hôm nay18266_18572
kèo tỷ số bóng đá euro hôm nay lầnkèo tỷ số bóng đá euro hôm nayđã làm kèo tỷ số bóng đá euro hôm nay kế hoạch thực thi cho kèo tỷ số bóng đá euro hôm nay lệnh cụ thể trong kèo tỷ số bóng đá euro hôm nay hàm, nó sẽ Tái sử dụng kế hoạch đó cho cuộc sống của kết nối cơ sở dữ liệu. Cái này thường là kèo tỷ số bóng đá euro hôm nay chiến thắng cho hiệu suất, nhưng nó có thể gây ra kèo tỷ số bóng đá euro hôm nay số Vấn đề nếu bạn tự động thay đổi lược đồ cơ sở dữ liệu của bạn. Vì ví dụ:
Tạo hàm Fopulation () trả về số nguyên kèo tỷ số bóng đá euro hôm nay dạng $$ TUYÊN BỐ - Tuyên bố BẮT ĐẦU Thực hiện my_function (); KẾT THÚC; $$ ngôn ngữ plpgsql;
Nếu bạn thực thi chức năng trên, nó sẽ tham chiếu OID
vìmy_function ()
Trong
Kế hoạch thực thi được sản xuất chobiểu diễnTuyên bố. Sau này, nếu bạn thả và
tái tạomy_function ()
, sau đóFopulation ()
sẽ không thể
tìm thấymy_function ()
nữa. Bạn
sau đó sẽ phải bắt đầu kèo tỷ số bóng đá euro hôm nay phiên cơ sở dữ liệu mới đểđông dân ()
sẽ được biên dịch
kèo tỷ số bóng đá euro hôm nay lần nữa, trước khi nó sẽ hoạt động trở lại. Bạn có thể tránh được vấn đề này
bằng cách sử dụngTạo hoặc thay thế chức năngKhi cập nhật định nghĩa củamy_function
, kể từ khi kèo tỷ số bóng đá euro hôm nay hàm là"Thay thế", OID của nó không phải là
đã thay đổi.
Lưu ý:inPostgreSQL8.3 trở lên, các kế hoạch đã lưu sẽ được thay thế bất cứ khi nào bất kỳ thay đổi lược đồ nào xảy ra cho bất kỳ bảng họ tham khảo. Điều này giúp loại bỏ kèo tỷ số bóng đá euro hôm nay trong những Nhược điểm lớn của kế hoạch đã lưu. Tuy nhiên, không có cơ chế như vậy cho các tài liệu tham khảo chức năng, và do đó Ví dụ liên quan đến tham chiếu đến chức năng bị xóa là Vẫn còn hợp lệ.
vìkèo tỷ số bóng đá euro hôm nayLưu 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 trong akèo tỷ số bóng đá euro hôm nayHàm phải Tham khảo cùng kèo tỷ số bóng đá euro hôm nay bảng và cột trên mỗi lần thực thi; cái đó là, bạn không thể sử dụng kèo tỷ số bóng đá euro hôm nay tham số làm tên của bảng hoặc cột trong kèo tỷ số bóng đá euro hôm nay lệnh sql. Để vượt qua hạn chế này, bạn có thể Xây dựng các lệnh động bằng cách sử dụngkèo tỷ số bóng đá euro hôm nay thực thiTuyên bố - với giá xây dựng kế hoạch thực hiện mới Trên mỗi lần thực thi.
kèo tỷ số bóng đá euro hôm nay điểm quan trọng khác là các kế hoạch đã chuẩn bị là được tham số hóa để cho phép các giá trị củakèo tỷ số bóng đá euro hôm nayBiến để thay đổi từ kèo tỷ số bóng đá euro hôm nay lần sử dụng tiếp theo, như được thảo luận chi tiết ở trên. Đôi khi điều này có nghĩa là rằng kèo tỷ số bóng đá euro hôm nay kế hoạch kém hiệu quả hơn so với kèo tỷ số bóng đá euro hôm nay giá trị biến cụ thể. Ví dụ, hãy xem xét
Chọn * vào MyRec từ từ điển trong đó từ như search_term;
WHEREsearch_termlà Akèo tỷ số bóng đá euro hôm nayBiến. Kế hoạch được lưu trong bộ nhớ cache cho Truy vấn này sẽ không bao giờ sử dụng chỉ mục trênWord, vì người lập kế hoạch không thể cho rằng Thenhư21886_22007nhưmẫu cung cấp. Đây là kèo tỷ số bóng đá euro hôm nay tình huống khác màthực thicó thể được sử dụng để buộc kèo tỷ số bóng đá euro hôm nay kế hoạch mới được tạo cho mỗi lần thực thi.
22211_22593thực thicó thể được sử dụng để vượt qua điều này vấn đề khi cần thiết.
Nếu chức năng tương tự được sử dụng làm kích hoạt cho nhiều hơn kèo tỷ số bóng đá euro hôm nay bàn,kèo tỷ số bóng đá euro hôm nayChuẩn bị và Caches có kế hoạch độc lập cho mỗi bảng như vậy - nghĩa là ở đó là bộ nhớ cache cho từng chức năng kích hoạt và kết hợp bảng, không Chỉ cho mỗi chức năng. Điều này làm giảm bớt kèo tỷ số bóng đá euro hôm nay số vấn đề với các loại dữ liệu khác nhau; ví dụ, chức năng kích hoạt sẽ có thể làm việc thành công với kèo tỷ số bóng đá euro hôm nay cột có tênKeyNgay cả khi nó có các loại khác nhau trong các bảng khác nhau.
23256_23488
23499_23678
Tạo hàm logfunc1 (văn bản logtxt) trả về void kèo tỷ số bóng đá euro hôm nay dạng $$ BẮT ĐẦU Chèn vào các 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 kèo tỷ số bóng đá euro hôm nay dạng $$ TUYÊN BỐ Dấu thời gian Curtime; BẮT ĐẦU Curtime: = 'Bây giờ'; Chèn vào các giá trị logtable (logtxt, curtime); KẾT THÚC; $$ ngôn ngữ plpgsql;
Trong trường hợplogfunc1
, ThePostgreSQLTrình phân tích cú pháp chính biết
Khi chuẩn bị kế hoạch choChènĐó là chuỗi'Bây giờ'nên được
được giải thích làDấu thời gian24457_24494logtable
là của
loại đó. Do đó,'bây giờ'sẽ là
được chuyển đổi thành hằng số khiChènđược lên kế hoạch, và sau đó được sử dụng trong tất cả
Những lời mời củalogfunc1
Trong
Cuộc sống của phiên. Không cần phải nói, đây không phải là những gì
lập trình viên muốn.
Trong 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ạiTextChứa chuỗiBây giờ. Trong quá trình phân công tiếp theo cho địa phương
biếncurtime, Thekèo tỷ số bóng đá euro hôm nayPhiên dịch chuyển chuỗi này đến
TheTimestampgõ bằng cách gọiText_out
vàTimestamp_in
Hàm cho chuyển đổi.
Vì vậy, dấu thời gian tính toán được cập nhật trên mỗi lần thực thi là
lập trình viên mong đợi.