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;
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:
۲
Entering nested block
۲
۳
Exiting nested block
۳
Result:
۲
Entering nested block
۲
۳
Exiting nested block
۳
در مثال دوم هیج 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;
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;
begin
v_var := 2;
dbms_output.put_line(v_var);
bar();
dbms_output.put_line(v_var);
end;
Result:
۲
Entering bar
۲
۴
Exiting bar
۴
Result:
۲
Entering bar
۲
۴
Exiting bar
۴
در مثال سوم 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;
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;
begin
v_var := 2;
dbms_output.put_line(v_var);
bar();
dbms_output.put_line(v_var);
end;
Result:
۲
Entering bar
۵
Exiting bar
۲
Result:
۲
Entering bar
۵
Exiting bar
۲
در مثال چهارم می توانید از تکنیک 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;
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
۲
Entering bar
anonymous v_var: 2
bar v_var: 5
Exiting bar
۲
5/5 - (1 امتیاز)
جستجو
مطالب اخیر
نظرات اخیر
- مهرسا سعادت در نقشه راه اوراکل APEX برای نسخه بعدی
- سعید حسن پور در رفع مشکل Persian Date Picker برای اوراکل ایپکس(اپکس) ۲۱
- حسین ابراهیم زاده در رفع مشکل Persian Date Picker برای اوراکل ایپکس(اپکس) ۲۱
- مهدی جوینی در رفع مشکل Persian Date Picker برای اوراکل ایپکس(اپکس) ۲۱
- محمد در نصب و راه اندازی (Standalone) اوراکل APEX
بایگانی
- اردیبهشت ۱۴۰۱ (۱)
- مرداد ۱۴۰۰ (۱)
- شهریور ۱۳۹۹ (۱)
- بهمن ۱۳۹۸ (۱)
- دی ۱۳۹۸ (۶)
- آذر ۱۳۹۸ (۲۰)
- آبان ۱۳۹۸ (۱۶)
- مهر ۱۳۹۸ (۲۲)
- شهریور ۱۳۹۸ (۲)
- مرداد ۱۳۹۸ (۷)
- تیر ۱۳۹۸ (۹)
- فروردین ۱۳۹۸ (۳)
برچسبها
AOP
APEX
apexrad
captcha
CDN
constraint
ebs
epg
forms
index
injection
longtype
Materialized-view
Oracle Application Express
orclapex
performance
Persian Sort
plsql
session
sql
standalone
variable scope
XE
امنیت
اوراکل
اپکس
ایندکس
ایپکس
بنبست
بهینه ساز
تاریخ شمسی
ترجمه
ترفند
حروف فارسی
داکیومنت
داینامیک
شمسی
مرتب سازی فارسی
نصب
نکته
پلاگین
یونیک