PL/SQL编程基础:
1.PL/SQL块基本结构:
declare (可选项,用于声明变量)
……
begin
……
exception (异常处理)
……
end
/
2.PL/SQL变量声明:
变量声明所要做的主要工作:赋予变量适当的名称,正确的数据类型,控制变量的作用范围。
变量命名规则:由字母开头,可以包含数字,下划线(_),$,#等,不区分大小写,不可以是系统关键字。
一个简单的PL/SQL变量声明的例子如下:
declare
x varchar2(10);
begin
x:=’This is x…..’; --为变量x赋值,赋值符号为(:=)
DBMS_output.put_line(‘x的值为:’|| x); --在命令行控制台打印输出变量x的值
end;
/ --执行该PL/SQL程序块
3.PL/SQL中的分支语句:
PL/SQL中有两种分支语句:if分支和case分支。
(1).if分支:
if …… then
……
elsif …… then --注意Oracle中的elseif写法为(“elsif”),比较特殊
……
else
……
end if;
(2).case分支:
case
when …… then ……
when …… then ……
else ……
end case;
4.PL/SQL中的循环:
PL/SQL中有三种循环:基本循环,while循环和for循环:
(1).基本循环(loop):
loop
……
end loop;
(2).While循环:
while expression loop
……
end loop;
(3).for循环:
for counter in[reverse] start_value .. end_value loop --注意:reverse是从大到小,默认是从小 --到大。start_value和end_value之间是两个点(..)
……
end loop;
注意:若想要在PL/SQL循环中跳出循环,可以使用以下两种方法:
a. if …… then
exit;
end if;
b.exit when ……;
5.PL/SQL for循环的简单例子:
设置Oracle控制台屏幕输出命令:set serveroutput on.
PL/SQL for循环的简单例子:
begin
for i in 1..5 loop
DBMS_output.put_line(‘i=’|| i);
end loop;
end;
/
6.PL/SQL中支持goto跳转语句:
在很多编程语言中,goto语句都不支持或者不推荐使用,在PL/SQL中是支持goto跳转的,其使用方法如下:
declare
x number;
begin
x:=0;
<<repeat_loop>> --goto跳转标记
x:=x+1;
DBMS_output.put_line(‘x=’||x);
if x < 3 then
goto repeat_loop; --程序跳转到goto跳转标记处
end if;
end;
/
7.PL/SQL中的异常处理:
语法:exception
when …… then
……
例子如下:
exception
when no_data_found then --oracle系统异常
DBMS_output.put_line(‘自定义异常信息’);
注意:PL/SQL异常必须在begin和end之间使用。
8.PL/SQL自定义异常:
PL/SQL自定义异常很简单,要使用自定义异常必须显示抛出自定义异常,例子如下:
declare
test varchar2(20);
e exception; --声明自定义异常变量
begin
select ename into test from emp where empno = ‘……’;
if test <> ‘KING’ then
raise e; --显示抛出自定义异常
end if;
DBMS_output.put_line(‘ename=’||test);
exception
when e then
DBMS_output.put_line(‘自定义异常信息’);
end;
/
9.PL/SQL中记录:
PL/SQL中有一种数据结构叫做记录,记录是由几个相关值构成的复合变量,常用于支持select语句的返回值,使用记录可以将一行数据看成一个单元进行处理,而不必将每列单独处理。
(1).记录的声明:
type 记录名 is record(
变量名1 datatype[,
变量名2 datatype[,
……
);
记录引用名 记录名; --使用引用名引用记录
注意:PL/SQL记录的注意事项:
a.在记录中指定数据类型时,可以使用如”emp.id%type”的方式,意思是和emp表中的id数据类型相同。
b.也可以使用”记录名 表名%rowtype”方式,意思是记录中的变量名和数据类型和表中的列完全相同。
c.PL/SQL中不能直接使用select … from …,必须使用select … into 变量 from …方式将查询的记录存放在变量中。
(2).记录使用例子1:
declare
myrecord emp%rowtype; --声明记录和emp表中的记录完全一致
begin
select * into myrecord from emp where ……;
DBMS_output.put_line(“empno=”||myrecord.empno); --打印输出记录中的empno变量的值
end;
/
(3).记录使用例子2:
declare
type myrecord is record(
id varchar2(20),
name varchar2(50)
);
test_record myrecord; --使用test_record引用自定义的记录
begin
select empno,ename into test_record from emp where ……
DBMS_output.;put_line(‘id=’|| test_record.id || ‘,name=’ || test_record.name);
end;
/
10.游标:
游标是一种PL/SQL控制结构,可以对SQL语句的处理进行显式控制,便于对表的行数据逐条进行处理。游标分为显式游标和隐式游标。
11.显式游标:
显式游标是显式声明和定义的游标,需要显式地打开和关闭。
(1).显式游标的简单实用例子:
declare
cursor mycur is select * from emp; --显式游标的声明方式
myrecord emp%rowtype; --声明记录
begin
open mycur; --打开游标
fetch mycur into myrecord; --将游标中一条数据放入记录中
while mycur%found loop --游标中还有数据
DBMS_output.put_line(‘empno=’ || myrecord.empno || ‘,ename=’ || myrecord.ename);
fetch mycur into myrecord; --将游标中下一条数据放入记录中
end loop;
close mycur; --关闭游标
end;
/
注意:游标的常用属性有:%found,%isopen,%notfound,%rowcount。
(2).使用游标参数例子:
可以通过给游标传递参数,从而得到相应的游标值,如:
declare
cursor cur_param(id varchar2) is --游标参数不需要指定数据长度
select ename from emp where empno = id;
begin
DBMS_output.put_line(‘result set is:’);
for cur in cur_param(7389) loop --此处的cur是一个隐式游标
DBMS_output.put_line(‘ename=’ || cur.ename);
end loop;
end;
/.
(3).利用游标修改数据的例子:
declare
cursor cur is
select ename from emp for update; --注意:修改数据必须加上“for update”
text varchar2(20);
begin
open cur;
fetch cur into text
while cur%found loop
update emp set ename = ename || ‘_testupdate’ where current of cur; --修改游标所在行
fetch cur into text;
end loop;
close cur;
end;
/
12.隐式游标:
隐式游标不需要在declare块中先是声明定义,也不需要手动打开和关闭,一个简单的隐式游标的例子如下:
begin
for cur in (select ename from emp) loop --此处的cur就是隐式游标
DBMS_output.put_line(‘ename=’ || cur.ename);
end loop;
end;
/
13.存储过程:
存储过程是一组实现特定功能的PL/SQL语句块,被数据库编译编译以提高效率。
(1).创建存储过程的语法:
create [or replace] procedure 存储过程名
[(param1 [{in | out | in out}])] 参数类型1, --in是输入参数,out是输出参数
[(param2 [{in | out | in out}])] 参数类型2, -- in out是输入输出参数,不指定时默认是in
……
is | as
……
begin
存储过程体
end;
/
注意:当存储过程编译出错时,可以使用”show errors procedure 存储过程名”来显示错误信息。
(2).创建存储过程的例子:
create or replace procedure myProc(id in varchar2)
is
begin
select ename from emp where empno=id;
end;
/
(3).执行存储过程:
存储过程的调用有以下三种方法:
a.在PL/SQL中调用,如:
begin
myProc(7900);
end;
/
b.使用call来调用,如:
call myProc(7900);
c.通过execute调用,如:
execute myProc(7900);
注意:execute调用存储过程时,要么不带任何参数,要么只能是输入参数。
(4).带输出参数的存储过程:
create or replace procedure myProc2(id in varchar2, name out varchar2)
is
begin
select ename into name from emp where empno = id;
end;
/
带输出参数的存储过程不能使用execute来调用。
调用例子如下:
declare
tid varchar2(10);
tname varchar2(20);
begin
tid:=7900;
myProc2(tid, tname); --调用带输出参数的存储过程
DBMS_output.put_line(‘ename=’ || tname);
end;
/