oracle的存储过程

泠之屋

关注

阅读 14

01-15 09:00

  1. 什么是Oracle存储过程
  • 存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。它可以被用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行。存储过程就像是一个预定义的脚本,能够提高数据库操作的效率和安全性。
  • 例如,在一个企业资源规划(ERP)系统中,每次插入新的订单数据时,都需要进行一系列复杂的操作,包括插入订单主表、插入订单明细表、更新库存等。将这些操作封装在一个存储过程中,每次有新订单时,只需调用这个存储过程即可,而不用重复编写复杂的SQL语句。
  1. 存储过程的优点
  • 提高性能:存储过程在数据库中是预编译的。当执行存储过程时,数据库管理系统(DBMS)直接执行编译后的代码,减少了解析和编译SQL语句的时间。相比之下,普通的SQL语句每次执行时都需要进行解析和编译,在复杂的业务逻辑和频繁执行的情况下,存储过程能够显著提高性能。
  • 增强安全性:通过存储过程,可以限制用户对数据库表的直接访问。用户只能通过执行存储过程来操作数据,而存储过程中的SQL语句可以进行权限控制。例如,可以在存储过程内部检查用户的权限,只允许具有特定权限的用户执行某些操作,从而保护数据的安全性。
  • 代码复用:存储过程可以被多个应用程序或用户重复调用。一旦编写完成,在需要相同功能的地方都可以使用,减少了代码的重复编写,提高了开发效率。
  1. 创建存储过程的语法
  • 基本语法如下:

CREATE [OR REPLACE] PROCEDURE procedure_name
[(parameter1 [IN | OUT | IN OUT] data_type1,
  parameter2 [IN | OUT | IN OUT] data_type2,...)]
IS
-- 声明部分,用于声明变量、游标等
BEGIN
-- 执行部分,包含实际的SQL语句和逻辑
EXCEPTION
-- 异常处理部分,用于处理运行过程中出现的错误
END;

  • 其中,CREATE [OR REPLACE] PROCEDURE是创建或替换存储过程的关键字。procedure_name是存储过程的名称,需要是唯一的。参数部分(parameter1parameter2等)用于定义存储过程的输入、输出或输入/输出参数,IN表示输入参数,OUT表示输出参数,IN OUT表示既可以输入又可以输出的参数。data_type1data_type2等是参数的数据类型。IS之后是声明部分,用于声明变量、游标等。BEGINEND之间是执行部分,包含实际的SQL语句和逻辑。EXCEPTION部分用于处理运行过程中出现的错误。
  • 例如,创建一个简单的存储过程,用于查询员工表中所有员工的信息:

CREATE OR REPLACE PROCEDURE get_all_employees
IS
  CURSOR employee_cursor IS SELECT * FROM employees;
  employee_record employees%ROWTYPE;
BEGIN
  OPEN employee_cursor;
  LOOP
    FETCH employee_cursor INTO employee_record;
    EXIT WHEN employee_cursor%NOTFOUND;
    -- 可以在这里对获取到的员工记录进行处理,比如打印或插入到其他表中
    DBMS_OUTPUT.PUT_LINE('Employee Name: ' || employee_record.employee_name);
  END LOOP;
  CLOSE employee_cursor;
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('An error occurred: ' || SQLERRM);
END;

  1. 调用存储过程
  • 在Oracle中,可以使用EXECUTE(缩写为EXEC)命令或者在PL/SQL块中调用存储过程。
  • 例如,调用上面创建的get_all_employees存储过程:
  • 使用EXECUTE命令:

EXECUTE get_all_employees;

  • 在PL/SQL块中调用:

BEGIN
  get_all_employees;
END;

  1. 存储过程中的参数传递
  • 输入参数(IN):输入参数用于将外部的值传递到存储过程内部。在存储过程内部,不能修改输入参数的值。例如,创建一个存储过程,根据员工编号查询员工信息,员工编号就是输入参数:

CREATE OR REPLACE PROCEDURE get_employee_by_id(p_employee_id IN employees.employee_id%TYPE)
IS
  employee_record employees%ROWTYPE;
BEGIN
  SELECT * INTO employee_record FROM employees WHERE employee_id = p_employee_id;
  DBMS_OUTPUT.PUT_LINE('Employee Name: ' || employee_record.employee_name);
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('Employee not found.');
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('An error occurred: ' || SQLERRM);
END;

  • 调用这个存储过程时,需要传递一个员工编号作为参数:

EXECUTE get_employee_by_id(1001);

  • 输出参数(OUT):输出参数用于将存储过程内部的值传递到外部。在存储过程内部,需要给输出参数赋值。例如,创建一个存储过程,计算两个数的和,并通过输出参数返回结果:

CREATE OR REPLACE PROCEDURE add_numbers(p_num1 IN NUMBER, p_num2 IN NUMBER, p_result OUT NUMBER)
IS
BEGIN
  p_result := p_num1 + p_num2;
END;

  • 调用这个存储过程时,需要定义一个变量来接收输出参数的值:

DECLARE
  v_result NUMBER;
BEGIN
  add_numbers(5, 3, v_result);
  DBMS_OUTPUT.PUT_LINE('The sum is: ' || v_result);
END;

  • 输入/输出参数(IN OUT):这种参数既可以接收外部的值,也可以将内部的值传递到外部。例如,创建一个存储过程,交换两个变量的值:

CREATE OR REPLACE PROCEDURE swap_numbers(p_num1 IN OUT NUMBER, p_num2 IN OUT NUMBER)
IS
  v_temp NUMBER;
BEGIN
  v_temp := p_num1;
  p_num1 := p_num2;
  p_num2 := v_temp;
END;

  • 调用这个存储过程时:

DECLARE
  v_num1 NUMBER := 10;
  v_num2 NUMBER := 20;
BEGIN
  swap_numbers(v_num1, v_num2);
  DBMS_OUTPUT.PUT_LINE('v_num1: ' || v_num1);
  DBMS_OUTPUT.PUT_LINE('v_num2: ' || v_num2);
END;

精彩评论(0)

0 0 举报