Oracle数据库教程
六、存储过程/PLSQL语句
定义:存储过程(Stored Procedure )是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。在ORACLE 中,若干个有联系的过程可以组合在一起构成程序包。
优点:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update、Insert、Query、Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量。
4.安全性高,可设定只有某用户才具有对指定存储过程的使用权。
6.1 PL-SQL语句简介
6.1.1 PL-SQL概述
PL/SQL是一种过程化语言,在PL/SQL中可以通过IF语句或者LOOP语句实现控制程序的执行流程,甚至可以定义变量,以便在语句之间传递数据信息,这样PL/SQL语言就能实现操控程序处理的细节过程。
PL/SQL是Oracle的专用语言,它是对标准SQL语言的扩展,它允许在其内部嵌套普通的SQL语句,这样将SQL语句的数据操纵能力,查询能力和PL/SQL的过程处理能力结合在一起。
第三方工具介绍:PL/SQL Developer是一个集成开发环境,是连接oracle的可视化客户端软件。类似的工具还有Toad,sqlplus,sql developer等等。我没安装,直接用的sqlplus。
6.1.2 PL/SQL块结构
标准PL/SQL块的语法格式如下(匿名的存储过程只能定义没有参数的存储过程,用declare关键字;有名的存储过程声明用as关键字):
[DECLARE]
--声明部分,可选(定义所有需要用到的变量)
BEGIN
--执行部分,必须
[EXCEPTION]
--执行异常处理代码,可选
END;
/
定义存储过程的语法格式:(有名的存储过程)
create procedure 存储过程名称(参数)
as --相当于declare声明
需要用到的变量
begin
执行的代码
[exception]
执行异常处理代码
end;
/
create or replace procedure hello
as
begin
dbms_output.put_line('helloworld');
end;
/
注: 勿忘斜线/。设置服务器可以向客户端输出信息 set serveroutput on;
输出语句格式: dbms_output.put_line©
如果直接运行,是打印不出的,只会返回Procedure created,在调用存储过程的时候才会打印出来:
exec hello;
6.1.3 代码注释和字符集
1 .单行注释
单行注释由两个连接字符“–”开始,后面紧跟着注释内容。
2.多行注释
多行注释由/开头,由/结尾,这个大多数编程语言是相同的。
3.PL/SQL字符集
所有的PL/SQL程序元素(比如,关键字、变量名、常量名等)都是由一些字符序列组合而成的,而这些字符序列中的字符都必须取自PL/SQL语言所允许使用的字符集,那么这些合法的字符集主要包括以下内容:
- 大写和小写字母:A-Z或a-z。
- 数字:0-9。
- 非显示的字符:制表符、空格和回车。
- 数学符号:+,-,*,/,>,<,=等。
- 间隔符:包括(),{},[],?,!,;,:,@,#,%,$,&等。
6.1.4 基本数据类型
-
数值类型
NUMBER: 可以存储整数或浮点数
PLS_INTEGER和BINARY_INTEGER: 存储整数 这两个用的很少 -
字符类型
包括VARCHAR2、CHAR、LONG、NCHAR、NVARCHAR2等。 -
日期类型
DATE类型,DATE类型的存储空间是7个字节,分别使用一个字节存储世纪、年、月、天、小时、分钟和秒。 -
布尔类型
布尔类型也只有一种——即BOOLEAN,变量值可以是TRUE、FALSE或NULL中的一种。
6.1.5 定义变量和常量
- 定义变量
(让内存分配一块存储空间)
变量名 数据类型 [(长度):=<初始值>];
例:
create or replace procedure hello
as
i int :=999; --定义了一个变量,变量名是i,int该变量的数据类型
begin
dbms_output.put_line('helloworld'||i); --put_line这个存储过程是将括号内的字符串输出到客户端,该存储过程被定义在dbms_output代码包里
end;
/
调用
begin
hello();
end;
/
或exec hello;
输出:
helloworld999
- 定义常量
常量名 constant 数据类型 := 常量值;
create or replace procedure hello
as
i int :=999;
pi constant number(3,2) :=3.14; --定义了一个常量,常量名是pi,number(3,2)是该常量的数据类型
begin
dbms_output.put_line('helloworld'||i||'---'||pi);
end;
/
SQL> exec hello