declare   --声明
char(15); --定义变量
number(7,2);  --数字类型
boolean:=true; --boolean类型
begin          --开始
:='HelloWorld'; --赋值
(msg); --输出
end; --结束
--声明的类型为 与emp.sal类型一致的变量
declare
%type; ---和emp表中的 sal类型一样
begin
--sal:=100.99;
select sal into sal from emp where empno=7499;
(sal);
end;
   
   
--记录一行
declare  ---声明
%rowtype; --emp_rec 变量 类型  emp%rowtype
begin
select * into emp_rec  from emp where empno=7499; ---给emp_rec赋值的时候 必须给它一条记录   into emp_rec   赋值的意思
(emp_rec.deptno);  ---输出  emp_rec.sal
end; --结束
 
select * from emp;
--If语句 形式1
declare
number(5,2);
begin
:=80;
if  grade>70 then
('成绩优秀');
end if;
end;
--if语句 形式2
declare
number(5,2);
begin
:=60;
if  grade>70 then
('成绩优秀');
else
('需要努力');
end if;
end;
   
   
--if 语句 形式3
 
declare
number(5,2);
begin
:=60;
if  grade>70 then
('成绩优秀');
elsif grade>50 then                     ---一定要注意  这里是elsif 
('需要努力');
else
('努力');
end if;
end;
 
 
   
accept num prompt('请输入一个数字');--接受键盘输入的值   这里会自动保存到num 中   下面就可以通过plsql语句操作了
declare  --声明
number := # --注意 &num &取值的意思 &num把它赋值给 pnum      注意  声明变量  变量  变量类型[:=赋予的值]
begin
(pnum);
if pnum>10 then
('输入的数字大于10');
end if;
end;
   
 
 
 
 
---循环语句
declare  --声明
number := 1;--注意  声明变量  变量  变量类型[:=赋予的值]
begin
while pnum<10  --while语句
loop   --循环的开始
(pnum);
:=pnum+1; --循环改变的条件
end loop; --循环的结束
end;
 
 
---循环语句
declare  --声明
number := 1;--注意  声明变量  变量  变量类型[:=赋予的值]
begin
loop   --循环的开始
exit when pnum>10;   --循环退出的条件
(pnum);
:=pnum+1; --循环改变的条件
  
end loop; --循环的结束
end;
---循环语句
declare  --声明
number := 1;--注意  声明变量  变量  变量类型[:=赋予的值]
begin
for i in 1..10
loop   --循环的开始
(i);
  
end loop; --循环的结束
end;
 
 
---循环语句
declare  --声明
begin
for i in 1..10  --in 变量  变量必须是游标
loop   --循环的开始
(i);
end loop; --循环的结束
end;
select * from emp;
--给manager 涨 800  salesaman 400 其它涨 200
 
declare
%type;
begin
select job into job_rec from emp;  --存在问题1 : 返回的job岗位为多个 而 job_rec只能接受一个值
if job_rec = 'MANAGER' then
update emp set sal=sal+800;    --存在问题2 :  update 语句有where条件
elsif job_rec='SALESMAN' then
update emp set sal=sal+400;
else
update emp set sal=sal+200;
end if;
end;
   
   
   
-- 游标的主要属性如下:
--  %found 布尔属性  如果sql语句至少影响一行 则为true 否则为false
--  %notfound 布尔属性 与%found相反。 
--  %isopen 布尔属性 游标是否打开  打开为true 否则为false
-- %rowcount 数字属性 返回受sql语句影响的行数
   
--查询sql语句
declare
%rowtype;--记录
begin
select * into emp_rec from emp where empno=7499;
('结果'||sql%rowcount);
end;
 
--更新sql语句
declare
begin
update emp set sal=3000  where empno=7499;
if sql%found then
('更新的记录数'||sql%rowcount);
else
('没有更新记录');
end if;
end;
 
 
declare
begin
update emp set sal=3000  where empno=7499;
if sql%notfound then  --更新  false
('没有更新记录');
else
('更新的记录数'||sql%rowcount);
end if;
end;
 
 
---隐式游标
declare  --声明
%rowtype;--记录
begin
for emp_rec in (select * from emp)  --in 变量  变量必须是游标
loop   --循环的开始
('员工名称:'||emp_rec.ename);
end loop; --循环的结束
end;
 
 
 
--声明游标,打开游标,检索数据,关闭游标。
 
--声明游标
declare
cursor cl  is select * from emp; --查询出所有的emp记录 存储到 cl游标中
%rowtype;--记录
begin
open cl; --打开游标
loop
exit when cl%notfound;   --循环退出的条件  cl%notfound   当没有记录的时候 返回true    
fetch cl into emp_rec;--检索数据
(emp_rec.empno);
end loop;
close cl;--关闭游标
end;
 
 
 
declare
cursor cl  is select * from emp; --查询出所有的emp记录 存储到 cl游标中
begin
for emp_row in cl --打开游标 (自动)   检索数据(自动)  关闭游标(自动)  emp_row 变量也不需要定义
loop
(emp_row.ename);
end loop;
end;
  
 
--带参数的游标
declare
cursor cl(pno number)  is select * from emp where empno=pno; --查询出所有的emp记录 存储到 cl游标中
begin
for emp_row in cl(7499) --打开游标 (自动)   检索数据(自动)  关闭游标(自动)  emp_row 变量也不需要定义
loop
(emp_row.ename);
end loop;
end;
 
 
--涨工资的案例 
--写一段PL/SQL程序,显示部门号为30的员工信息
  
 
 
 
 
 
 
 
 
--例外
--返回多行例外的处理
declare
%rowtype;
begin
select * into emp_row from emp; --隐式游标
        
exception                  ---exception 例外的声明
when too_many_rows then  --when 例外的名称(系统的例外 也可以是自定例外的名称) then 发生例外执行的操作
('实际返回了多行数据');
end;
   
   
   
--自定义的例外
   
declare
exception;  --声明自定义例外
%rowtype;
cursor cl(pno number) is  select *from emp where empno=pno;
begin
open cl(0000);
fetch cl into emp_row;
        
if cl%notfound then raise no_data; --在这里 抛出例外
        
end if;
        
close cl;
exception  ---捕获例外
when no_data then
('没有找到数据的错误');
end;