一:plsql结构定义
PL/SQL(Procedural Language/SQL):过程化编程语言
Oracle对标准SQL语言的过程化扩充
用来编写包含SQL语句的程序,加入业务逻辑处理功能。
PL/SQL程序由块组成,每一个块都包含有PL/SQL和SQL语句。块的结构如下:
[
declare 变量名 类型;--声明变量
变量名 类型;
]
begin
[过程语句]
[exception when 异常类型 then 过程语句]
end;
举例:
/**
等价
{
System.out.println('helloworld')
}
**/
begin --等价于{
dbms_output.put_line('helloworld');
end; --等价于}
--带变量的plsql定义
declare userid number;
begin
--变量的赋值 可以通过 变量名:=值
userid:=1;
dbms_output.put_line(userid);
end;
--带异常的plsql定义
declare userid number;
begin
--变量的赋值 可以通过 变量名:=值
userid:=1/1;
dbms_output.put_line(userid);
--异常的定义 when 异常类型 then 异常处理的代码块
exception when others then
dbms_output.put_line('出现异常');
end;
二 :复合类型
--在过程中调用函数和存储过程
declare curdate date:=sysdate;
curDateStr varchar2(10);
begin
curDateStr:=to_char(curdate,'yyyy-MM-dd');
dbms_output.put_line(curDateStr);
end;
--在过程中定义复合类型
1>数组类型
declare
type ArrayList is table of number index by binary_integer;
ua ArrayList;
begin
ua(0):=12;
ua(-1):=20;
dbms_output.put_line(ua(0));
end;
2>定义复合类型的对象类型 使用对象的成员可以使用 对象.属性名称访问
declare
type userinfo is record(
userid number,
userName varchar2(20),
sex number
);
jyb userinfo;
begin
jyb.userid:=1;
jyb.userName:='蒋永兵';
jyb.sex:=0;
dbms_output.put_line(jyb.userName||'的用户id是:'||jyb.userid);
end;
三 列类型和行类型
--定义列类型 通过获取表的列类型给当前变量
declare sex_tmp tb_student.sex%type;
begin
sex_tmp:='1';
syso(sex_tmp);
end;
--行类型 通过select into语句抓取一行
declare student_row tb_student%rowtype;
sname varchar2(20);
begin
--select into用于在过程语句中将表中的数据抓取到变量中
--这里是抓取行
select * into student_row from tb_student where sid=1;
--抓取行中的某一列到变量
select sname into sname from tb_student where sid=1;
syso(student_row.sname);
syso(sname);
end;
四 定义过程的逻辑控制语句
1>if逻辑控制语句
declare sex number:=3;
begin
if (sex=0) then
syso('男');
elsif(sex=1) then
syso('女');
else
syso('不男不女');
end if;
end;
2>循环
--loop循环 相对于java的do while循环
declare num number:=1;
begin
loop
syso(num);
num:=num+1;
exit when num=11;
end loop;
end;
--while循环 相对于java的while循环
declare num number:=1;
begin
while (num<=10)loop
syso(num);
num:=num+1;
end loop;
end;
--for循环 相对于java的for循环 reverse表示反转输出
declare num number:=1;
begin
for i in 1..10 loop
syso(i);
end loop;
end;
--隐式游标方式的循环 用于循环迭代表记录
begin
for stu_tmp in (select * from tb_student) loop
syso(stu_tmp.sname);
end loop;
end;