存储函数和过程

本文详细介绍了PL/SQL中的存储过程与函数的区别及应用,包括如何使用输入型和输出型参数,如何定义和调用存储过程及函数,特别关注了带有OUT型参数的函数的实现方式。

存储过程和函数
存储过程: 对一个模块的封装
函数: 功能几乎一样
区别:
函数必须通过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;

转载于:https://www.cnblogs.com/NCL--/p/7368051.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值