存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其他对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。
存储过程用于执行特定的操作,可以接受输入参数、输出参数、返回单个或多个结果集。在创建存储过程时,既可以指定输入参数(IN),也可以指定输出参数(OUT),通过在存储过程中使用输入参数,可以将数据传递到执行部分;通过使用输出参数,可以将执行结果传递到应用环境。存储过程可以使对数据库的管理、显示数据库及其用户信息的工作更加容易。
存储过程存储在数据库内,可由应用程序调用执行。存储过程允许用户声明变量并且可包含程序流、逻辑以及对数据库的查询。
具体而言,存储过程的优点如下:
1)存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和运算。
2)存储过程可保证数据的安全性。通过存储过程可以使没有权限的用户在权限控制之下间接地存取数据库中的数据,从而保证数据的安全。
3)通过存储过程可以使相关的动作在一起发生,从而维护数据库的完整性。
4)在运行存储过程前,数据库己对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。由于执行SQL语句的大部分工作已经完成,所以,存储过程能以极快的速度执行。
5)可以降低网络的通信量,因为不需要通过网络来传送很多SQL语句到数据库服务器。
6)把体现企业规则的运算程序放入数据库服务器中,以便集中控制。当企业规则发生变化时,在数据库中改变存储过程即可,无须修改任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运算程序放入应用程序中,那么当企业规则发生变化时,就需要修改应用程序,工作量非常之大(修改、发行和安装应用程序)。如果把体现企业规则的运算放入存储过程中,那么当企业规则发生变化时,只要修改存储过程就可以了,应用程序无须任何变化。
在Oracle中,创建存储过程的语法如下:

说明:
1)局部变量的类型可以带取值范围,后面接分号。
2)在判断语句前最好先用COUNT(*)函数判断是否存在该条操作记录。
3)OR REPLACE选项是当此存储过程存在时覆盖此存储过程,参数部分和过程定义的语法相同。
4)在创建存储过程时,既可以指定存储过程的参数,也可以不提供任何参数。
5)存储过程的参数主要有三种类型:输入参数(IN)、输出参数(OUT)、输入输出参数(IN OUT),其中IN用于接收调用环境的输入参数,OUT用于将输出数据传递到调用环境,IN OUT不仅要接收数据,而且要输出数据到调用环境。类型可以使用任意Oracle中的合法类型(包括集合类型),存储过程参数不带取值范围。
6)在建立存储过程时,输入参数的IN可以省略。
7)创建存储过程要有CREATE PROCEDURE或CREATE ANY PROCEDURE权限。如果要运行存储过程,那么必须是这个存储过程的创建者或者有这个存储过程的EXECUTE权限(GRANT EXECUTE ON LHR.PRO_TEST_LHR TO LHR;)。如果要编辑其他用户下的存储过程或包,那么必须有CREATEANY PROCEDURE权限(GRANT CREATE ANY PROCEDURE TO LHR;)。如果要调试某个存储过程,那么必须有DEBUG权限(GRANT DEBUG ON LHR.PRO_TEST_LHR TO LHR;)。
8)关于SELECT...INTO...
①在存储过程中,当SELECT某一字段时,后面必须紧跟INTO。将SELECT查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(若没有记录则抛出NO_DATA_FOUND)。如下:

②在利用SELECT...INTO...时,必须先确保数据库中有该条记录,否则会报错“no data found”。可以在该语句之前,先利用“SELECT COUNT(*)FROM T_LHR;”查看数据库中是否存在该记录,若存在,则再利用SELECT...INTO...。