本教程详细介绍如何在Oracle数据库中使用PL/SQL编写和执行存储过程,涵盖创建、读取、更新及删除记录的基本操作。
在Oracle数据库环境中,存储过程是一种预编译的代码块,用于执行特定的数据库操作,如数据添加、修改、删除及查询。它们提供了一种高效且安全的方式来处理数据,并能够减少网络流量并提高应用程序性能。
### 1. 添加数据
创建存储过程`P_EMP_INSERT`来向`EMP`表中插入新记录。此过程中需接收两个参数:员工编号(V_ID)和姓名(V_NAME)。代码如下:
```sql
CREATE OR REPLACE PROCEDURE P_EMP_INSERT (
V_ID NUMBER,
V_NAME IN VARCHAR2
) IS
BEGIN
INSERT INTO EMP (EMPNO, ENAME) VALUES (V_ID, V_NAME);
COMMIT;
END;
```
执行时,可以使用以下语句调用该过程:
```sql
BEGIN
P_EMP_INSERT(8000, CC);
END;
```
这将向`EMP`表中添加一个具有编号为8000和姓名为CC的新员工。
### 2. 修改数据
创建存储过程 `P_EMP_UPDATE` 来更新 EMP 表中的记录。此过程中需接收两个参数:要修改的员工的编号(V_ID)以及新的员工名称(V_NAME)。代码如下:
```sql
CREATE OR REPLACE PROCEDURE P_EMP_UPDATE (
V_ID IN NUMBER,
V_NAME IN VARCHAR2
) IS
BEGIN
UPDATE EMP SET ENAME = V_NAME WHERE EMPNO = V_ID;
COMMIT;
END;
```
执行更新操作时,可以使用以下语句调用该过程:
```sql
BEGIN
P_EMP_UPDATE(8000, AA);
END;
```
这将把编号为8000的员工姓名更改为AA。
### 3. 删除数据
创建存储过程`P_EMP_DELETE`用于从 EMP 表中删除指定编号的记录。此过程中需接收一个参数:要删除的员工编号(V_ID)。代码如下:
```sql
CREATE OR REPLACE PROCEDURE P_EMP_DELETE (
V_ID IN NUMBER
) IS
BEGIN
DELETE FROM EMP WHERE EMPNO = V_ID;
COMMIT;
END;
```
执行过程以删除指定编号为8000的记录,可以使用以下语句调用该存储过程:
```sql
BEGIN
P_EMP_DELETE(8000);
END;
```
### 4. 查询数据
#### 单条记录查询
创建存储过程`P_EMP_GETOBJBYID`用于根据员工编号获取单个员工的信息。此过程中需接收一个输入参数(V_ID)和输出参数(V_NAME)。代码如下:
```sql
CREATE OR REPLACE PROCEDURE P_EMP_GETOBJBYID (
V_ID IN NUMBER,
V_NAME OUT VARCHAR2
) IS
BEGIN
SELECT ENAME INTO V_NAME FROM EMP WHERE EMPNO = V_ID;
END;
```
执行查询时,可以使用以下语句调用该过程并输出结果:
```sql
DECLARE
P_NAME VARCHAR2(10);
BEGIN
P_EMP_GETOBJBYID(7788, P_NAME);
dbms_output.put_line(Name: || P_NAME);
END;
```
#### 多条记录查询
创建存储过程`P_EMP_SELECT`用于根据提供的条件返回多个员工的记录。此过程中需接收两个输入参数(V_ID 和 V_Name)和输出游标结果集,代码如下:
```sql
CREATE OR REPLACE PROCEDURE P_EMP_SELECT (
RESULTLIST OUT SYS_REFCURSOR,
V_ID IN NUMBER,
V_NAME IN VARCHAR2
) IS
SQL_STR VARCHAR2(500);
BEGIN
-- 构建SQL查询字符串并添加条件语句。
IF V_ID <> 0 THEN
SQL_STR := SELECT * FROM EMP WHERE EMPNO >= || TO_CHAR(V_ID);
END IF;
IF V_NAME IS NOT NULL THEN
SQL_STR := SQL_STR || AND ENAME LIKE || %||V_NAME||% ;
END IF;
-- 打开游标并执行查询。
OPEN RESULTLIST FOR SQL_STR;
END;
```
执行多条记录的查询时,可以使用以下语句调用该过程:
```sql
DECLARE
MYCRS SYS_REFCURSOR;
V_EMP EMP%ROWTYPE;
BEGIN
P_EMP_SELECT(MYCRS, 7900, M);
LOOP
FETCH MYCRS INTO V_EMP; -- 使用游标获取查询结果。
EXIT WHEN MYCRS%NOTFOUND;
DBMS_OUTPUT.put_line(V_EMP.EMPNO || - || V_EMP.ENAME);
END LOOP;
END;
```
以上步骤展示了如何通过存储过程进行数据的添加、修改、删除及查询操作,为数据库管理提供了强大的功能支持。