Phạm vi biến PL/SQL & Khối bên trong bên ngoài: Cấu trúc lồng nhau

⚡ Tóm tắt thông minh

Các khối lồng nhau trong PL/SQL đặt một khối bên trong một khối khác, cho phép bạn tách biệt logic phức tạp và cô lập việc xử lý ngoại lệ. Hiểu rõ phạm vi biến giữa khối bên ngoài và khối bên trong, và sử dụng nhãn khối, giúp các biến có cùng tên không gây nhầm lẫn.

  • 🧱 Khối lồng nhau: Khối lồng nhau là một khối PL/SQL được đặt bên trong phần thực thi hoặc phần xử lý ngoại lệ của một khối khác.
  • 🌳 Bên ngoài và bên trong: Một khối bên ngoài, hay khối cha, có thể chứa nhiều khối bên trong, hay khối con, mỗi khối là một khối PL/SQL hoàn chỉnh.
  • 🇧🇷 Phạm vi biến đổi: Các biến được khai báo trong khối ngoài trước khối trong sẽ hiển thị bên trong khối đó, nhưng các biến trong khối trong thì không hiển thị bên ngoài.
  • 🏷️ Nhãn khối: Việc gán nhãn cho khối bên ngoài cho phép khối bên trong tham chiếu đến một biến bên ngoài có cùng tên là label.variable_name.
  • 🛡️ Cách ly ngoại lệ: Việc lồng nhau cho phép mỗi khối xử lý các ngoại lệ riêng của nó, giữ choping Xử lý lỗi gần với đoạn mã gây ra lỗi.
  • 🤖 Hỗ trợ AI: Các trợ lý AI như GitHub Copilot soạn thảo các khối lồng nhau có gắn nhãn và cảnh báo xung đột phạm vi biến.

Phạm vi biến PL/SQL trên các khối lồng nhau bên trong và bên ngoài

Khối lồng nhau là gì Oracle?

In PL / SQLMỗi khối có thể được lồng ghép bên trong một khối khác. Khối như vậy được gọi là khối lồng nhau. Khối lồng nhau rất phổ biến khi bạn muốn thực hiện một quy trình nhất định trong khi vẫn giữ cho...ping Mã lệnh cho quy trình đó nằm trong một vùng chứa (khối) riêng biệt.

Khái niệm khối lồng nhau giúp lập trình viên cải thiện khả năng đọc hiểu bằng cách tách logic phức tạp thành các khối riêng biệt, và nó cho phép... ngoại lệ cho mỗi khối cần được xử lý bên trong khối chính bên ngoài.

Cấu trúc khối lồng nhau

Một khối lệnh có thể được lồng bên trong một khối lệnh khác. Nó có thể được lồng trong phần thực thi hoặc trong phần xử lý ngoại lệ, và các khối lệnh này cũng có thể được gắn nhãn. Một khối lệnh bên ngoài có thể chứa nhiều khối lệnh bên trong. Mỗi khối lệnh bên trong bản thân nó là một khối lệnh. Khối PL/SQLNhư vậy, tất cả các thuộc tính và đặc điểm của khối bên trong đều giống với khối bên ngoài. Khối cha là khối chính, và khối con là khối lồng nhau.

Hình ảnh bên dưới minh họa cấu trúc khối lồng nhau, trong đó khối cha là khối chính và khối con là khối lồng nhau.

Hình ảnh minh họa một khối lồng nhau trong PL/SQL với một khối cha bên ngoài và một khối con bên trong.

Dưới đây là cú pháp cho khối lồng nhau. Ảnh chụp màn hình bên dưới hiển thị cú pháp khối lồng nhau với các khối bên ngoài và bên trong được đánh dấu.

Cú pháp khối lồng nhau hiển thị các khối bên ngoài và bên trong được gắn nhãn, mỗi khối đều có các phần DECLARE, BEGIN và EXCEPTION.

Cú pháp khối lồng nhau

<<outer_block>>
DECLARE
 <Declarative section> 
BEGIN
 <Execution part for outer block begins>

 <<inner block>>
 DECLARE
  <Declarative section>
 BEGIN
  <Execution part for inner block>.
 EXCEPTION 
  <Exception handling part>
 END;

 <Execution part for outer block begins> 
EXCEPTION 
<Exception handling part>
END;
  • Cú pháp trên thể hiện khối lồng nhau chứa tổng cộng hai khối.
  • Các khối này được đặt tên là 'outer_block' và 'inner_block'.

Phạm vi trong Khối lồng nhau: Phạm vi thay đổi

Trong một khối lồng nhau, bạn cần hiểu rõ phạm vi và khả năng hiển thị của từng khối trước khi sử dụng chúng. Đặc biệt trong khối bên trong, các phần tử từ cả khối bên ngoài và khối bên trong đều hiển thị, vì vậy việc hiểu đúng điều này là rất cần thiết.

Các điểm dưới đây tóm tắt phạm vi trong các khối lồng nhau.

  • Các phần tử được khai báo trong khối bên ngoài và giá trị được định nghĩa trước khi định nghĩa khối bên trong đều hiển thị bên trong khối bên trong.
  • Các phần tử được khai báo trong khối bên trong không hiển thị trong khối bên ngoài. Chúng chỉ hiển thị bên trong khối bên trong.
  • Khối bên ngoài và khối bên trong có thể có biến cùng tên.
  • Trong trường hợp các biến có cùng tên, theo mặc định khối bên trong chỉ tham chiếu đến biến được khai báo trong chính khối bên trong đó.
  • Nếu khối bên trong muốn tham chiếu đến biến của khối bên ngoài có cùng tên với biến của khối bên trong, thì khối bên ngoài phải được gắn nhãn, và biến của khối bên ngoài có thể được tham chiếu là ' . '

Ví dụ dưới đây sẽ giúp bạn hiểu rõ hơn về các phạm vi này.

Ví dụ 1: Trong ví dụ này, chúng ta thấy phạm vi của các biến trong khối bên trong và bên ngoài. Chúng ta cũng thấy cách tham chiếu đến các biến bằng cách sử dụng nhãn khối.

Ảnh chụp màn hình bên dưới hiển thị Ví dụ 1, trong đó khối bên trong tham chiếu đến một biến của khối bên ngoài bằng cách sử dụng nhãn khối.

Ví dụ về phạm vi biến trong các khối lồng nhau tham chiếu đến một biến của khối bên ngoài thông qua nhãn khối của nó.

<<OUTER_BLOCK>>
DECLARE
var1 VARCHAR2(30):='outer_block';
var2 VARCHAR2(30):='value before inner block';
BEGIN
<<INNER_BLOCK>>
DECLARE
var1 VARCHAR2(30):='inner_block';
BEGIN
dbms_output.put_line(var1);
dbms_output.put_line(OUTER_BLOCK.var1); 
dbms_output.put_line(var2);
END;
var2:='value after inner block';
END;
/

Code Giải thích:

  • Code dòng 1: Đặt tên cho khối bên ngoài là “OUTER_BLOCK”.
  • Code dòng 3: Khai báo biến 'var1' là VARCHAR2 (30) với giá trị ban đầu là “outer_block”.
  • Code dòng 4: Khai báo biến 'var2' là VARCHAR2 (30) với giá trị ban đầu là “giá trị trước khối bên trong”.
  • Code dòng 6: Đặt tên cho khối bên trong là “INNER_BLOCK”.
  • Code dòng 8: Khai báo biến 'var1' trong khối bên trong là VARCHAR2 (30) với giá trị ban đầu là “inner_block”.
  • Code dòng 10: In ra giá trị của 'var1'. Vì không có nhãn nào được đề cập, theo mặc định nó sẽ lấy giá trị từ khối bên trong, do đó in ra thông báo 'inner_block'.
  • Code dòng 11: In ra giá trị của biến 'var1' trong khối ngoài. Vì khối trong có một biến cùng tên, nên ta tham chiếu đến nhãn của khối ngoài. Do đó, nó in ra thông báo 'outer_block'.
  • Code dòng 12: In ra giá trị của biến 'var2' trong khối bên ngoài. Vì không có biến nào có tên này trong khối bên trong, nên theo mặc định nó sẽ lấy giá trị từ khối bên ngoài, do đó in ra thông báo 'giá trị trước khối bên trong'.
  • Biến 'var2' trong khối bên ngoài được gán giá trị 'giá trị sau khối bên trong'. Nhưng việc gán này diễn ra sau khi khối bên trong được định nghĩa, do đó giá trị này không tồn tại bên trong khối bên trong.

Ví dụ 2: Trong ví dụ này, chúng ta tìm sự khác biệt giữa hai số, một số được khai báo trong khối bên ngoài và một số khác trong khối bên trong. Cả hai đều có cùng tên. Hãy xem nhãn khối hữu ích như thế nào trong việc tham chiếu đến các biến này.

Ảnh chụp màn hình bên dưới hiển thị Ví dụ 2, tính toán sự khác biệt giữa các biến khối bên ngoài và bên trong có cùng tên.

Ví dụ về cách tính hiệu giữa các biến khối bên ngoài và bên trong có cùng tên bằng cách sử dụng nhãn khối.

<<OUTER_BLOCK>>
DECLARE 
ln_val NUMBER :=5;
BEGIN
<<INNER_BLOCK>>
DECLARE 
ln_val NUMBER :=3;
BEGIN
dbms_output.put_line('The difference between outer block and inner block variable is:'||outer_block.ln_val-inner_block.ln_val);
END;
END;
/

Code Giải thích:

  • Code dòng 1: Đặt tên cho khối bên ngoài là “OUTER_BLOCK”.
  • Code dòng 3: Khai báo biến 'ln_val' kiểu NUMBER với giá trị ban đầu là “5”.
  • Code dòng 5: Đặt tên cho khối bên trong là “INNER_BLOCK”.
  • Code dòng 7: Khai báo biến 'ln_val' trong khối bên trong là kiểu NUMBER với giá trị ban đầu là “3”.
  • Code dòng 9: In ra sự khác biệt về giá trị của 'ln_val' giữa khối bên ngoài và khối bên trong. “ . Định dạng “ được sử dụng để tham chiếu đến các biến này nhằm tránh xung đột do tên biến trùng nhau.

Câu Hỏi Thường Gặp

Khối lồng nhau là một khối ẩn danh được đặt bên trong một khối khác và chạy nội tuyến tại vị trí nó xuất hiện. chương trình con (Thủ tục hoặc hàm) là một đơn vị có tên, có thể tái sử dụng, được lưu trữ riêng biệt và được gọi bằng tên, tùy chọn kèm theo tham số.

Mỗi khối có thể có phần xử lý ngoại lệ riêng. Ngoại lệ phát sinh trong khối bên trong sẽ được khối đó xử lý trước; nếu không được xử lý, nó sẽ lan truyền đến trình xử lý của khối bên ngoài bao quanh. Điều này cho phép bạn tách biệt việc xử lý lỗi cho từng khối.

PL/SQL không đặt ra giới hạn cố định nhỏ nào, vì vậy các khối lệnh có thể lồng nhau nhiều cấp độ. Trên thực tế, việc lồng nhau quá sâu làm giảm khả năng đọc hiểu mã, vì vậy hầu hết mã chỉ lồng nhau ở hai hoặc ba cấp độ và chuyển logic có thể tái sử dụng vào các chương trình con.

Nhãn khối, được viết dưới dạng tên trong dấu ngoặc kép trước câu lệnh DECLARE, dùng để đặt tên cho khối. Nhãn cho phép mã bên trong chỉ định biến bên ngoài dưới dạng label.variable_name và cũng có thể đóng vai trò là đích đến GOTO, giúp mã lồng nhau dễ đọc và dễ ghi chú hơn.

Đúng vậy. Một khối lồng nhau có thể xuất hiện ở bất kỳ đâu cho phép câu lệnh thực thi, bao gồm cả bên trong vòng lặp, nhánh IF hoặc thân thủ tục. Điều này cho phép bạn giới hạn phạm vi khai báo và xử lý ngoại lệ chỉ trong phần mã cần thiết.

Lồng nhau chủ yếu là một công cụ cấu trúc hóa ở giai đoạn biên dịch và bản thân nó không gây ra bất kỳ chi phí hoạt động đáng kể nào. Nó cải thiện khả năng đọc hiểu và khả năng cô lập lỗi. Lồng nhau quá sâu chủ yếu gây tốn kém về khả năng bảo trì hơn là tốc độ xử lý thô.

Vâng. Trợ lý GitHub Các bản nháp được dán nhãn là khối bên ngoài và bên trong, bao gồm các phần DECLARE, BEGIN và EXCEPTION, từ một bình luận. RevHãy xem nhãn khối và phạm vi biến để đảm bảo các biến bên trong và bên ngoài có cùng tên được hiểu đúng như mong muốn.

Các trợ lý AI phân tích các khối lồng nhau và gắn cờ các biến bị che khuất, các tham chiếu không hợp lệ và quyền truy cập nằm ngoài phạm vi. Quá trình đánh giá bằng máy học này làm nổi bật những nơi mà một khối bên trong âm thầm sử dụng biến có cùng tên nhưng không chính xác trước khi mã được thực thi.

Tóm tắt bài viết này với: