PL/SQL(Procedural Language/SQL):过程化编程语言
Oracle对标准SQL语言的过程化扩充
用来编写包含SQL语句的程序,加入业务逻辑处理功能。
PL/SQL程序由块组成,每一个块都包含有PL/SQL和SQL语句。块的结构如下:
[
declare 变量名 类型; --声明变量
变量名 类型;
]
begin
[过程语句]
[exception when 异常类型 then 过程语句]
end;
常用的变量类型有:
BINARY_INTEGER :整型数字。主要用于计数而不是用来表示字段类型
NUMBER[(精度,小数位)]:数字类型
CHAR[(长度)]:字长字符串
VARCHAR2[(长度)]:变长字符串
DATE:日期时间类型
TIMESTAMP:时间戳
BOOLEAN:布尔类型。有效值只有TRUE、FALSE、NULL
CLOB、BLOB、BFILE:大对象简单变量:也叫单值变量
--CONSTANT定义常量
变量名 [CONSTANT] 数据类型 [NOT NULL] [:=默认值];
复合变量:可以存放多个值。也叫组合变量
举例:
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 thendbms_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; --(可以看作键是number类型,值为binary_integer整形的map)
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:='xxx';
jyb.sex:=0;
dbms_output.put_line(jyb.userName||'的用户id是:'||jyb.userid);
end;三 列类型和行类型
--定义列类型 通过获取表的列类型给当前变量
declare sex_tmp tb_student.sex%type; -- 变量名 表名.列名%typebegin
sex_tmp:='1';
syso(sex_tmp);
end;--行类型 通过select into语句抓取一行
declare student_row tb_student%rowtype; --变量名 表名%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是自定义的存储过程
syso(sname);
end;-- plsq中不允许直接出现ddl语句(表对象的crud), 正确使用:execute immedate 'ddl语句'
四 定义过程的逻辑控制语句
1> if逻辑控制语句
declare sex number:=3;
beginif (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;