存储过程和函数
存储过程: 对一个模块的封装
函数: 功能几乎一样
区别:
函数必须通过return 关键字返回一个值
存储过程:
不需要return返回值
参数:
输入型参数
输出型参数
8.15
DECLARE
c student%ROWTYPE;
CURSOR c_cursor IS SELECT * FROM student ;
BEGIN
OPEN c_cursor;
LOOP
FETCH c_cursor INTO c;
EXIT WHEN c_cursor%NOTFOUND;
dbms_output.put_line(c.sname);
END LOOP;
CLOSE c_cursor;
END;
DECLARE
i NUMBER;
a student.sname%TYPE;--引用类型
b student%ROWTYPE;--记录类型
BEGIN
i:=107;
*SELECT s.sname INTO a FROM student s WHERE s.sno=i;
dbms_output.put_line('查询结果:'||a);*
SELECT * INTO b FROM student s WHERE s.sno=i;
dbms_output.put_line('查询结果:'||b.sbirthday);
END;
--25. 关于 OUT 型的参数: 因为函数只能有一个返回值, PL/SQL 程序可以通过 OUT 型的参数实现有多个返回值 --要求: 定义一个函数: 获取给定部门的工资总和 和 该部门的员工总数(定义为 OUT 类型的参数). --要求: 部门号定义为参数, 工资总额定义为返回值. CREATE OR REPLACE FUNCTION sal_func1(p_id IN NUMBER,total_count OUT NUMBER) RETURN NUMBER AS sum_sal NUMBER(10); CURSOR sal_cursor IS SELECT sal FROM p_emp p WHERE p.deptno=p.id; BEGIN total_count:=0; FOR c IN sal_cursor LOOP sum_sal:=sum_sal+c.sal; total_count:=total_count+1; END LOOP; RETURN sum_sal; END;
调用:
SQL> set serveroutput on SQL> SQL> declare 2 -- Local variables here 3 i integer; 4 a NUMBER; 5 begin 6 a:= sal_func1(10,i); 7 dbms_output.put_line(i); 8 end; 9 /
存储函数:
--22.2 返回一个"helloworld: atguigu"的字符串,其中atguigu 由执行函数时输入。
CREATE OR REPLACE FUNCTION hello_world(v_logo varchar2)
RETURN VARCHAR2
AS
BEGIN
RETURN 'helloworld'||v_logo;
END;
--22.3 创建一个存储函数,返回当前的系统时间
CREATE OR REPLACE FUNCTION sys_date
RETURN DATE
AS
v_date varchar2(20);
BEGIN
v_date:=SYSDATE;
SELECT SYSDATE INTO v_date FROM dual;
dbms_output.put_line('aaaa');
RETURN v_date;
END;
--23. 定义带参数的函数: 两个数相加
CREATE OR REPLACE FUNCTION add_func(a NUMBER,b NUMBER)
RETURN NUMBER
AS
c NUMBER;
BEGIN
c:=a+b;
RETURN c;
END;
--24. 定义一个函数: 获取给定部门的工资总和, 要求:部门号定义为参数, 工资总额定义为返回值. 别名不能和关键字重名
CREATE OR REPLACE FUNCTION sal_func(p_id NUMBER)
RETURN NUMBER
AS
SUM_sal NUMBER(10);
CURSOR sal_cursor IS SELECT sal FROM p_emp p WHERE p.deptno=p_id;
BEGIN
FOR c IN sal_cursor LOOP
SUM_sal := SUM_sal + c.sal;
END LOOP;
RETURN SUM_sal;
END;
--25. 关于 OUT 型的参数: 因为函数只能有一个返回值, PL/SQL 程序可以通过 OUT 型的参数实现有多个返回值
--要求: 定义一个函数: 获取给定部门的工资总和 和 该部门的员工总数(定义为 OUT 类型的参数).
--要求: 部门号定义为参数, 工资总额定义为返回值.
CREATE OR REPLACE FUNCTION sal_func1(p_id IN NUMBER,total_count OUT NUMBER)
RETURN NUMBER
AS
sum_sal NUMBER(10);
CURSOR sal_cursor IS SELECT sal FROM p_emp p WHERE p.deptno=p.id;
BEGIN
total_count:=0;
FOR c IN sal_cursor LOOP
sum_sal:=sum_sal+c.sal;
total_count:=total_count+1;
END LOOP;
RETURN sum_sal;
END;