目录
PL/SQL存储过程
1、语法
2、实例
3、调用存储过程
4、删除存储过程和函数
5、存储过程与函数的比较
PL/SQL存储过程
存储过程是被命名的 PL/SQL 块,存储于数据库中,是数据库对象的一种。应用程序可以调用存储过程,执行相应的逻辑。不能在赋值语句(如函数)的右侧使用存储过程。
1、语法
CREATE [OR REPLACE] PROCEDURE <procedure_name> [(
<parameter_name_1> [IN | OUT | IN OUT] <parameter_data_type_1> [DEFAULT value_1],
<parameter_name_2> [IN | OUT | IN OUT] <parameter_data_type_2> [DEFAULT value_2],
...
<parameter_name_N> [IN | OUT | IN OUT] <parameter_data_type_N> [DEFAULT value_N])]
IS
--声明部分
BEGIN
-- 执行部分
EXCEPTION
-- 可选的异常错误处理程序
END procedure_name;
/
<procedure_name>是PROCEDURE的名称;<parameter_name>是要传递的参数的名称;<parameter_data_type>是相应参数的PL / SQL数据类型。
2、实例
-- 创建表
CREATE TABLE LOGTABLE (
USERID VARCHAR2(100),
LOGDATE DATE
);
-- 创建存储过程
CREATE OR REPLACE PROCEDURE LOGEXECUTION
IS
BEGIN
INSERT INTO logtable (USERID, LOGDATE) VALUES (USER, SYSDATE);
END LOGEXECUTION;
/
-- 调用存储过程
DECLARE
V_INSERT_COUNT NUMBER;
BEGIN
LOGEXECUTION;
SELECT COUNT(*) INTO V_INSERT_COUNT FROM LOGTABLE;
DBMS_OUTPUT.PUT_LINE(V_INSERT_COUNT);
END;
3、调用存储过程
存储过程建立完成后,只要通过授权,用户就可以在SQLPLUS 、ORACLE开发工具或第三方开发工具中来调用运行。对于参数的传递也有三种:按位置传递、按名称传递和组合传递,传递方法与函数一样。ORACLE 使用EXECUTE 语句来实现对存储过程的调用,如:
EXECUTE logexecution;
(1)计算指定部门的工资总和,并统计其中的职工数量。
CREATE OR REPLACE PROCEDURE proc_demo
(
dept_no NUMBER DEFAULT 10,
sal_sum OUT NUMBER,
emp_count OUT NUMBER
)
IS
BEGIN
SELECT SUM(salary), COUNT(*) INTO sal_sum, emp_count
FROM employees WHERE department_id = dept_no;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('data not found');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END proc_demo;
/
DECLARE
V_num NUMBER;
V_sum NUMBER(8, 2);
BEGIN
Proc_demo(30, v_sum, v_num);
DBMS_OUTPUT.PUT_LINE('温馨提示:30号部门工资总和:'||v_sum||',人数:'||v_num);
Proc_demo(sal_sum => v_sum, emp_count => v_num);
DBMS_OUTPUT.PUT_LINE('温馨提示:10号部门工资总和:'||v_sum||',人数:'||v_num);
END;
/
在PL/SQL 程序中还可以在块内建立本地函数和过程,这些函数和过程不存储在数据库中,但可以在创建它们的PL/SQL 程序中被重复调用。本地函数和过程在PL/SQL 块的声明部分定义,它们的语法格式与存储函数和过程相同,但不能使用CREATE OR REPLACE 关键字。
如:建立本地过程,用于计算指定部门的工资总和,并统计其中的职工数量
DECLARE
V_num NUMBER;
V_sum NUMBER(8, 2);
PROCEDURE proc_demo
(
Dept_no NUMBER DEFAULT 10,
Sal_sum OUT NUMBER,
Emp_count OUT NUMBER
)
IS
BEGIN
SELECT SUM(salary), COUNT(*) INTO sal_sum, emp_count
FROM employees WHERE department_id=dept_no;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('data not found!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END proc_demo;
-- 调用存储过程
BEGIN
Proc_demo(30, v_sum, v_num);
DBMS_OUTPUT.PUT_LINE('30号部门工资总和:'||v_sum||',人数:'||v_num);
Proc_demo(sal_sum => v_sum, emp_count => v_num);
DBMS_OUTPUT.PUT_LINE('10号部门工资总和:'||v_sum||',人数:'||v_num);
END;
/
4、删除存储过程和函数
(1)删除存储过程
可以使用DROP PROCEDURE命令对不需要的过程进行删除,语法如下:
DROP PROCEDURE [user.]Procudure_name;
(2)删除存储函数
可以使用DROP FUNCTION 命令对不需要的函数进行删除,语法如下:
DROP FUNCTION [user.]Function_name;
5、存储过程与函数的比较
1、如果需要返回多个值和不返回值,就使用过程;如果只需要返回一个值,就使用函数。
2、过程一般用于执行一个指定的动作,函数一般用于计算和返回一个值。
3、存储函数可以在 select 语句中直接使用,而存储过程不能。过程多数是被应用程序所调用。
4、存储函数一般都是封装一个查询结果,而存储过程一般都封装一段事务代码。