目录
一,PL/SQL概述
-
PL/SQL是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言(过程化SQL语言);
-
PL/SQL是Oracle对SQL语言的扩展,扩展部分内容:变量、常量、
存储过程、程序包、游标、函数、触发器、条件控制、循环控制等; -
PL/SQL与Oracle服务器和Oracle工具紧密集成,具备可移植性、灵活性和安全性;
-
PL/SQL语法特点:PL/SQL程序都是以块(block)为基本单位,整个PL/SQL块分三部分:声明部分(用declare开头)、执行部分(以 begin开头,以end结尾)和异常处理部分(以Exception开头)。其中执行部分是必须的,其他两个部分可选。无论PL/SQL程序段的代码量有多大,其基本结构就是由这三部分组成。
二,变量和常量
1.变量
语法结构
declare
变量名 数据类型;
begin
执行代码块内容;
end;
赋值方式
-
方式一:":="
-
方式二:"select into 语句"
2.常量
语法结构
decare
变量名1 constant 数据类型 := 值;
begin
执行代码块内容;
end;
3.变量和常量的区别
-
常量声明的时候要在数据类型前面加 constant 关键字,表示常量的意思;
-
常量必须初始值,且值不能被修改;
三,%type和%rowtype
1.%type
-
作用:用来引用数据表里面某个字段的数据类型;
-
通俗解释:当我们想要声明一个变量来保存表内某个字段值但是又不知道该变量用什么数据类型的时候,我们就可以引用表内该字段的数据类型来作为变量的数据类型。
-
-
案例演示:根据员工编号查询出员工的姓名和入职日期。
declare
sid number(7) :=7499;
sname varchar2(10);
mydate emp.hiredate%type;--通过%type引用 emp 表里面 hiredate 字段的数据类型。
begin
select ename,hiredate into sname,mydate from emp
whereempno=sid;
dbms_output.put_line('名字是:'||sname||',入职日期是:'||mydate);
end;
2.%rowtype
-
作用:可以声明一个基于表的行对象,也称为记录对象。
-
案例:根据员工编号查询出名字和岗位(用一个变量保存)。
declare
sid number :=7499;
mysum emp%rowtype;
begin
select * into mysum from emp where empno=sid;
dbms_output.put_line('名字是:'||mysum.ename||',岗位是:'||mysum.job);
end;
四, 控制结构
1.条件控制语句
1.1 if语句
if(条件1) then
条件1成立执行代码块
elsif(条件2) then
条件2成立执行代码块
.......
else
以上条件都不成立执行代码块
end if;
1.2 case语句
begin
case '&变量'
when '值1' then 执行代码块1;
when '值2' then 执行代码块2;
when '值3' then 执行代码块3;
when '值4' then 执行代码块4;
..............
else 当以上值都不满足的时候执行代码块
end case;
end;
"&":作用相等于Java里面的Scanner;
2.循环控制语句
2.1 loop循环
- 案例1:输出1-100之间所有数字;
declare
i number:=0;
begin
<<aloop>> --给loop循环取别名:aloop
loop
dbms_output.put_line(i); --输出每一个值
i:=i+1; --i的值在叠加
exit aloop when i=101; --当i等于100的时候aloop循环退出
end loop;
end;
2.2 while循环
- 案例:求1-100之间的和。
declare
i number(8):=0;
mysum number(8):=0;
begin
while(i<=100) loop
mysum:=mysum+i;
i:=i+1;
end loop;
dbms_output.put_line(mysum); --循环完成后输出最终求的和
end;
2.3 for循环
- 案例:求1-100之间的和。
mysum number(7):=0;
begin
for i in 1..100 loop
mysum:=mysum+i;
end loop;
dbms_output.put_line(mysum);
end;
五,异常处理
1.预定义异常/系统自带异常
1.1 too_many_rows
-
too_many_rows:行太多。意为:实际返回的行数超出请求的行数。
declare
sid number:=7499;
mysum emp%rowtype;
begin
select * into mysum from emp;
dbms_output.put_line('名字是:'||mysum.ename||',岗位是:'||mysum.job);
exception when too_many_rows then
dbms_output.put_line('太多行');
end;
1.2 no_data_found
- no_data_found:行太少。意为:未查询到数据。
declare
sid number:=0;
mysum emp%rowtype;
begin
select * into mysum from emp where empno=sid;
dbms_output.put_line('名字是:'||mysum.ename||',岗位是:'||mysum.job);
exception when no_data_found then
dbms_output.put_line('行太少');
end;
2.自定义异常
- 语法:
declare
异常变量 exception;
begin
if(触发异常条件) then
raise 异常变量;
else
未触发异常执行的代码块
end if;
exception when 异常变量 then
触发异常执行的代码块
end;
六,自定义函数
- 语法结构
create [or replace] function 函数名 (参数1,参数2)
return 返回值类型 is|as
定义返回变量(要取长度);
begin
函数要执行的sql语句
return 变量名;
end;