دسته بندی مقالات
- بیشتر -محصولات
- بیشتر -آخرین مقالات
- بیشتر --
Enumeration در سی شارپ
1403/09/01 -
پارتیشن بندی در پایگاه داده اوراکل
1403/08/30 -
Delegates در سی شارپ
1403/08/29 -
انواع ایندکس در پایگاه داده اوراکل
1403/08/28 -
سربارگذاری متدها در سی شارپ
1403/08/27
تابع (FUNCTION) در پایگاه داده اوراکل
معرفی تابع (Function) در پایگاه داده اوراکل
تابع (Function) در پایگاه داده اوراکل یکی از اجزای مهم PL/SQL است که به منظور انجام وظایف خاص و محاسباتی استفاده میشود.
توابع به عنوان بخشهای مستقل از کد نوشته میشوند که میتوانند در برنامهها و کوئریهای مختلف مورد استفاده قرار گیرند.
تفاوت اصلی توابع با پروسیجرها (Procedures) این است که توابع همیشه مقداری را برمیگردانند، در حالی که پروسیجرها نیازی به بازگرداندن مقدار ندارند.
تابعها علاوه بر بازگرداندن مقادیر، میتوانند پارامترهایی نیز دریافت کرده و عملیاتهای پیچیدهای را بر روی آنها انجام دهند.
ساختار کلی توابع در پایگاه داده اوراکل
برای تعریف یک تابع در پایگاه داده اوراکل، از دستور CREATE FUNCTION
استفاده میشود.
ساختار کلی توابع شامل قسمتهای زیر است:
-
نام تابع
نامی که برای تابع انتخاب میشود و از طریق آن فراخوانی خواهد شد. -
پارامترها
ورودیهای تابع که میتوانند دادههای مختلفی باشند. هر پارامتر دارای نوع دادهای است. -
بدنه تابع
منطق اصلی تابع در این قسمت قرار میگیرد و شامل دستوراتی است که روی پارامترها اعمال میشوند. -
مقدار بازگشتی
تابع همیشه باید یک مقدار بازگرداند و این مقدار میتواند از نوع دادههای مختلفی باشد (مثلاً عددی، متنی، تاریخی و ...).
مثال زیر یک تابع ساده در اوراکل را نشان میدهد که دو عدد را به عنوان ورودی میگیرد و حاصل جمع آنها را برمیگرداند:
CREATE OR REPLACE FUNCTION add_numbers (
num1 IN NUMBER,
num2 IN NUMBER
) RETURN NUMBER
IS
BEGIN
RETURN num1 + num2;
END;
در این مثال، تابع add_numbers دو پارامتر از نوع NUMBER دریافت میکند و حاصل جمع آنها را به عنوان خروجی برمیگرداند.
انواع توابع در پایگاه داده اوراکل
در پایگاه داده اوراکل، توابع را میتوان به دو دسته کلی تقسیم کرد:
-
توابع اسکالر
این توابع یک مقدار واحد را به عنوان خروجی برمیگردانند.
مانند توابعی که جمع، ضرب، میانگین یا هر عملیات دیگر را روی دادههای ورودی انجام میدهند. -
توابع جدولی (Table Functions)
این نوع توابع یک مجموعه از مقادیر (مانند جدول یا رکوردها) را برمیگردانند.
این توابع بیشتر در سناریوهایی که نیاز به پردازش دادههای زیادی دارند استفاده میشوند.
پارامترهای ورودی توابع
در توابع اوراکل، پارامترها به سه روش تعریف میشوند:
-
IN
این نوع پارامترها تنها برای ورود داده به تابع استفاده میشوند.
مقادیری که به عنوان ورودی به تابع داده میشوند در طول اجرای تابع تغییر نمیکنند. -
OUT
پارامترهای OUT برای خروجی تابع استفاده میشوند.
این پارامترها مقادیری را که تابع تولید میکند به برنامه فراخوان برمیگردانند. -
IN OUT
این پارامترها میتوانند هم برای ورودی و هم برای خروجی استفاده شوند.
مقدار اولیهای که به تابع داده میشود میتواند در طول اجرای تابع تغییر کند و در نهایت مقدار تغییر یافته به عنوان خروجی بازگردانده شود.
مثال از تابعی که از پارامترهای IN OUT استفاده میکند:
CREATE OR REPLACE FUNCTION increment_value (
num IN OUT NUMBER
) RETURN NUMBER
IS
BEGIN
num := num + 1;
RETURN num;
END;
در این مثال، پارامتر num هم به عنوان ورودی و هم به عنوان خروجی استفاده میشود.
مقدار آن افزایش یافته و سپس به عنوان خروجی بازگردانده میشود.
مزایای استفاده از توابع در پایگاه داده
استفاده از توابع در پایگاه داده اوراکل مزایای متعددی دارد که در زیر به برخی از آنها اشاره میکنیم:
-
افزایش قابلیت استفاده مجدد
توابع به صورت مستقل از کدهای دیگر نوشته میشوند و میتوان آنها را بارها و بارها در بخشهای مختلف برنامه فراخوانی کرد.
این کار باعث میشود که نیازی به تکرار کدهای مشابه نباشد و نگهداری کد نیز آسانتر شود. -
افزایش خوانایی کد
با تقسیم کد به توابع مختلف، کد خواناتر و سادهتر میشود.
این موضوع به توسعهدهندگان کمک میکند تا بتوانند به راحتی کد را درک و تغییر دهند. -
بهبود عملکرد
توابع به دلیل بهینهسازیهای داخلی پایگاه داده اوراکل میتوانند کارایی بالاتری داشته باشند.
اوراکل به صورت خودکار برخی از توابع را کش (Cache) میکند و این کار باعث بهبود سرعت اجرای توابع میشود. -
مدیریت بهتر خطاها
توابع میتوانند شامل بخشهایی برای مدیریت خطا باشند که این موضوع باعث افزایش پایداری برنامهها و جلوگیری از بروز مشکلات پیشبینی نشده میشود.
استفاده از توابع در کوئریهای اوراکل
یکی از ویژگیهای مهم توابع در اوراکل این است که میتوان آنها را به راحتی در کوئریهای اوراکل استفاده کرد.
این توابع میتوانند به عنوان بخشی از عبارات SELECT، WHERE، ORDER BY و حتی GROUP BY مورد استفاده قرار گیرند.
به عنوان مثال، فرض کنید تابعی داریم که نرخ مالیات را محاسبه میکند و میخواهیم از آن در یک کوئری استفاده کنیم:
SELECT employee_id, salary, calculate_tax(salary) AS tax
FROM employees;
در این مثال، تابع calculate_tax بر اساس حقوق هر کارمند مالیات را محاسبه کرده و به عنوان ستون جدیدی در نتیجه کوئری نمایش میدهد.
توابع DETERMINISTIC در اوراکل
در اوراکل، اگر یک تابع برای ورودیهای یکسان همیشه خروجی یکسانی برگرداند، میتوان آن را به عنوان تابع DETERMINISTIC تعریف کرد.
این ویژگی به اوراکل این امکان را میدهد که نتایج تابع را کش کرده و در فراخوانیهای بعدی از نتایج ذخیره شده استفاده کند.
این کار باعث بهبود کارایی به ویژه در کوئریهای پیچیده میشود.
مثال:
CREATE OR REPLACE FUNCTION get_square (
num IN NUMBER
) RETURN NUMBER DETERMINISTIC
IS
BEGIN
RETURN num * num;
END;
در اینجا تابع get_square همیشه برای ورودی یکسان، خروجی یکسانی برمیگرداند.
بنابراین، با علامتگذاری آن به عنوان DETERMINISTIC، اوراکل میتواند نتایج آن را کش کرده و از نتایج ذخیره شده در فراخوانیهای بعدی استفاده کند.
محدودیتها و مشکلات توابع
با وجود مزایای متعدد توابع، برخی محدودیتها نیز وجود دارند:
-
عدم امکان تغییر دادهها در توابع
در اوراکل، توابع نمیتوانند مستقیماً تغییرات پایدار در پایگاه داده ایجاد کنند.
به عنوان مثال، توابع نمیتوانند دستور INSERT، UPDATE یا DELETE را اجرا کنند، مگر اینکه تابع درون یک تراکنش PL/SQL فراخوانی شود. -
محدودیت در بازگرداندن چندین مقدار
توابع به صورت مستقیم تنها میتوانند یک مقدار واحد را بازگردانند.
اگر نیاز به بازگرداندن چندین مقدار باشد، باید از روشهای دیگری مانند استفاده از OUT پارامترها یا رکوردها استفاده کرد. -
کاهش کارایی در شرایط نامناسب
اگر توابع به درستی طراحی نشوند یا برای عملیاتهای سنگین بهینهسازی نشوند، ممکن است منجر به کاهش کارایی شوند.
توابع و مدیریت خطاها
در اوراکل، توابع میتوانند شامل بخش مدیریت خطا (Exception Handling) باشند.
این بخش به توسعهدهندگان اجازه میدهد که خطاهای احتمالی را کنترل کرده و از بروز مشکلات غیرمنتظره جلوگیری کنند.
برای مثال، اگر در یک تابع تقسیم بر صفر رخ دهد، میتوان آن را به صورت زیر مدیریت کرد:
CREATE OR REPLACE FUNCTION divide_numbers (
num1 IN NUMBER,
num2 IN NUMBER
) RETURN NUMBER
IS
result NUMBER;
BEGIN
result := num1 / num2;
RETURN result;
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('Division by zero error');
RETURN NULL;
END;
دوره های مرتبط
اموزش پایگاه داده اوراکل Oracle
در دوره آموزش پایگاه داده اوراکل اصول ، مفاهیم ، طراحی ، پیادهسازی و مدیریت پایگاه داده را به صورت جامع آموزش می دهیم .