Phạm vi biến PL/SQL & Khối bên trong bên ngoài: Cấu trúc lồng nhau
Khối lồng nhau là gì Oracle?
Trong PL/SQL, mỗi khối có thể được lồng vào một khối khác. Chúng được gọi là một khối lồng nhau. Các khối lồng nhau rất phổ biến khi chúng ta muốn thực hiện một quy trình nhất định, đồng thời, mã của các quy trình này phải được giữ trong một thùng (khối) riêng biệt.
Khái niệm khối lồng nhau sẽ giúp lập trình viên cải thiện khả năng đọc bằng cách phân tách những thứ phức tạp thành từng khối và xử lý ngoại lệ cho từng khối bên trong khối ngoài chính.
Cấu trúc khối lồng nhau
Một khối có thể được lồng vào một khối khác. Điều này có thể được lồng trong phần thực thi hoặc trong xử lý ngoại lệ phần. Khối này cũng có thể được dán nhãn. Một khối bên ngoài có thể chứa nhiều khối bên trong. Mỗi khối bên trong một lần nữa là một Khối PL/SQL, do đó tất cả các thuộc tính và đặc điểm của khối bên trong sẽ giống như khối bên ngoài. Hình ảnh bên dưới minh họa cấu trúc khối lồng nhau. Khối cha là khối chính và khối con là khối lồng nhau.
Dưới đây là cú pháp cho khối lồng nhau.
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 hiển thị khối lồng nhau chứa tổng cộng hai khối.
- Các khối này được gắn nhãn là 'outer_block' và 'inner_block'
Phạm vi trong Khối lồng nhau: Phạm vi thay đổi
Trong khối lồng nhau, người ta 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 ở khối bên trong, các phần tử từ cả khối bên ngoài và khối bên trong sẽ được hiển thị. Do đó, cần phải hiểu đúng về điều này.
Các điểm dưới đây sẽ tóm tắt thêm về phạm vi trong các khối lồng nhau.
- Các phần tử được khai báo ở khối bên ngoài và giá trị được xác định trước khi định nghĩa khối bên trong sẽ hiển thị bên trong khối bên trong.
- Các phần tử được khai báo ở khối bên trong sẽ không hiển thị ở khối bên ngoài. Chúng chỉ hiển thị trong khối bên trong.
- Khối bên ngoài và khối bên trong có thể có một biến có cùng tên.
- Trong trường hợp các biến có cùng tên, khối bên trong theo mặc định sẽ chỉ tham chiếu đến biến được khai báo trong khối bên trong.
- Nếu khối bên trong muốn tham chiếu biến khối bên ngoài có cùng tên với biến khối bên trong thì khối bên ngoài phải được GHI NHÃN và biến khối bên ngoài có thể được gọi là ' . '
Ví dụ dưới đây sẽ giúp hiểu thêm về các phạm vi này.
Ví dụ 1: Trong ví dụ này, chúng ta sẽ xem phạm vi của các biến trong khối bên trong và bên ngoài. Ngoài ra, chúng ta sẽ xem cách tham chiếu các biến bằng nhãn khối.
<<OUTER_BLOC>> DECLARE varl VARCHAR2(30):='outer_block'; var2 VARCHAR2(30):='value before inner block’; BEGIN <<NNER_BLOCK>> DECLARE varl VARCHAR2(30):='inner_block'; BEGIN dbms_output.put_line(varl), dbms_output.put_line(OUTER_BLOCKvar1); dbms_output.put_line(var2); END; var2:='value after inner block'; END; /
Giải thích mã:
- Dòng mã 1: Dán nhãn khối bên ngoài là “OUTER_BLOCK”.
- Dòng mã 3: Khai báo biến 'var1' là VARCHAR2 (30) với giá trị ban đầu là “khối bên ngoài”.
- Dòng mã 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”.
- Dòng mã 6: Gắn nhãn khối bên trong là “INNER_BLOCK”
- Dòng mã 8: Khai báo biến 'var1' trong khối bên trong là VARCHAR2 (30) với giá trị ban đầu là “khối bên trong”.
- Dòng mã 10: In giá trị của 'var1'. Vì không có nhãn nào được đề cập theo mặc định nên nó sẽ lấy giá trị từ khối bên trong, do đó in ra thông báo 'inner_block'.
- Dòng mã 11: In giá trị của biến khối bên ngoài 'var1'. Vì khối bên trong có biến có cùng tên nên chúng ta cần tham chiếu đến nhãn khối bên ngoài. Do đó in thông báo 'khối bên ngoài'.
- Dòng mã 12: In giá trị của biến khối bên ngoài 'var2'. 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 thông báo 'giá trị trước khối bên trong'.
- Biến 'var2' ở khối bên ngoài đã được gán giá trị 'giá trị sau khối bên trong'. Nhưng nhiệm vụ này đã xảy ra sau khi định nghĩa khối bên trong. Do đó giá trị này không có trong khối bên trong.
Ví dụ 2: Trong ví dụ này, chúng ta sẽ tìm sự khác biệt giữa hai số, một số được khai báo ở khối bên ngoài và một số khác ở khối bên trong. Cả hai sẽ có cùng tên. Hãy xem block label hữu ích như thế nào trong việc giới thiệu các biến này.
<<OUTER_BLOC>> DECLARE ln_val NUMBER :=5; BEGIN <<INNERBLOC>> 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; /
Giải thích mã:
- Dòng mã 1: Dán nhãn khối bên ngoài là “OUTER_BLOCK”.
- Dòng mã 3: Khai báo biến 'ln_val' là NUMBER với giá trị ban đầu là “5”.
- Dòng mã 5: Gắn nhãn khối bên trong là “INNER_BLOCK”
- Dòng mã 7: Khai báo biến 'ln_val' trong khối bên trong là NUMBER với giá trị ban đầu là “3”.
- Dòng mã 9: In sự khác biệt về giá trị của 'ln_val' từ khối bên ngoài và bên trong. Các " . Định dạng ” được sử dụng để chỉ các biến này nhằm tránh xung đột do có cùng tên biến.
Tổng kết
Trong hướng dẫn này, chúng ta đã học cách tạo một khối lồng nhau và cách xử lý phạm vi trong khối bên trong và khối bên ngoài. Chúng ta cũng đã thấy một ví dụ trong đó các biến từ khối bên trong và bên ngoài được tham chiếu bên trong khối bên trong.