Oracle PL/SQL编程基础
1.PL/SQL简介
定义:是Oracle在标准SQL语言上的过程性扩展.是结构化的查询语句.
优点和特性:
(1)提高应用程序的运行性能
存储过程或SQL块-提高效率,还颁布对数据数据进行缓存.最大优点是可以降低网络开销,提高应用程序性能.
(2)提高模块化的程序设计功能
为了简化客服端应用程序的开发和维护工作,在应用程序中调用子程序实现相应的程序功能.
(3)允许定义标示符
为了使得应用程序模块与应用环境交互,需要定义变量,常量,游标,和异常等各种标示符.
(4)具有过程语言控制结构
允许在PL/SQL块中使用各种类型的条件分支语句和循环语句.(分支控制语言,循环语句等编程语句,使结构化的查询语言具有编程语言)
(5)具有良好的兼容性
可选内置程序包,也可以在Oracle所提供的应用开发工具Deveolper中使用PL/SQL开发客户端的过程,函数和触发器.
(6)处理运行错误
能做DML数据操作语句,事务控制,不能做DDL(数据定义语言).
2.PL/SQL语言基础
组成:包括数据查询语言(select),数据操纵语言(insert,delete,update),事务控制语言(commit,rollback,savepoint),数据定义语言(create,alter,dorp)和数据控制语言(grant,revoke)等5个部分.
3.PL/SQL块
块是PL/SQL的基本程序单元,PL/SQL块由三个部分组成,定义部分,执行部分,和异常处理部分.
定义部分:用于常量,变量,游标,异常及其复杂的数据类型.
执行部分:用于实现应用模块功能,该部分包括要执行的PL/SQL语句和SQL语句.
异常处理部分:用于处理的执行部分可能出现错误的运行错误.
例如:declare
v_ename varchar2(20);--定义部分
begin
--执行部分
select ename into v_ename from scott.emp where empno=&empno;
dbms_putout.put_line('员工姓名:'||v_ename);
exception
--异常处理部分
when no_data_found then
dbms_putout.put_line('请输入正常的员工号')
end;
4.PL/SQL数据类型
标量类型:
varchar2(n),
char(n),
number(p,s),
date:用于定义日期和时间类型,固定长度为7个字节长度.
timestamp:定义日期和时间数据,赋值方法和date类型的方法一致.
boolean:定义布尔变量,其变量的值为true,false或null.(在定义表的列类型是不能定义BOOLEAR类型)
":=":分号加等号用于给变量赋值,"||"用于链接字符串,"&"用于定义输入.
属性类型:
%type:类型引用,%rowType用于行类型的引用.
5.PL/SQL控制结构
条件分支:用于依据特定的情况选择执行的操作.
语法:if 条件 then
elsif 条件 then
else .....
end if;
例如:declare
v_sal number(6,2);
begin
select sal into v_sal from scott.emp where ename=trim('&ename');
if v_sal<200 then
update scott.emp set sal=v_sal+200 where ename=trim('&ename');
end if;
end;
case语句:执行多重条件分支,
语法:case selector
when expession then
处理语言
else
end case;
注释:selector用于指定条件值的表达式,expession用于指定条件值的表达式.
例如:declare
v_deptono scott.emp.deptno%type;
begin
v_deptno:=&deptno;
case v_deptno
when 10 then
update scott.emp set comm=100 where deptno=v_deptno;
when 20 then
update scott.emp set comm=80 where deptno=v_deptno;
when 30 then
update scott.emp set comm=60 where deptno=v_deptno;
else
dbms_putout.put_line('不存在该部门');
end case;
end;
循环语句:在PL/SQL块要重复执行一条语句或者一组语句,可使用循环控制语句,
该结构有三种语句:分别是基本循环,w]hile循环和for循环
基本循环:使用该语句时,无论条件是否满意,语句至少会执行一次.
语法:loop
逻辑处理....
Exit when 条件表达式
end loop;
例如:declare
i int :=1;
begin
loop
dbms_output.put_line(i);
exit when i=10;
end loop;
end;
while循环:只有满足循环条件,才会执行循环体内的语句.
语法:while 条件表达式 loop
逻辑处理....
end loop;
例如:declare
i int:=1;
begin
while i<10 loop
dbms_output.put_line(i)
i:=i+1;
end loop;
end;
for循环:它的循环控制变量有Oracle隐含定义,且只能是number类型.
语法:for 条件表达式 loop
逻辑处理....
end loop;
例如:declare
i int:=1;
begin
for i in i..10 loop
dbms_output.put_line(i);
end loop;
end;
6.异常处理:异常处理是PL/SQL的标示符,默认情况下当发生异常时会终止PL/SQL的执行.Oracle提供了预定义异常,非定义异常和自定义异常等三种类型.
语法:exception
when 条件表达式 then
when 条件表达式 then
例如:declare
v_name scott.emp.ename%type;
begin
select ename into v_name from scott.emp where empno=&empno;
dbms_output.put_line(v_name);
exception
when no_date_found then
dbms_output.put_line('员工编号不正确,请输入正确');
end;
处理预定义异常:d当PL/SQL应用程序违反Oracle规则或系统限制时,会隐含的触发一个内部异常.
常用的预定义:
case_not_found:对应ORA-06592错误,
currsor_aleardy_open:对应ORA-06511错误,当打开已经打开的游标时,会隐含触发该异常.
invalid_number:对应ORA-01722错误,当不能有效的吧字符串转化为数字时,会隐含触发该异常.
too_many_rows:对应ORA-01476错误,当执行select into子句时,如果返回超过一行就会触发该异常.
zero_dovide:对应ORA-01476错误,如果除数为0,触发该异常.
no_date_found:对应ORA-01403错误,当执行select into未返回行,或者引用了索引表未初始化元素时,会隐含触发该遗产.
处理自定义异:自定义异常必须是显示触发,使用自定义异常的步骤包括定义异常,显示触发异常和引用异常.
7.游标:当在PL/SQL块中执行查询语句和数据操纵语句时,为了处理select语句返回的多行数据,开发人员必须使用显示游标.
语法:第一步:定义游标
第二步:打开游标
第三步:提取数据
第四步:关闭游标
显式游标属性:
%isopen:判断游标是否打开.
%found:检查游标是否从结果集中提取数据.
%not found该属性与%found属性x相反.