### Oracle存储过程使用知识点
#### 一、存储过程概述
- **定义**:存储过程(Stored Procedure)是在数据库中预编译的一组SQL语句集合,它可以被当作一个单独的对象来调用,只需要指定存储过程的名字及参数(如果有的话)。在Oracle中,存储过程是一个重要的数据库对象,用于提升应用程序的性能和简化复杂的数据库操作。
- **优点**:
- **提高执行效率**:存储过程仅在创建时编译一次,后续调用无需再次编译,提高了执行速度。
- **简化复杂操作**:可以将涉及多个表的操作封装成存储过程,方便管理和复用。
- **重复使用**:存储过程可以被多次调用,减少了代码编写的工作量。
- **增强安全性**:可以通过权限管理限制对存储过程的访问,提高数据库的安全性。
#### 二、存储过程的创建
- **语法结构**:
```sql
CREATE [OR REPLACE] PROCEDURE 存储过程名称
(参数定义表)
IS | AS
变量定义
BEGIN
PL/SQL语句块
EXCEPTION
例外处理
END 存储过程名称;
```
- **参数定义表**:
- **IN**:数据从调用环境传入存储过程。
- **OUT**:数据从存储过程传回调用环境。
- **INOUT**:数据既可以传入也可以传出存储过程。
- **变量定义**:
- 变量类型可以是Oracle支持的任何类型,包括`%TYPE`和`%ROWTYPE`。
- **例外处理**:
- 与PL/SQL错误处理相同,可以根据不同的异常执行特定的操作。
#### 三、示例:创建一个为指定雇员增加薪水的存储过程
```sql
CREATE OR REPLACE PROCEDURE raise_sal(
emp_id IN NUMBER, -- 输入参数:员工ID
add_sal IN NUMBER -- 输入参数:增加的薪水
)
AS
BEGIN
UPDATE emp
SET sal = sal + add_sal
WHERE empno = emp_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- 处理找不到员工的情况
RAISE_APPLICATION_ERROR(-20011, 'Invalid Employee ID: ' || TO_CHAR(emp_id));
END raise_sal;
```
#### 四、存储过程的删除
- **语法**:
```sql
SQL> DROP PROCEDURE 过程名;
```
#### 五、游标(Cursor)
- **定义游标**:
- 用于处理查询结果集中多条记录的数据。
- 语法:`CURSOR 游标名称 IS SELECT 语句;`
- **打开游标**:
- 语法:`OPEN 游标名;`
- **提取数据**:
- 语法:`FETCH 游标名 INTO 变量列表;`
- **关闭游标**:
- 语法:`CLOSE 游标名;`
- **游标属性**:
- `%ISOPEN`:布尔型,表示游标是否打开。
- `%NOTFOUND`:布尔型,描述最后一次`FETCH`的结果。
- `%FOUND`:布尔型,描述最后一次`FETCH`的结果,与`%NOTFOUND`相反。
- `%ROWCOUNT`:数字型,描述当前取值的条数。
#### 六、示例:使用游标查询部门10的所有雇员信息
- **示例目的**:查询部门10的所有雇员的姓名和工资,并将这些信息插入到一个临时表`tmp`中。
- **表结构**:`tmp`表结构为`t1 char(20), t2 number(10)`。
- **实现方式**:使用三种不同的循环方法实现。
通过上述介绍,我们可以了解到Oracle存储过程的强大功能及其在实际应用中的重要意义。存储过程不仅可以帮助我们提高数据库操作的效率,还能简化复杂的业务逻辑处理,是Oracle数据库开发者不可或缺的一部分。