📜  PL/SQL 中的函数

📅  最后修改于: 2022-05-13 01:54:22.903000             🧑  作者: Mango

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];

例子:

  1. 我们必须使用存在的函数找到学生的总强度
    在学校的不同部门
    // 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
    
  2. 现在,让我们通过一个例子来演示声明、定义和调用一个简单的 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
    
  3. 让我们实现一个递归函数来计算一个数字的阶乘
    递归函数示例:
    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
    
  4. 可以在函数中使用异常块进行异常处理,但不能使用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
    
    

好处:

  1. 我们可以对数据库进行一次调用以运行一个语句块,从而提高了多次运行 SQL 的性能。这将减少数据库和应用程序之间的调用次数。
  2. 我们可以将整体工作划分为小模块,这变得非常易于管理,也提高了代码的可读性。
  3. 它促进了可重用性。
  4. 它是安全的,因为代码保留在数据库中,因此对应用程序(用户)隐藏了内部数据库详细信息。用户只调用 PL/SQL 函数。因此,确保了安全性和数据隐藏。