PL/SQL时一种过程化语言,可以通过if或loop语句进行实现控制程序执行过程
一、PL/SQL简介
1.PL/SQL格式
[declare] //声明部分,可选
begin //执行部分
exception//异常部分,可选
end;
/
我们写一个hello world
SQL> begin
2 dbms_output.put_line('hello world');
3 end;
4 /
hello world
PL/SQL 过程已成功完成。
输出了hello world
开始它可能没有输出,只显示加载成功,说明数据库把输出显示关掉了,所以先执行一次 set serveroutput on 就可以了。
2.PL/SQL注释
关键字:单行:-- 多行/* */
2 dbms_output.put_line('hello world');--单行注释
3 dbms_output.put_line('hello world');
4 /*多行
5 注释*/
6 end;
7 /
hello world
hello world
PL/SQL 过程已成功完成。
3.标识符
标识符可以是常量、变量、异常、显示游标、游标变量、参数、子程序以及包的名称。
定义常量、变量时:
1.每行只能定义一个常量和变量。
2.名称必须以英文字母开头,且最大长度为30.
3.名称只能使用 字母,数字,_,$,#.
4.不能使用orcale关键字
二、数据类型
1.数值型
数据类型 | 描述 |
number(数据总长度,小数位长度) | 可以用来表示整数或者小数,占32个字节 |
PLS_INTEGER | 有符号的整数,范围-2^32~2^32.与number相比,所占空间小,性能好 |
BINARY_INTEGER | 不存储在数据库中,只能在PL/SQL使用带符号整数范围-2^32~2^32。如果运算溢出,则自动变为number类型 |
SQL> declare
2 n number(3,2);--定义一个长度为3的数,小数长度为2
3 begin
4 n:=3.12;--赋值
5 dbms_output.put_line(n);--输出
6 end;
7 /
3.12
PL/SQL 过程已成功完成。
2.字符型
数据类型 | 描述 |
char(长度) | 定长字符串,如果所设置不足所定义的长度,则自动补充为空格,可以保存32767个字节 |
vaechar2(长度) | 可变长度字符串,可以保存1~21767个字节 |
nchar2(长度) | 定长字符串,保存为unicode编码数据 |
nvarchar2(长度) | 可变长度符串,保存为unicode编码数据 |
long | 可变长度数据,存储字符串长度超过4000时使用 |
SQL> declare
2 ch1 char(3);
3 ch2 char(1);
4 vch1 varchar2(6);
5 vch2 varchar2(6);
6 begin
7 ch1:='aa';
8 ch2:='a';
9 vch1:='abfc';
10 vch2:='a';
11 dbms_output.put_line('ch1='||ch1);
12 dbms_output.put_line('ch2='||ch2);
13 dbms_output.put_line('vch1='||vch1);
14 dbms_output.put_line('vch2='||vch2);
15 end;
16 /
ch1=aa
ch2=a
vch1=abfc
vch2=a
PL/SQL 过程已成功完成。
注意:这里说的可变长度,是指在你定义长度范围内,你存了多少值,它便占用多大空间,而不是它可以自动扩容。
而定长是指如果你存的数据不够长度那么它会以空格填补,相对来说varchar2更加节省空间
3.日期类型
数据类型 | 描述 |
date | date是长度为7的字节列,可以保存日期和时间,不包含毫秒 |
timestamp | date子类型,包含毫秒 |
SQL> declare
2 day1 date;
3 begin
4 day1:=sysdate;
5 dbms_output.put_line('day1='||day1);
6 end;
7 /
day1=25-12月-18
PL/SQL 过程已成功完成。
4.布尔型
数据类型 | 描述 |
boolean | 可以设置为true.false.null |
SQL> declare
2 b1 boolean;
3 begin
4 b1:=true;
5 if(b1) then
6 dbms_output.put_line('结果为true');
7 end if;
8 end;
9 /
结果为true
PL/SQL 过程已成功完成。
三、定义变量及赋值
1.定义一般变量
定义变量规则就不再说明了
赋值在declare中
具体语法:
变量名称 [constant] 类型 [not null] [:=value];
constant:定义常量,在定义时必须赋值
not null:此变量不允许为null
:=value:声明时赋值
SQL> declare
2 str1 constant varchar2(6):='str1';--必须给初始值
3 str2 varchar2(6) not null:='str2';--此时值不能e为null
4 str3 varchar2(6):='str3';--在声明时赋值
5 str4 varchar2(6);--在声明时没有赋值
6 begin
7 str4:='str4';
8 dbms_output.put_line(str1||'-'||str2||'-'||str3||'-'||str4);
9 end;
10 /
str1-str2-str3-str4
PL/SQL 过程已成功完成。
2.%TYPE
创建一个与字段名相同类型的字段
格式:
变量名 表名称.字段名%TYPE
拿下面在这张表来做实验
SQL> select * from student order by sno asc;
SNO SNAME SSEX SAGE SDEPT
---------- ---------------------------------------- -------- ---------- ----------------------------------------
1 张波 男 18 软件工程
2 李增福 男 21 预防医学
3 安霞 女 21 临床医学
4 贺建 女 20 应用数学
5 杨鹏飞 男 20 应用数学
6 李宇航 男 22 口腔医学
7 苏小白 男 22 中医药
8 李旭 男 19 临床医学
9 张必过 男 19 预防医学
10 安星宇 男 23 软件工程
11 李四 男
13 苏非 女 19 中医药
已选择12行。
输入学号输出对应的姓名
SQL> declare
2 no student.sno%TYPE;--创建一个和student.sno类型相同的变量
3 sname student.sname%type;--创建一个和student.sname类型相同的变量
4 begin
5 no:=&sno;--从键盘输入学号
6 select sname into sname from student where no=sno;--查到的姓名输入sname中
7 dbms_output.put_line(sname);
8 end;
9 /
输入 sno 的值: 1
原值 5: no:=&sno;--从键盘输入学号
新值 5: no:=1;--从键盘输入学号
张波
PL/SQL 过程已成功完成。
3.使用record声明变量类型
其实这就是相当于在java你创建一个只有属性类,然后把这个类的对象当成一个变量
格式:
TYPE 名 IS RECORD
(
变量1 数据类型 [not null] [:=value],
....
变量n 数据类型 [not null] [:=value],
)
比如查一个学生姓名,年龄,性别
SQL> declare
2 type student_type is record--定义自己的变量类似
3 (
4 name student.sname%type,
5 age student.sage%type,
6 sex student.ssex%type
7 );
8 stu student_type;--声明所创建的变量类型
9 begin
10 select sname,sage,ssex into stu from student where sno=1;
11 dbms_output.put_line(stu.name||'-'||stu.age||'-'||stu.sex);
12 end;
13 /
张波 -18-男
PL/SQL 过程已成功完成。
4.使用%ROWTYPE声明变量
格式:
变量名 表名%rowtype
创建一个表的所有列的类型
比如查一个学生表的所有类型
SQL> declare
2 stu student%rowtype;
3 begin
4 select * into stu from student where sno=1;
5 dbms_output.put_line(stu.sno||'-'||stu.sname||'-'||stu.sage||'-'||stu.ssex||'-'||stu.sdept);
6 end;
7 /
1-张波 -18-男 -软件工程
PL/SQL 过程已成功完成。
四、流程控制语句
1.选择语句
a.if语句
格式:if 条件
then 执行满足后的语句
[ elsif 判断条件
then 执行满足后的语句]
[...........]
[ else 所有调节都不满足的情况下
end if;]
[]内是可有可无
比如根据输入的月份来判断是什么季节
SQL> declare
2 n number;
3 begin
4 n:=&number;
5 if n>=1 and n<=3 then
6 dbms_output.put_line('春天');
7 elsif n between 4 and 6 then
8 dbms_output.put_line('夏天');
9 elsif n in(7,8,9) then
10 dbms_output.put_line('秋天');
11 elsif n>10 and n<=12 then
12 dbms_output.put_line('冬天');
13 else
14 dbms_output.put_line('输入有误');
15 end if;
16 end;
17 /
输入 number 的值: 5
原值 4: n:=&number;
新值 4: n:=5;
夏天
PL/SQL 过程已成功完成。
b.case语句
格式:
case 变量
when 表达式1 then 语句1;
when 表达式2 then 语句2;
.。。。
when 表达式n then 语句n;
else 都不满足执行的语句;
end case;
类似switch语句
例:输入1234分别代表输出加减乘除
SQL> declare
2 num number;
3 begin
4 num:=&number;
5 case num
6 when 1 then
7 dbms_output.put_line('加');
8 when 2 then
9 dbms_output.put_line('减');
10 when 3then
11 dbms_output.put_line('乘');
12 when 4 then
13 dbms_output.put_line('除');
14 else
15 dbms_output.put_line('输入有误');
16 end case;
17 end;
18 /
输入 number 的值: 1
原值 4: num:=&number;
新值 4: num:=1;
加
PL/SQL 过程已成功完成。
2.循环语句
a.loop语句
格式 1:
loop
循环语句;
exit when 循环语句结束调节;
循环语句结束条件修改
end loop;
类似do while 语句
SQL> declare
2 i number:=1;
3 num number:=0;
4 begin
5 loop
6 num:=num+i;
7 exit when i>=100;
8 i:=i+1;
9 end loop;
10 dbms_output.put_line(num);
11 end;
12 /
5050
PL/SQL 过程已成功完成。
格式2:
while(循环结束条件) loop
循环执行的语句块;
循环结束条件修改;
end loop;
类似while 语句
求1-100和
SQL> declare
2 i number:=1;
3 num number:=0;
4 begin
5 while i<=100 loop
6 num:=num+i;
7 i:=i+1;
8 end loop;
9 dbms_output.put_line(num);
10 end;
11 /
5050
PL/SQL 过程已成功完成。
b.for语句
for 循环计数器 in[reverse] 循环下限值..循环上限值 loop
循环语句块;
end loop;
求1-100之和
SQL> declare
2 i number:=1;
3 num number:=0;
4 begin
5 for i in 1..100 loop
6 num:=num+i;
7 end loop;
8 dbms_output.put_line(num);
9 end;
10 /
5050
PL/SQL 过程已成功完成。