### Oracle存储过程详解:操作与应用实例 #### 存储过程概述 在Oracle数据库中,存储过程是一种预先编译并存储在数据库中的SQL程序块,它可以在数据库服务器上执行复杂的数据处理逻辑,如数据的增删改查、复杂的业务规则处理等。存储过程可以接受输入参数、返回输出参数,并且能够包含控制结构,如循环、条件判断等,从而实现更高级的数据处理功能。 #### 示例解析:员工解雇存储过程 以下是一个关于解雇员工的存储过程示例: ```sql CREATE OR REPLACE PROCEDURE FIRE_EMPLOYEE(p_empno IN NUMBER) AS v_ename EMP.ENAME%TYPE; BEGIN SELECT ename INTO v_ename FROM emp WHERE empno = p_empno; INSERT INTO FORMER_EMP(EMPNO, ENAME) VALUES (p_empno, v_ename); DELETE FROM emp WHERE empno = p_empno; UPDATE former_emp SET date_deleted = SYSDATE WHERE empno = p_empno; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Employee Number Not Found!'); END; ``` 这个存储过程实现了将指定员工从`emp`表中删除,并将其信息(包括编号和姓名)存入`FORMER_EMP`表中,同时记录该员工被解雇的时间。如果指定的员工号不存在于`emp`表中,则会抛出异常并提示“Employee Number Not Found!”。 #### 学生信息添加存储过程 接下来,我们看一个关于学生信息添加的存储过程: ```sql CREATE OR REPLACE PROCEDURE sp_add_stu ( p_stu_id t_stu.s_id%TYPE, p_s_name t_stu.s_name%TYPE, p_c_id t_class.c_id%TYPE ) AS num NUMBER; new_name t_stu.s_name%TYPE; BEGIN new_name := substr(trim(p_s_name), 1, 8); SELECT COUNT(*) INTO num FROM t_class c WHERE c.c_id = p_c_id; IF (num = 0) THEN INSERT INTO t_class(c_id, c_name) VALUES (p_c_id, 'New Class'); END IF; INSERT INTO t_stu(s_id, s_name, c_id, s_sex) VALUES (p_stu_id, new_name, p_c_id, '1'); COMMIT; DBMS_OUTPUT.PUT_LINE('执行成功'); END; ``` 此存储过程首先检查所给班级是否存在,如果不存在则创建一个新的班级。然后将学生信息插入到`t_stu`表中,其中学生的姓名会被截取前8个字符,性别默认设为“1”。提交事务并输出执行成功的消息。 #### 存储过程的调用与参数传递 存储过程可以通过多种方式调用,包括直接通过SQL语句或者通过编程语言(如Java)的JDBC接口。例如,在SQL中,可以使用`CALL`语句来调用存储过程: ```sql SQL> CALL sp_add_stu(800, '小明', 88); ``` 而在Java中,可以使用`CallableStatement`对象来调用存储过程: ```java Connection conn = null; CallableStatement cstmt = null; conn = DriverManager.getConnection(url, user, password); String procedure = "{call sp_add_stu(?, ?, ?)}"; cstmt = conn.prepareCall(procedure); cstmt.setString(1, "2000"); cstmt.setString(2, "小红"); cstmt.setString(3, "40"); cstmt.executeUpdate(); ``` 以上示例展示了如何在Java中调用一个带参数的存储过程。 #### 输出参数与游标的应用 存储过程还可以返回输出参数,这通常用于向调用者提供存储过程执行的结果。例如: ```sql CREATE OR REPLACE PROCEDURE sp_value( id1 IN NUMBER, id2 OUT NUMBER ) AS BEGIN id2 := id1 * 200; END; ``` 在Java中,可以通过`registerOutParameter`方法注册输出参数: ```java cstmt.registerOutParameter(2, java.sql.Types.INTEGER); cstmt.executeUpdate(); int value = cstmt.getInt(2); System.out.println("结果:" + value); ``` 此外,存储过程可以使用游标来返回查询结果集,这对于返回多行数据非常有用。例如: ```sql CREATE OR REPLACE PACKAGE TEST_PACKAGE AS TYPE Test_CURSOR IS REF CURSOR; END; CREATE OR REPLACE PROCEDURE sp_select_stu(p_c_id t_class.c_id%TYPE) AS cur_test TEST_PACKAGE.Test_CURSOR; BEGIN OPEN cur_test FOR SELECT * FROM t_stu WHERE c_id = p_c_id; END; ``` 在这个例子中,`sp_select_stu`存储过程使用了游标`cur_test`来返回满足条件的所有学生信息。 Oracle存储过程是数据库中一种强大的工具,它可以实现复杂的数据操作和业务逻辑处理。通过合理设计和使用存储过程,可以提高应用程序的性能、安全性和可维护性。
![ppt](https://img-home.csdnimg.cn/images/20241231044937.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![txt](https://img-home.csdnimg.cn/images/20241231045021.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![txt](https://img-home.csdnimg.cn/images/20241231045021.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![sql](https://img-home.csdnimg.cn/images/20250102104920.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![txt](https://img-home.csdnimg.cn/images/20241231045021.png)
AS
v_ename EMP.ENAME%TYPE;
BEGIN
SELECT ename INTO v_ename
FROM emp
WHERE empno=p_empno;
INSERT INTO FORMER_EMP(EMPNO,ENAME)
VALUES (p_empno,v_ename);
DELETE FROM emp
WHERE empno=p_empno;
UPDATE former_emp
SET date_deleted=SYSDATE
WHERE empno=p_empno;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Employee Number Not Found!');
END
存储过程:
・添加学生,如果班级不存在,则先添加班级信息,再添加学生。
create or replace procedure sp_add_stu
(
p_s_name t_stu.s_name%type,
p_c_id t_class.c_id%type
)
as
num number;
new_name t_stu.s_name%type;
begin
--处理姓名(如果不从查询结果取值,用 := )
new_name := substr(trim(p_s_name),1,8);
--将查询结果保存到变量,只能用select into
select count(*) into num from t_class c where c.c_id=p_c_id;
if(num=0) then
insert into t_class(c_id,c_name) values(p_c_id,'新班');
end if;
insert into t_stu(s_id,s_name,c_id,s_sex)
values(p_stu_id,new_name,p_c_id,'1');
commit;
dbms_output.put_line('执行完毕');
end;
-----------------在Oracle中调用(无返回值)-----------------
SQL> call sp_add_stu(800,'李小龙',88);
剩余7页未读,继续阅读
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
- 粉丝: 0
- 资源: 1
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
- #_ssm_127_mysql_私人书店管理系统_.zip
- #_ssm_128_mysql_网络安全与信息管理学院班级管理系统_.zip
- #_ssm_132_mysql_校园生活管理系统_.zip
- #_ssm_133_mysql_校园招聘信息管理系统_.zip
- #_ssm_135_mysql_新疆旅游管理系统_.zip
- #_ssm_139_mysql_一站式乡村服务系统wlw_.zip
- #_ssm_137_mysql_数据结构课堂学生考勤管理系统_.zip
- #_ssm_145_mysql_中学教务管理系统_.zip
- #_ssm_146_mysql_作业提交与批改程序_.zip
- #_ssm_147_mysql_毕业生离校管理系统_.zip
- #_ssm_151_mysql_在线汽车交易系统_.zip
- C++学习项目资料分享
- 利用ai漫改渐变国庆头像项目玩法教程,可一键生成风口赛道
- #_ssm_154_mysql_中小型超市管理系统_.zip
- 混剪德云语录项目玩法教程,带你揭秘流量密码
- Redis-Windows-8.0
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)