什么是存储过程
在介绍oracle的存储过程如何调用之前,先来了解一下什么是存储过程。存储过程是一组预先编译好的SQL语句,可以作为一个单元来执行。通常,存储过程会被封装在数据库中,因此在执行时可以大大减少网络流量,提高执行效率。
存储过程与函数非常类似,不同之处在于存储过程可以带有输入输出参数,并可以执行数据操作语言(DML)语句,如INSERT、UPDATE或DELETE等,而函数只能返回一个值。
如何创建存储过程
在oracle中,创建存储过程的语法如下:
CREATE [OR REPLACE] PROCEDURE procedure_name
[ (parameter [,parameter]) ]
IS
[declaration_section]
BEGIN
executable_section
[EXCEPTION
exception_section]
END [procedure_name];
其中,CREATE表示创建一个新的存储过程,OR REPLACE表示如果存储过程已经存在,则替换原有的存储过程。procedure_name是存储过程的名称,parameter是存储过程的输入参数,可以有多个,每个参数必须指定数据类型。
declaration_section是可选的声明部分,用于定义局部变量、游标和其它子程序等。executable_section是存储过程的核心部分,包含了实际要执行的SQL语句,可以包括流程控制语句(如IF、CASE和LOOP等)。exception_section用于定义当执行过程中出现异常时的处理方式,通常是记录日志或回滚事务等。
另外需要注意的是,oracle的存储过程必须以名称为"SP_"开头,这是为了避免与系统的其他对象重名。
如何调用存储过程
执行简单的存储过程
在oracle中,调用存储过程的语法如下:
EXECUTE procedure_name;
其中,EXECUTE是调用存储过程的关键字,procedure_name是存储过程的名称。如果存储过程有输入参数,则可以按照如下语法进行调用:
EXECUTE procedure_name (parameter1, parameter2, ...);
例如,可以创建一个简单的存储过程,用于输出"Hello World!"字符串:
CREATE OR REPLACE PROCEDURE SP_SAY_HELLO
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World!');
END SP_SAY_HELLO;
通过执行以下命令,可以调用该存储过程:
EXECUTE SP_SAY_HELLO;
执行结果如下:
Hello World!
使用游标返回查询结果
在实际应用中,存储过程通常是用来查询数据。在oracle中,可以使用游标来返回查询结果。
通过以下语法,可以创建一个带有输入参数和输出游标的存储过程:
CREATE OR REPLACE PROCEDURE SP_GET_EMPLOYEE (
EMPLOYEE_ID IN NUMBER,
RESULT_SET OUT SYS_REFCURSOR
)
IS
BEGIN
OPEN RESULT_SET FOR
SELECT * FROM EMPLOYEES WHERE EMPLOYEE_ID = EMPLOYEE_ID;
END SP_GET_EMPLOYEE;
该存储过程接收一个EMPLOYEE_ID参数,用于指定要查询的员工编号,返回一个SYS_REFCURSOR类型的游标,游标指向包含查询结果的结果集。
通过以下语法,可以调用该存储过程:
DECLARE
RC SYS_REFCURSOR;
EMP EMPLOYEES%ROWTYPE;
BEGIN
SP_GET_EMPLOYEE(1, RC);
LOOP
FETCH RC INTO EMP;
EXIT WHEN RC%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(EMP.EMPLOYEE_ID || ', ' || EMP.FIRST_NAME || ', ' || EMP.LAST_NAME);
END LOOP;
CLOSE RC;
END;
该代码首先声明了一个SYS_REFCURSOR类型的游标RC和一个EMPLOYEES表的行类型EMP。然后,调用SP_GET_EMPLOYEE存储过程,并传入EMPLOYEE_ID = 1的参数。接着,使用循环依次取出游标中的每条记录,将其赋值给EMP变量,并输出EMP的字段值。
执行结果如下:
1, Steven, King
使用输出参数返回值
除了使用游标返回查询结果,还可以使用输出参数返回值。例如,可以创建一个存储过程,用于计算指定范围内的员工总数,并返回结果:
CREATE OR REPLACE PROCEDURE SP_COUNT_EMPLOYEES (
START_DATE IN DATE,
END_DATE IN DATE,
COUNT_RESULT OUT NUMBER
)
IS
BEGIN
SELECT COUNT(*) INTO COUNT_RESULT FROM EMPLOYEES WHERE HIRE_DATE BETWEEN START_DATE AND END_DATE;
END SP_COUNT_EMPLOYEES;
该存储过程接收两个日期类型的输入参数:START_DATE和END_DATE,表示查询的起始和截止日期。返回一个NUMBER类型的输出参数:COUNT_RESULT,表示查询结果的总数。
通过以下语法,可以调用该存储过程:
DECLARE
COUNT NUMBER;
BEGIN
SP_COUNT_EMPLOYEES('01-JAN-2000', '31-DEC-2020', COUNT);
DBMS_OUTPUT.PUT_LINE(COUNT);
END;
该代码首先声明了一个NUMBER类型的变量COUNT,然后调用SP_COUNT_EMPLOYEES存储过程,并传入起始日期为'01-JAN-2000',截止日期为'31-DEC-2020'的参数。接着,将存储过程返回的COUNT_RESULT值赋值给COUNT变量,并输出COUNT的值。
执行结果如下:
107
总结
存储过程是oracle数据库中常用的一种对象,可以用于提高SQL语句执行效率,封装复杂的业务逻辑,提高代码可读性和可维护性等。调用存储过程的方法有多种,可以根据具体应用场景选择合适的方式。在使用存储过程时,需要注意参数和游标的使用方式,避免出现错误。