PL/SQL 中的函数
函数可以用作 SQL 表达式的一部分,即我们可以将它们与选择/更新/合并命令一起使用。函数的一个最重要的特征是,与过程不同,它必须返回一个值。
创建函数的语法:
CREATE [OR REPLACE] FUNCTION function_name
[(parameter_name type [, ...])]
// this statement is must for functions
RETURN return_datatype
{IS | AS}
BEGIN
// program code
[EXCEPTION
exception_section;
END [function_name];
例子:
- 我们必须使用存在的函数找到学生的总强度
在学校的不同部门// first lets create a table create table section(s_id int, s_name varchar(20), strength int ); // Inserting values into table insert into section values(1, 'computer science', 20); insert into section values(2, 'portal', 45); insert into section values(3, 'geeksforgeeks', 60); // Defining function create or replace function totalStrength // Defining return type return integer as total integer:=0; begin // calculating the sum and storing it in total select sum(strength) into total from section; return total; // closing function end totalStrength; set serveroutput on; declare answer integer; begin answer:=totalstrength(); dbms_output.put_line('Total strength of students is ' || answer); end;
输出:
Total strength of students is 125
- 现在,让我们通过一个例子来演示声明、定义和调用一个简单的 PL/SQL
函数将计算并返回一个数字的倒数。set serveroutput on; declare a int; c int; n int; rev int:=0; r int; // Defining function function reverse_it( x IN int) return int as z int; // function code begin n := x; while (n > 0) loop r := mod(n, 10); rev := (rev * 10) + r; n := trunc(n / 10); end loop; z := rev; return z; end ; BEGIN a := 123456789; c := reverse_it(a); dbms_output.put_line('the reverse of number is ' || c); END;
输出:
the reverse of number is 987654321
- 让我们实现一个递归函数来计算一个数字的阶乘
递归函数示例:DECLARE num int; answer int; // Defining function FUNCTION factorial(x number) RETURN int IS f int; BEGIN IF x = 0 THEN f := 1; ELSE f := x * factorial(x - 1); END IF; RETURN f; END; BEGIN num := 5; answer := factorial(num); dbms_output.put_line(' Factorial of '|| num || ' is ' || answer); END;
输出:
Factorial of 5 is 120
- 可以在函数中使用异常块进行异常处理,但不能使用try-catch块进行异常处理。
例子:
set serveroutput on; declare a int; b float; myexp exception; function sqroot(x int) return float as answer float; begin if x < 0 then raise myexp; // pre-defined sqrt() to // calculate square root else answer := SQRT(x); end if; return answer; exception when myexp then dbms_output.put_line('square of negative number is not allowed so returning the same number'); return x; end; begin b := sqroot(-2); dbms_output.put_line('the value is '|| b); end;
输出:
square of negative number is not allowed so returning the same number the value is -2
好处:
- 我们可以对数据库进行一次调用以运行一个语句块,从而提高了多次运行 SQL 的性能。这将减少数据库和应用程序之间的调用次数。
- 我们可以将整体工作划分为小模块,这变得非常易于管理,也提高了代码的可读性。
- 它促进了可重用性。
- 它是安全的,因为代码保留在数据库中,因此对应用程序(用户)隐藏了内部数据库详细信息。用户只调用 PL/SQL 函数。因此,确保了安全性和数据隐藏。