در این بخش به معرفی انواع روش ارسال مقادیر پارامترها در توابع (functions) و رویه ها (procedures) پرداخته و مثالهای کاربردی از آن ارائه خواهم داد
پارامترهای برنامه ها میتوانند در سه نوع تعریف شوند
1️⃣ IN
2️⃣ OUT
3️⃣ IN OUT
حالت 1️⃣ برای مواقعی کاربرد دارد که میخواهیم پارامتر ارسالی به تابع یا رویه فقط جنبه ارسالی داشته باشد و مقدار پارامتر ارسال شده در داخل رویه قابل تغییر نیست
(نمیتوان داخل رویه مقدار پارامتر IN را تغییر داد) به مثال ذیل دقت نمایید
create or replace procedure param_in_sample(p_id pls_integer,
p_name varchar2 := ‘ali’) is
v_fname varchar2(100);
begin
dbms_output.put_line(p_id);
dbms_output.put_line(p_name);
end param_in_sample;
❇️ در این مثال رویه ای با نام param_in_sample وجود دارد که دارای دو پارامتر است
p_id
p_name: ali با مقدار پیش فرض
❇️ عملکرد رویه فوق به این صورت است که مقادیر پارامترهای وارد شده را در خروجی چاپ میکند
حال به مثالی از نحوه فراخوانی تابع فوق دقت نمایید
declare
/*1*/ v_id number := 120;
/*2*/ v_name varchar2(20) := ‘reza’;
begin
/*3*/ param_in_sample(p_id => v_id, p_name => v_name);
dbms_output.put_line(‘/****************/’);
/*4*/ param_in_sample(p_id => v_id);
end;
در فراخوانی رویه فوق به صورت زیر عمل شده است
در سطر /*1*/ متغیر v_id با مقدار اولیه 120 تعریف شده است
در سطر /*2*/ متغیر v_name با مقدار اولیه reza تعریف شده است
در سطر /*3*/ رویه param_in_sample با مقادیر متغیرهای v_id و v_name اجرا میشود
در سطر /*4*/ رویه param_in_sample با مقدار متغیر v_id اجرا میشود
❇️ خروجی مثال فوق به صورت زیر میباشد
120
reza
/****************/
120
ali
حالت 2️⃣ برای مواقعی کاربرد دارد که میخواهیم از مقدار پارامتر(هایی) که در داخل زیر برنامه (رویه یا تابع) تغییر یافته در خارج از زیر برنامه استفاده کنیم به مثال ذیل دقت نمایید
create or replace procedure param_out_sample(p_id out pls_integer,
p_name out varchar2) is
begin
p_id := 123 ;
p_name := ‘Ali’;
end param_out_sample;
❇️ عملکرد برنامه فوق به این صورت است که میتوان از مقدار پارامتر فرستاده شده نوع OUT است در خارج از رویه استفاده کرد
❇️ در رویه فوق دو پارامتر از نوع OUT با نامهای ذیل تعریف شده است
p_id
p_name
❇️ همانطوری که مشاهده میکنید برخلاف مثال قبلی در داخل رویه میتوان مقادیر پارامترهای ارسال شده را تغییر داد ، در مثال فوق p_id با عدد 123 جمع شده و پارامتر p_name هم با Ali مقدار دهی شده است
❇️ حال به مثالی از نحوه فراخوانی رویه فوق توجه نمایید
declare
/*1*/ v_id number;
/*2*/ v_name varchar2(20);
begin
/*3*/ param_out_sample(p_id => v_id, p_name => v_name);
/*4*/ dbms_output.put_line(v_id);
/*5*/ dbms_output.put_line(v_name);
end;
در فراخوانی رویه فوق به صورت زیر عمل شده است
در سطر /*1*/ متغیر v_id تعریف شده است
در سطر /*2*/ متغیر v_name تعریف شده است
در سطر /*3*/ متغیرهای v_id و v_name به رویه param_out_sample ارسال شده است
در سطر /*4*/ و در خارج از رویه مقدار متغیر v_id در خروجی چاپ شده است
در سطر /*5*/ و در خارج از رویه مقدار متغیر v_name در خروجی چاپ شده است
همانطوری که در مثال مشاهده میکنید باید متغیری که مقداراولیه ندارد ( intialize نشده است) را برای پارامتری که از نوع out تعریف شده است ارسال کنیم
❇️ خروجی مثال فوق به صورت زیر میباشد
123
Ali
حالت 3️⃣ برای مواقعی کاربرد دارد که میخواهیم مقدار متغیری که مقدار دهی شده است را در داخل رویه یا تابعی تغییر داده و مقدار تغییر یافته آن را در خارج از رویه دریافت کنیم ، به مثال ذیل ذقت نمایید
create or replace procedure param_inout_sample(p_id in out pls_integer) is
begin
p_id := p_id + 100;
end param_inout_sample;
❇️ در این مثال رویه ای با نام param_inout_sample وجود دارد که دارای یک پارامتر p_id است
❇️ عملکرد رویه فوق به این صورت است که مقدار پارامترهای وارد شده را با عدد 100 جمع میکند و به دلیل اینکه پارامتر تعریف شده از نوع in out تعریف شده است میتوانید از مقدار تغییر یافته آن را در خارج از رویه استفاده کنید
حال به مثالی از نحوه فراخوانی تابع فوق دقت نمایید
declare
/*1*/ v_id number := 120;
begin
/*2*/ param_inout_sample(p_id => v_id);
/*3*/ dbms_output.put_line(v_id);
end;
در فراخوانی رویه فوق به صورت زیر عمل شده است
در سطر /*1*/ متغیر v_id تعریف شده است
در سطر /*2*/ متغیرهای v_id به رویه param_inout_sample ارسال شده است
در سطر /*3*/ و در خارج از رویه مقدار متغیر v_id در خروجی چاپ شده است
همانطوری که در مثال مشاهده میکنید مقدار تغییر یافته متغیر v_id در خارج از رویه قابل استفاده میباشد
❇️ خروجی مثال فوق به عدد 120 میباشد
✅نکته 1: یکی از کاربرادهای پارامتر out همراه با sys_refcursor است که هنگام معرفی cusror ها راجع به آن توضیح خواهم داد
✅ نکته 2: زمانی که پارامتر فرستاده شده یک شی بزرگ است (recode یا collection) میتوانید با استفاده از عبارت NOCOPY روش ارسال آن را به صورت by refrence مشخص کنیم که اینکار تاثیر مثبتی بر روی عملکرد برنامه دارد.
برای مشاهده کامل مطلب کلیک کنید