介绍:
存储过程是一种在数据库中存储和执行一系列SQL语句的功能。它是一种数据库对象,允许管理员和开发人员将复杂的操作封装在一个可重用的单元中。存储过程可以接受输入参数,执行复杂的查询、操作数据以及返回结果。它们可以提高数据库的性能和安全性,因为它们可以将SQL代码编写为单个可执行的对象,从而减少网络流量和数据库服务器的负载。此外,存储过程还可以减少人为错误,因为它们可以强制执行SQL代码的安全性和一致性。
变量
变量赋值的方式:
直接赋值语句 := 比如: v_name := '后槽牙'
语句赋值,使用select …into … 赋值:(语法 select 值 into 变量)
在Oracle中,存储过程可以接受变量作为输入或输出参数。变量声明在存储过程的声明块中,使用DECLARE关键字。变量名可以是任何有效的标识符,但不能与数据库中的保留字冲突。
例如,以下是一个简单的存储过程,它接受一个名为“name”的输入参数和一个名为“age”的输出参数:
CREATE OR REPLACE PROCEDURE get_age(name VARCHAR2, age OUT NUMBER) IS BEGIN SELECT DATEDIFF(YEAR, birthdate, SYSDATE) INTO age FROM people WHERE name = name; END;
在这个例子中,我们声明了一个名为“age”的输出参数,它是一个NUMBER类型。在存储过程的主体中,我们使用SELECT INTO语句将查询结果赋值给输出参数。
存储过程可以使用变量来执行各种操作,例如循环、条件语句、函数等。变量还可以用于临时存储数据或结果,以便在存储过程中重复使用。
在Oracle中,普通变量是一种存储过程输入和输出参数的机制。它可以用于存储单个值或多个值,包括标量变量和复合变量。标量变量用于存储单个值,例如 NUMBER、VARCHAR2、PL/SQL BOOLEAN 等等。复合变量通常用于存储记录或对象的多个值,例如 record、rowtype、collection等等。
引用型变量是一种特殊的变量类型,用于存储对另一个数据对象的引用。它通常用于在存储过程中传递大型数据对象,例如CLOB、BLOB、ROWID、UROWID等等。引用型变量需要在声明块中声明为REF CURSOR类型,并且在调用存储过程的代码中,需要将数据对象的引用赋值给它。
记录行变量是一种特殊的复合变量,用于存储对查询结果集的引用。它通常用于在存储过程中处理查询结果集,例如分页、排序、过滤等等。记录行变量需要在声明块中声明为TYPE类型,并且需要在主体中使用OPEN FOR语句来执行查询并返回结果集。在调用存储过程的代码中,需要将查询的参数传递给存储过程,以便存储过程可以处理查询结果集并返回结果。
总结: 普通变量是Oracle存储过程中常用的机制,可以提高存储过程的灵活性和可读性。引用型变量和记录行变量则是用于处理大型数据对象和查询结果集的特殊变量类型,它们可以提高存储过程的效率和可维护性。
流程控制
Oracle的流程控制主要包括条件判断和循环。
条件判断使用DECLARE和IF语句来实现例如:
DECLARE v_deptno scott.emp.deptno%TYPE; v_zj NUMBER(4); BEGIN SELECT deptno INTO v_deptno FROM scott.emp WHERE empno = &&v_empno; IF v_deptno = 10 THEN v_zj := 100; ELSIF v_deptno = 20 THEN v_zj := 150; ELSIF v_deptno = 30 THEN v_zj := 200; ELSE v_zj := 300; END IF; UPDATE scott.emp SET sal = sal + v_zj WHERE empno = &&v_empno; END;
循环使用FOR语句来实现例如:
DECLARE TYPE emp_tab IS TABLE OF scott.emp%ROWTYPE; v_emp_tab emp_tab; BEGIN FOR emp IN (SELECT * FROM scott.emp) LOOP v_emp_tab.EXTEND; v_emp_tab(v_emp_tab.COUNT) := emp; END LOOP; FOR i IN 1..v_emp_tab.COUNT LOOP UPDATE scott.emp SET sal = sal + 10 WHERE empno = v_emp_tab(i).empno; END LOOP; END;