Oracle函数及流程控制语句

时间:2022-09-08 17:04:17

函数的基本语法

CREATE OR REPLACE FUNCTION "AT" 
(p1 IN NUMBER,p2 IN NUMBER)
RETURN VARCHAR2
/** AS和IS没区别 **/
AS
BEGIN
    /** 创建局部变量写法 **/
    DECLARE
        res VARCHAR2(20);
    BEGIN
        res := 'First Test!';
        
        RETURN res;
    END;
END;
SELECT AT(1,2) FROM DUAL

流程控制语句

CREATE OR REPLACE FUNCTION "AT" 
(p1 IN NUMBER,p2 IN NUMBER)
RETURN VARCHAR2
AS BEGIN
  DECLARE
        res VARCHAR2(500);
    BEGIN
        res := 'First Test!';
        
    /** if语句 **/
    IF p1=0 THEN res := CONCAT(res,'p1==0;');
    ELSE res := CONCAT(res,'p1!=0;');
    END IF;
    
    /** case...when... 类似于switch语句 **/
    CASE p1
    WHEN 0 THEN res := CONCAT(res,'p1==0;');
    ELSE res := CONCAT(res,'p1!=0;');
    END CASE;
    
    /** LOOP基本结构,可以不使用别名,使用EXIT结束循环 **/
    <<loop1>>
    LOOP
      --TODO STH
      EXIT loop1 when 1>0;
    END LOOP;
    
    /** for循环 **/
    DECLARE
    BEGIN
      FOR i IN 1..3 LOOP
        --TODO STH
        res := CONCAT(res,'');
      END LOOP;
    END;
  
    /** 带参数的循环,EXIT...WHEN...类似于do...while...语句 **/
    DECLARE
      i NUMBER:=0;
    BEGIN
      <<loop2>>
      LOOP
        i := i + 1;
        --TODO STH
        EXIT loop2 when i>3;
      END LOOP;
    END;
    
    /** 使用CONTINUE跳过本次循环 **/
    DECLARE
      i NUMBER:=0;
    BEGIN
      <<loop3>>
      LOOP
        i := i + 1;
        IF i<3 THEN CONTINUE;
        ELSE EXIT loop3;
        END IF;
      END LOOP;
    END;
    
    /** while...loop...语句,同其它语言的while循环 **/
    DECLARE
      i NUMBER:=0;
    BEGIN
      WHILE i<3
      LOOP
        i := i + 1;
        --TODO STH
      END LOOP;
    END;
         
        RETURN res;
    END;
END;

Out参数的使用

 /** 如果参数包含多个返回值,可以使用带out的函数 **/
CREATE OR REPLACE FUNCTION "AOUT"
(P1 OUT NUMBER,P2 OUT NUMBER)
RETURN NUMBER
AS BEGIN
  P1:=1;
  P2:=2;
  RETURN 0;
END;
/** 带out的函数不方便在SELECT语句中直接使用,最好在存储过程或者其它自定义函数中加工一下 **/
CREATE OR REPLACE FUNCTION "BOUT"
RETURN NUMBER
AS BEGIN
  DECLARE
    RES1 NUMBER;RES2 NUMBER;P1 NUMBER;
  BEGIN
    P1 := AOUT(RES1,RES2);
    RETURN RES1+RES2;
  END;
END;


SELECT BOUT() FROM DUAL;