在所有的编程语言中,变量的使用是肯定都会有的,PL/SQL作为面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到动态执行程序,同时也可以把值传递出去返回给用户.
一、语法结构
1、变量声明语法结构
variable_name datatype
[
[not null]
{ := default | expr}
]
variable_name:变量名
datatype:变量数据类型,PL/SQL是一门强类型语言,使用变量、常量时必须先声明类型
not null:非空约束,使用之后必须为变量赋初始值
:= default | expr:指定变量的初始值,或者指定变量初始值的表达式(可以是文本值、其它变量、函数等)
2、常量声明语法结构
const_name constant datatype
[
[not null]
{ := default | expr}
]
常量定义和变量很相似,主要是通过关键字constant表明这是一个常量.
const_name:常量名
constant :表示是常量
二、变量和常量的数据类型
变量和常量的数据类型可以概括为三类:
标量类型:单一类型,不存在组合
复合类型:由几种单一类型组合而成的
参照类型:主要有游标、对象类型
1、标量类型
标量类型是我们最常用的,主要有下面几个:
数字类型
number(p,s)
字符类型
char、varchar2、nchar、nvarchar2、long
日期类型
date、timestamp
布尔类型 (表中的字段不能使用布尔类型,但是PL/SQL中可以)
boolean
%type类型
根据已有的变量数据类型或者数据库表中字段的类型
这里只列出常用的一些标量类型,下面举例演示:
declare
v_pid product.pid%type;
v_name varchar2(20);
v_price number(8,2);
v_num number(10);
v_address v_pid%type;
v_cid varchar(36);
c_desc constant varchar2(20) := '测试常量';
v_date date := sysdate;
begin
select p.pid, p.name, p.price, p.num, p.address, p.cid
into v_pid, v_name, v_price, v_num, v_address, v_cid
from product p
where p.pid = '1';
DBMS_OUTPUT.PUT_LINE('商品id:' || v_pid);
DBMS_OUTPUT.PUT_LINE('商品名称:' || v_name);
DBMS_OUTPUT.PUT_LINE('商品价格:' || v_price);
DBMS_OUTPUT.PUT_LINE('商品数量:' || v_num);
DBMS_OUTPUT.PUT_LINE('商品生产地址:' || v_address);
DBMS_OUTPUT.PUT_LINE('商品分类id:' || v_cid);
DBMS_OUTPUT.PUT_LINE('常量:' || c_desc);
DBMS_OUTPUT.PUT_LINE('时间:' || v_date);
end;
/
2、复合类型
复合类型主要有:记录类型、表类型、varray类型
1)记录类型
形式1:
TYPE type_name IS RECORD --声明记录类型
(
variable_name1 datatype1,
variable_name2 datatype2,
...
);
variable_name type_name; --记录类型变量
示例:
declare
TYPE product_rec IS RECORD
(
v_name varchar2(20),
v_price number(8,2)
);
v_product product_rec;
begin
select p.name, p.price
into v_product
from product p
where p.pid = '1';
DBMS_OUTPUT.PUT_LINE('商品名称:' || v_product.v_name);
DBMS_OUTPUT.PUT_LINE('商品价格:' || v_product.v_price);
end;
/
形式2:利用 %rowtype 声明记录类型
示例:
declare
v_product product%rowtype;
begin
select *
into v_product
from product p
where p.pid = '1';
DBMS_OUTPUT.PUT_LINE('商品名称:' || v_product.name);
DBMS_OUTPUT.PUT_LINE('商品价格:' || v_product.price);
DBMS_OUTPUT.PUT_LINE('商品数量:' || v_product.num);
DBMS_OUTPUT.PUT_LINE('生产地址:' || v_product.address);
DBMS_OUTPUT.PUT_LINE('商品分类:' || v_product.cid);
end;
/
2)表类型
表类型类似其它语言中的数组类型,不过PL/SQL中的表类型下标可以为负值,也可以为字符串,并且元素个数没有限制.
示例1:
declare
TYPE name_table_type IS TABLE OF product.name%type --声明表类型
INDEX BY BINARY_INTEGER; --表明索引是数字
name_table name_table_type; --定义表类型变量
begin
select name
into name_table(-1)
from product
where pid = '1';
DBMS_OUTPUT.PUT_LINE('商品名称:' || name_table(-1));
end;
/
示例2:
declare
TYPE name_table_type IS TABLE OF product%rowtype --声明表类型
INDEX BY BINARY_INTEGER;
name_table name_table_type; --定义表类型变量
begin
select *
into name_table(-1)
from product
where pid = '1';
DBMS_OUTPUT.PUT_LINE('商品名称:' || name_table(-1).name);
DBMS_OUTPUT.PUT_LINE('商品价格:' || name_table(-1).price);
DBMS_OUTPUT.PUT_LINE('商品数量:' || name_table(-1).num);
DBMS_OUTPUT.PUT_LINE('生产地址:' || name_table(-1).address);
DBMS_OUTPUT.PUT_LINE('商品分类:' || name_table(-1).cid);
end;
/
示例3:
declare
TYPE str_table_type IS TABLE OF varchar2(20) --声明表类型
INDEX BY varchar2(20); --表明索引是字符
str_table str_table_type; --定义表类型变量
begin
str_table('name') := 'GTX1080Ti';
str_table('price') := 6000;
str_table('num') := 99;
DBMS_OUTPUT.PUT_LINE('商品名称:' || str_table('name'));
DBMS_OUTPUT.PUT_LINE('商品价格:' || str_table('price'));
DBMS_OUTPUT.PUT_LINE('商品数量:' || str_table('num'));
end;
/
3)varray类型
该类型和数组也很相似,它的元素个数需要限制,下标是从1开始的,适合较少的数据时使用.
declare
TYPE varr IS VARRAY(100) OF varchar2(20); --声明varray类型
str_array varr := varr('1','2'); --定义varray类型变量
begin
str_array(1) := 'A';
str_array(2) := 'B';
DBMS_OUTPUT.PUT_LINE(str_array(1));
DBMS_OUTPUT.PUT_LINE(str_array(2));
end;
/
3、参照类型
1)REF CURSOR
2)REF obj_type
这两个在后面会介绍到.