PL/SQL编程语言
概念
plsql是oracle对sql进行的过程化扩展,使sql语言具有过程处理能力。
如支持 update emp set sal=sal*1.2
语法
declare
说明部分(变量说明,光标说明,例外说明)
begin
语句序列(DML语句)
exception
例外处理语句
end;
常量类型
1.说明变量
如char,varchar2,date,number,boolean,long
例var1 char(10);
psal numbe(9,2);
2.引用变量
my_name emp.ename%type;
即my_name的类型和emp表中ename列的类型一样
sql里使用into赋值。
declare
emprec emp.ename%type;
begin
select t.tname into emprec from emp t where t.empno=7639;
dbms_output.put_line(emprec);
end;
3.记录型变量
emp_rec emp%rowtype;
记录变量分量的引用
married boolean :=true;
if语句
1.if 条件 then 语句1;
语句2;
end if;
范例:
declare
pnum number :=#
begin
if pnum =1 then
dbms_output.put_line(‘我是1’);
end if;
end;
2.if 条件 then 语句序列1;
else 语句序列2;
end if;
3.if 条件 then 语句1;
elsif 语句序列2;
else 语句序列3;
end if;
循环
语法1:
declare
step number :=1;
begin
while step <= 10 loop
dbms_output.put_line(step);
step := step +1;
end loop;
end;
语法2:
declare
step number :=1;
begin
loop
exit when step > 10
dbms_output.put_line(step);
step := step +1;
end loop;
end;
语法3:
declare
step number :=1;
begin
for step in 1…10 loop
dbms_output.put_line(step);
end loop;
end;
游标(光标cursor)
语法:
cursor 游标名 【{参数名 数据类型,参数名 数据类型,…}】is select 语句;
例
cursor c1 is select ename from emp;
例外
系统定义异常
no_data_found
too_many_rows(select…into语句匹配多个行)
zero_error(被零除)
value_error(算数或转换错误)
timeout_on_resource(等待资源时超时)
存储过程
存储过程是一组经过编译后存储在数据库中的可以完成特定功能的sql语句。
语法1:
create [or replace] procedure 过程名[(参数名 in/out 数据类型)]
as
begin
plsql子程序体;
end 过程名;
语法2:
create [or replace] procedure 过程名[(参数名 in/out 数据类型)]
is
begin
plsql子程序体;
end 过程名;
存储函数
语法:
create or replace function 函数名[name in type,name out type,…] return 数据类型 is 结果变量 数据类型;
begin
return[结果变量]
end [函数名];
区别
存储过程和存储函数的区别在于函数可以有一个返回值,而过程没有返回值;
过程和函数都可以通过out指定一个或多个输出参数;
可以用out参数,在过程和函数中实现返回多个值;
触发器
触发器是一个与表相关联的、存储的PL/SQL程序,当特定的数据操作语句(insert,update.delete)在指定的表上发出时,oracle会自动执行触发器中定义的语句序列。
语法
create [or replace] trigger 触发器名
{before | after}
{delete |insert |update [of 列名]}
on 表名
[for each row [when(条件)]]
declare
…
begin
plsql块
end 触发器名
触发器语法分为3部分,第一部分说明创建的触发器使用条件,第二部分即declare部分,用来定义本地变量,下面的第三部分会用到。第三部分是触发器的操作部分,当被触发时,执行相应的语句。
应用
使用触发器模拟mysql中自增效果
1.创建序列
1).建立表
create table user
(
id number(6) not null,
name varchar2(30) not null primary key
)
2).建立序列
create sequence user_seq;
2.创建自增触发器
create or replace trigger user_trigger
before insert on user
for each row
begin
select user_seq.nextval into:new.id from sys.dual;
end;
3.测试效果
insert into ituser(name) values(‘aa’);
comit;
insert into ituser(name) values(‘bb’);
comit;