oracle的存储过程怎么调用

什么是存储过程

在介绍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语句执行效率,封装复杂的业务逻辑,提高代码可读性和可维护性等。调用存储过程的方法有多种,可以根据具体应用场景选择合适的方式。在使用存储过程时,需要注意参数和游标的使用方式,避免出现错误。

数据库标签