در این قسمت تابع (FUNCTION) در PL/SQL را توضیح می دهیم. تابع از هر لحاظ مانند پروسیجر است با این تفاوت که برخلاف پروسیجر، یک مقدار برگردانده می شود.
بنابراین تمام مطالبی که در قسمت هفتم آموزش PL/SQL توضیح داده شد در مورد تابع نیز صادق است.
ایجاد تابع
با استفاده از دستور CREATE FUNCTION می توان یک تابع از نوع STANDALONE ایجاد کرد. در ادامه سینتکس ساخت تابع را می بینید.
CREATE [OR REPLACE] FUNCTION function_name
[(parameter_name [IN | OUT | IN OUT] type [, …])]
RETURN return_datatype
{IS | AS}
BEGIN
< function_body >
END [function_name];
این سینتکس همانند دستور ساخت پروسیجر است با این تفاوت که توسط دستور اجباری RETURN یک مقدار با نوع داده خاص به برنامه فراخواننده بازگردانی می شود.
مثال: تعداد کل مشتریان را از جدول COSTUMERS بشمارید و در متغیر TOTAL قرار دهید و توسط تابع totalCustomers برگردانید.
Select * from customers;
+—-+———-+—–+———–+———-+
| ID | NAME | AGE | ADDRESS | SALARY |
+—-+———-+—–+———–+———-+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+—-+———-+—–+———–+———-+
CREATE OR REPLACE FUNCTION totalCustomers
RETURN number IS
total number(2) := 0;
BEGIN
SELECT count(*) into total FROM customers;
RETURN total;
END;
/
Function created.
مثال: تابع ()total_costumer را از یک بلاک ANONYMOUS فراخوانی کنید و مقدار برگشتی را در متغیر C ذخیره کنید.
DECLARE
c number(2);
BEGIN
c := totalCustomers();
dbms_output.put_line(‘Total no. of Customers: ‘ || c);
END;
/
خروجی:
Total no. of Customers: 6
PL/SQL procedure successfully completed.
مثال: بین دو مقدار ورودی مقدار حداکثر را محاسبه کنید و نمایش دهید.
DECLARE
a number;
b number;
c number;
FUNCTION findMax(x IN number, y IN number)
RETURN number
IS
z number;
BEGIN
IF x > y THEN
z:= x;
ELSE
Z:= y;
END IF;
RETURN z;
END;
BEGIN
a:= 23;
b:= 45;
c := findMax(a, b);
dbms_output.put_line(‘ Maximum of (23,45): ‘ || c);
END;
/
خروجی:
Maximum of (23,45): 45
PL/SQL procedure successfully completed.
توابع از نوع RECURSIVE یا بازگشتی
همانطور که می دانید یک برنامه یا زیربرنامه می تواند زیربرنامه های دیگر را فراخوانی کند ولی زمانی که یک زیربرنامه خودش را فراخوانی می کند به این عمل RECURSIVE می گویند.
مثال: فاکتوریل عدد ورودی n را محاسبه کنید و برگردانید.
n! = n*(n-1)!
= n*(n-1)*(n-2)!
…
= n*(n-1)*(n-2)*(n-3)… 1
DECLARE
num number;
factorial number;
FUNCTION fact(x number)
RETURN number
IS
f number;
BEGIN
IF x=0 THEN
f := 1;
ELSE
f := x * fact(x-1);
END IF;
RETURN f;
END;
BEGIN
num:= 6;
factorial := fact(num);
dbms_output.put_line(‘ Factorial ‘|| num || ‘ is ‘ || factorial);
END;
/
خروجی:
Factorial 6 is 720
PL/SQL procedure successfully completed.