Oracle_Day10(PLSQL语法)
PLSQL语法
Declare
声明部分(变量 游标)
Begin
语句(DML DQL)
Exception
异常处理
End;
变量和常量的定义:
变量名 数据类型 := 默认值
数据类型:char varchar varchar2 date number Boolean long
特殊类型: 记录类型 %type %rowtype
分支结构:
If 条件 then 语句 end if;
If 条件 then 语句 else 语句 end if
If 条件 then 语句 elsif 条件 then … else 语句 end if;
Loop循环结构:
语法1:
while 条件 loop
End loop;
--while ... loop
declare
total number := 0;
begin
while total <= 100 loop
dbms_output.put_line(total);
total:= total + 1 ;
end loop;
end;
语法2:
Loop
Exit[ when 条件];
End loop;
declare
step number := 1;
begin
loop
exit when step > 100;
dbms_output.put_line(step);
step := step + 1;
end loop;
end;
语法3:
For var in start … end loop
End loop;
--For var in start end loop
declare
step number := 1;
begin
for step in 1 .. 100 loop
dbms_output.put_line(step);
end loop;
end;
游标 cursor:
查询返回多条记录的情况的处理,游标可以存储和查询返回的多条数据
语法:
Cursor 游标名[参数名1 数据类型,参数名2 数据类型…] is select 语句;
游标的使用步骤:
1 声明一个游标
2 打开游标 open 游标名(打开游标之后 就可以执行查询)
3 从游标中取一行值 fetch 游标名 into 变量
4 关闭游标 close 游标名 (释放资源)
游标的结束方式:exit when 游标名%notfound
-- 查询并输出emp表中所有员工的 编号和姓名
declare
cursor cp is select * from emp;--声明一个游标
pemp emp%rowtype;--声明一个变量 存储一条记录
begin
--打开游标
open cp;
loop
fetch cp into pemp;--从游标中取一行记录
dbms_output.put_line(pemp.empno|| ' ' || pemp.ename);
exit when cp%notfound;
end loop;
close cp;--关闭游标
end;
-- 按照员工的职位涨工资 CEO 涨1000元 manager 涨800元 其他员工涨400元
declare
cursor cp is select * from emp1;
addsal emp1.sal%type;
pemp emp1%rowtype;
begin
open cp;
loop
fetch cp into pemp;
exit when cp%notfound;
if pemp.job = 'PRESIDENT' then
addsal := 1000;
elsif pemp.job ='MANAGER' then
addsal :=800;
else
addsal := 400;
end if;
--更新薪资
update emp1 set sal = sal + addsal where empno= pemp.empno;
end loop;
close cp;
end;
-- 编写plsql程序 为部门编号为10的员工涨工资1000
declare
cursor cp(dno emp1.deptno%type) is select empno from emp1 where deptno =dno;
pno emp1.empno%type;
begin
open cp(10);
loop
fetch cp into pno;
exit when cp%notfound;
update emp1 set sal = sal + 1000 where empno=pno;
end loop;
close cp;
end;
存储过程(理解):
存储过程是在数据库系统中,一组为了完成特定功能的SQL语句集。经过编译后存储在数据库中,用户通过指定存储过程的名字并传递给相应的参数,来调用存储过程,执行并返回。
存储过程的语法:
Create [or replace ] procedure 过程名[参数名 in/out 数据类型] AS
Begin
Plsql程序体;
End;
编写存储过程:
--创建一个存储过程 暑促和helloworld
create or replace procedure helloworld is
begin
dbms_output.put_line('hello world');
end helloworld;
调用存储过程-sql窗口:
--调用执行存储过程 hellowrold
begin
helloworld;
end;
--给指定的员工涨薪100,并打印涨薪前和涨薪后的工资
-- 由于给指定的员工涨薪 通过员工的工号 因此此时的存储过程就带有参数
create or replace procedure addSal(eno in number) is
pemp emp1%rowtype;
begin
select * into pemp from emp1 where empno=eno;
--涨薪 更新数据
update emp1 set sal = sal + 100 where empno=eno;
dbms_output.put_line('涨薪前:' || pemp.sal || '涨薪后:' || (pemp.sal + 100));
end addSal;
注意:存储过程的参数不能使用%type类型
begin
addsal(eno=>7902);--名称传参
commit;
end;
传参 :
begin
addsal(7902);--位置传参
commit;
end;