一、PL/SQL 功能和特点
PL/SQL 是过程语言(Procedural Language)和结构化查询(SQL)语言结合而成的编程语言;PL/SQL是SQL的扩展,支持大对象、集合类型。还可以给SQL语言增加程序逻辑。支持SQL,在PL/SQL种可以使用:数据操纵命令、事物控制命令、游标控制、SQL函数和SQL运算符。PL/SQL有更佳的性能,当用户把PL/SQL块发送到服务器端,由Oracle服务器端编译、运行、再把结果返回给用户,可以移植性,可执行在任何操作系统上。PL/SQL可以通过存储过程限制对用户的访问来提高安全性。
Oracle服务器中有PL/SQL引擎 和 SQL引擎 ,PL/SQL引擎执行 for ,if 等过程语句 , 而SQL引擎执行 insert、delete等SQL语句
PL/SQL分为三个部分,声明部分、可执行部分、异常处理部分,其中可执行部分是必须要有的。
DECLARE
--声明变量在这里写
BEGIN
--过程程序在这里写
EXCEPTION
--异常处理在这里写
END;
二、Oracle 11g的PL/SQL对序列的改进,即无dual序列的使用
----创建一个序列 seq ----
create sequence seq start with 1 increment by 1;
----SQL语句的序列取值必须用select -----
select seq.nextval from dual ;
----过程语句不需要select 也可以进行序列取值
declare
se positive ; --正整数
begin
se :=seq.nextval ;
-- select seq.nextval into se from dual ;
dbms_output.put_line(se);
end;
/
drop sequence seq;
三、控制语句和continue语句
条件判断语句: if ..then ; if..then..else; if..then.elsif..; case 语句;
循环语句: Loop [无条件循环内容 ] end loop ; while [循环条件] loop [循环内容] end loop;
for [循环体变量] in [循环体变量的取值范围] loop [循环内容] end loop;
注: Loop [无条件循环内容 ] end loop 通常和exit搭配,相当于JAVA的break ,如果没有控制语句搭配,相当于无限循环。
continue; 直接进入下一个循环;
在PL过程语句中是不能使用DDL语句的,即create、drop、truncate等操作。想要用DDL语句必须用动态SQL执行:
execute immediate sql_command [into 执行结果集][using 绑定变量集 ]
---可重跑的SQL脚本:创建并初始化表示例------
declare
sql_command varchar2(500);
isExsit number ;
begin
select count(1) into isExsit from user_tables where table_name ='SALARY_TBL';
if isExsit <> 0 then
sql_command :='truncate table salary_tbl';
execute immediate sql_command;
sql_command :='drop table salary_tbl';
execute immediate sql_command;
end if;
sql_command := '
create table salary_tbl(
employer_nm varchar(20),
department varchar(20) not null,
salary number not null,
leader_nm varchar(20)
)';
execute immediate sql_command;
for i in 1..13000
loop
insert into salary_tbl values('雇佣者'||i,'部门'||Mod(i,50),100+sqrt(i),'雇佣者'||Mod(i,20));
if Mod(i,1000)=0 then
commit;
end if;
end loop;
commit;
end;
/
---goto 语句示例
declare
sql_command varchar2(500);
isExsit number ;
i number := 1;
begin
select count(1) into isExsit from user_tables where table_name ='SALARY_TBL';
if isExsit <> 0 then
sql_command :='truncate table salary_tbl';
execute immediate sql_command;
sql_command :='drop table salary_tbl';
execute immediate sql_command;
end if;
sql_command := '
create table salary_tbl(
employer_nm varchar(20),
department varchar(20) not null,
salary number not null,
leader_nm varchar(20)
)';
execute immediate sql_command;
<<code_aa>> -
insert into salary_tbl values('雇佣者'||i,'部门'||Mod(i,50),100+sqrt(i),'雇佣者'||Mod(i,20));
if Mod(i,1000)=0 then
commit;
end if;
i :=i+1;
if i <13000 then
goto code_bb;
else
goto code_aa;
end if ;
<<code_bb>>
commit;
end;
/
四,Oracle11g 中的错误处理
异常分为预定义异常和用户自定义异常。预定义异常就是系统自带的异常,而用户自定义异常(raise)是自己声明的相当于java的throw。
预定义异常 exception when [异常名] then ... when [异常名2 ] then ...
raise_application_error (异常编号,异常信息) 即异常中断程序并输出异常信息
declare
department varchar(20) := '';
nullinserterror1 exception;
begin
if department is null then
raise nullinserterror1;
end if;
insert into salary_tbl values('雇佣者9999',department,100,'雇佣者4');
exception
when nullinserterror1 then
dbms_output.put_line('自定义空值插入异常');
raise_application_error (-20001,'空值异常');
end;
/
在输出结果中显示