1.PLSQL 函数
在PLSQL中 函数通常与存储过程共同作用,以减少重复工作耗费的精力和时间
而函数本身提升了程序的运行效率
函数本身分为单行函数和组函数
除了第一阶段在Oracle里学到的数值函数、日期函数、字符函数外
在PLSQL中可以自定义函数 比如在游标中的B2C布尔函数 有效的让我们认识到了三种参数的使用
函数在数学中通常是指可以一对一,多对一,但是不能一对多的表达式
在PLSQL中函数作为一个具有返回值和可接受参数的程序体
就已经为函数做好了要求和规范
2.参数分类
2.1无参
CREATE OR REPLACE FUNCTION FUNC_NAME(PARAMETERS PARAM_TYPES) RETURN DATA_TYPE
--其中 PARAMETERS_TYPES 和 DATA_TYPE 都表示数据类型
--可以是基本数据类型、PLSQL数据类型(行类型,引用类型)、游标 、table类型
IS
BEGIN
END;
函数的调用也是两种
第一种是SELECT DUAL 调用
第二种是在PLSQL块中调用
--实例:编写一个函数
CREATE OR REPLACE FUNCTION FUNC_FIRST RETURN VARCHAR2 IS
V_STR VARCHAR2(10);
BEGIN
V_STR:=&STR;
RETURN V_STR;
END;--函数必须返回值 如果不返回值 会出警告:函数没有返回值
SELECT FUNC_FIRST FROM DUAL;
DECLARE
V_STR VARCHAR2(10);
BEGIN
V_STR:=FUNC_FIRST;
DBMS_OUTPUT.PUT_LINE(V_STR);--同时必须有接受值
END;
2.2有参有参依然分为 IN、OUT 和 IN OUT
--根据部门编号查询员工信息
2.2.1变量尝试
CREATE OR REPLACE FUNCTION FUN_EMP(V_DEPTNO NUMBER) RETURN EMP%ROWTYPE IS
V_EMP EMP%ROWTYPE;
BEGIN
SELECT * INTO V_EMP FROM EMP WHERE DEPTNO=V_DEPTNO;
RETURN V_EMP;
END;
DECLARE
V_EMP EMP%ROWTYPE;
BEGIN
V_EMP:=FUN_EMP(10);
DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME);--如果想要变量传递信息 则会报错:实际返回的行数超出请求行数
END;--所以只能用游标来操作
2.2.2游标尝试
--存储过程怎么
CREATE OR REPLACE PROCEDURE SP_1(V_DEPTNO NUMBER) IS
CUR SYS_REFCURSOR;
V_EMP EMP%ROWTYPE;
BEGIN
OPEN CUR FOR SELECT * FROM EMP WHERE DEPTNO=V_DEPTNO;
LOOP
EXIT WHEN CUR%NOTFOUND;
FETCH CUR INTO V_EMP;
IF CUR%NOTFOUND=FALSE THEN
DBMS_OUTPUT.PUT_LINE(V_EMP.EMPNO);
END IF;
END LOOP;
CLOSE CUR;
END;
DECLARE
BEGIN
SP_1(10);
END;
--函数怎么
CREATE OR REPLACE FUNCTION FUN_1(V_DEPTNO NUMBER) RETURN SYS_REFCURSOR IS
CUR SYS_REFCURSOR;
V_EMP EMP%ROWTYPE;
BEGIN
OPEN CUR FOR SELECT * FROM EMP WHERE DEPTNO=V_DEPTNO;
LOOP
EXIT WHEN CUR%NOTFOUND;
FETCH CUR INTO V_EMP;
IF CUR%NOTFOUND=FALSE THEN
DBMS_OUTPUT.PUT_LINE(V_EMP.EMPNO);
END IF;
END LOOP;
CLOSE CUR;
RETURN CUR;
END;
DECLARE
CUR SYS_REFCURSOR;
BEGIN
CUR:=FUN_1(10);--返回游标 所以赋值给游标 又因为函数已经打印过了 所以只调用
--也许是不规范的存储过程
--这个游标不能打开 在函数内部打开
END;