🔶 parameter types (in & out & in out)

در این بخش به معرفی انواع روش ارسال مقادیر پارامترها در توابع (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 مشخص کنیم که اینکار تاثیر مثبتی بر روی عملکرد برنامه دارد.

دانلود فایل pdf