函数的基本语法
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;