基本语句
在编写PL/SQL过程中,会定义一些变量,给变量赋值,调用其他存储过程等。介绍PL/SQL中的基本语句,包括定义变量、赋值语句、调用语句以及返回语句。
尽量不要在存储过程中调用包含密码的SQL语句,因为存储在数据库中的存储过程文本可能被其他有权限的用户看到导致密码信息被泄漏。如果存储过程中包含其他敏感信息也需要配置存储过程的访问权限,保证敏感信息不会泄漏。
定义变量
介绍PL/SQL中变量的声明,以及该变量在代码中的作用域。
变量声明
变量声明语法请参见图14-3。
图14-4 declare_variable::=
对以上语法格式的解释如下:
variable_name:变量名。
type:变量类型。
value:该变量的初始值(如果不给定初始值,则初始为NULL)。value也可以是表达式。
示例
vastbase=# DECLARE
emp_id INTEGER := 7788; --定义变量并赋值
BEGIN
emp_id := 5*7784; --变量赋值
END;
/
变量类型除了支持基本类型,还可以是使用%TYPE和%ROWTYPE去声明一些与其他表字段或表结构本身相关的变量。
%TYPE属性
%TYPE主要用于声明某个与其他变量类型(例如,表中某列的类型)相同的变量。假如我们想定义一个my_name变量,它的变量类型与employee的firstname类型相同,我们可以通过如下定义:
my_name employee.firstname%TYPE
这样定义可以带来两个好处,首先,我们不用预先知道employee表的firstname类型具体是什么。其次,即使之后firstname类型有了变化,我们也不需要再次修改my_name的类型。
%ROWTYPE属性
%ROWTYPE属性主要用于对一组数据的类型声明,用于存储表中的一行数据或从游标匹配的结果。假如,我们需要一组数据,该组数据的字段名称与字段类型都与employee表相同。我们可以通过如下定义:
my_employee employee%ROWTYPE
变量作用域
变量的作用域表示变量在代码块中的可访问性和可用性。只有在它的作用域内,变量才有效。
变量必须在declare部分声明,即必须建立BEGIN-END块。块结构也强制变量必须先声明后使用,即变量在过程内有不同作用域、不同的生存期。
同一变量可以在不同的作用域内定义多次,内层的定义会覆盖外层的定义。
在外部块定义的变量,可以在嵌套块中使用。但外部块不能访问嵌套块中的变量。
赋值语句
语法
给变量赋值的语法请参见图14-4。
图14-5 assignment_value::=
对以上语法格式的解释如下:
variable_name:变量名。
value:可以是值或表达式。值value的类型需要和变量variable_name的类型兼容才能正确赋值。
示例
vastbase=# DECLARE
emp_id INTEGER := 7788;--赋值
BEGIN
emp_id := 5;--赋值
emp_id := 5*7784;
END;
/
调用语句
语法
调用一个语句的语法请参见图14-5。
图14-6 call_clause::=
对以上语法格式的解释如下:
procedure_name:存储过程名。
parameter:存储过程的参数,可以没有或者有多个参数。
示例
--创建表
create table staffs(
section_id int,
salary int
);
insert into staffs values(1,1000);
insert into staffs values(2,1000);
insert into staffs values(3,1000);
insert into staffs values(4,1000);
insert into staffs values(5,1000);
insert into staffs values(6,1000);
insert into staffs values(7,1000);
insert into staffs values(8,1000);
--创建存储过程proc_staffs
vastbase=# CREATE OR REPLACE PROCEDURE proc_staffs
(
section NUMBER(6),
salary_sum out NUMBER(8,2),
staffs_count out INTEGER
)
IS
BEGIN
SELECT sum(salary), count(*) INTO salary_sum, staffs_count FROM staffs where section_id = section;
END;
/
--调用存储过程proc_return.
vastbase=# CALL proc_staffs(2,8,6);
--清除存储过程
vastbase=# DROP PROCEDURE proc_staffs;