اوراکل اپکس- variable-scope-pl/sql

 

PL/SQL variable scope در اوراکل

 

هر Scope شامل یک Begin-End می باشد که به آن Block هم گفته می شود . حال می توان در داخل یک Scope یک Scope دیگر نیز داشته باشیم. این مورد در زبانهای برنامه نویسی دیگر هم مانند Java,.NET و … هم صادق می باشد.
برای درک بهتر این موضوع با چند مثال این موضوع را بررسی می کنیم. همچنین در مثال های زیر می توان وراثت در قسمت های زیر مجموعه (inherited in sub-units) در اوراکل را نیز مشاهده کنید.
در مثال اول در اوراکل دو تا Block وجود دارد که یکی از آنها بصورت داخلی می باشد یا به اصطلاح Nested block نیز در اوراکل گفته می شود که مقادیر را از Block بالایی خود به ارث می برد.
declare
v_var NUMBER;
begin
v_var := 2;
dbms_output.put_line(v_var);
begin
dbms_output.put_line('Entering nested block');
dbms_output.put_line(v_var);
v_var := 3;
dbms_output.put_line(v_var);
dbms_output.put_line('Exiting nested block');
end;
dbms_output.put_line(v_var);
end;

Result:
2
Entering nested block
2
3
Exiting nested block
3
در مثال دوم هیج variable در Sub-Unit با نام bar تعریف نشده است و مقدار متغیر v_var داخل پروسیجر در Oracle تغییر پیدا می کند و طبعا خارج از پروسیجر هم مقدار تغییر پیدا کرده است.
declare
v_var NUMBER;
procedure bar
as
begin
dbms_output.put_line('Entering bar');
dbms_output.put_line(v_var);
v_var := 4;
dbms_output.put_line(v_var);
dbms_output.put_line('Exiting bar');
end bar;

begin
v_var := 2;
dbms_output.put_line(v_var);
bar();
dbms_output.put_line(v_var);
end;

Result:
2
Entering bar
2
4
Exiting bar
4
در مثال سوم variable همنام با سطح خارجی در Sub-Unit با نام bar تعریف می شود و مقدار متغیر v_var داخل پروسیجر تغییر پیدا می کند و لی در خارج از پروسیجر در اوراکل مقدار آن از scope خارجی که قبلا مقداردهی شده برگردانده می شود.
declare
v_var NUMBER;
procedure bar
as
v_var NUMBER;
begin
dbms_output.put_line('Entering bar');
v_var := 5;
dbms_output.put_line(v_var);
dbms_output.put_line('Exiting bar');
end bar;

begin
v_var := 2;
dbms_output.put_line(v_var);
bar();
dbms_output.put_line(v_var);
end;

Result:
2
Entering bar
5
Exiting bar
2
در مثال چهارم می توانید از تکنیک Label در اوراکل برای برگرداندن مقادیر variable در داخل و خارج از scope استفاده کرد.
«main»
declare
v_var NUMBER;
procedure bar
as
v_var NUMBER;
begin
dbms_output.put_line('Entering bar');
v_var := 5;
dbms_output.put_line('anonymous v_var: ' || main.v_var);
dbms_output.put_line('bar v_var: ' || bar.v_var);--can do bar.v_var or just v_var
dbms_output.put_line('Exiting bar');
end bar;
begin
v_var := 2;
bar();
dbms_output.put_line(v_var);
end;
Result:
Entering bar
anonymous v_var: 2
bar v_var: 5
Exiting bar
2

 

5/5 - (1 امتیاز)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این قسمت نباید خالی باشد
این قسمت نباید خالی باشد
لطفاً یک نشانی ایمیل معتبر بنویسید.

keyboard_arrow_up
Oracle APEX Capabilities (OAC)