Oracle学习第三天

PL/SQL

1.pl/sql的作用和第一个pl/sql程序
declare
--说明部分(变量,光标或者例外)
begin
--程序体
dbms_output.put_line("Hello World");
end;
/(/:退出编辑行并且执行程序)
注:如果没有说明部分declare可以不写 程序从begin开始
set serveroutput on(打开输出开关)
2.pl/sql简介(面向过程)
pl/sql(procedure language/SQL)
plsql是Oracle对sql语言过程化的扩展(指在sql命令语言中增加了过程处理语句(如分支、循环等),使得sql语言具有过程处理能力)
3.pl/sql的程序结构
①变量类型vhar,varchar2,date,number,boolean,long
注意:pl/sql中定义变量时  名称在前边类型在后边。 赋值使用:=而不是=,也可以使用into;(sysdate:当前的日期)
②引用型变量
例:my_name emp.ename%type;(引用emp表中的ename字段的类型作为my_name的类型)

注:连接符是||;
例:
--引用型变量
set serveroutput on

declare
--定义引用型变量:查询并打印7839的姓名和薪水
--pname varchar2(20)
--psal number
pename emp.ename%type;
psal emp.sal%type;
begin
--得到7839的姓名和薪水
select ename,sal into pename,psal from emp where empno=7839;
--打印姓名和薪水
dbms_output.put_line(pename||'的薪水是||psal';);
end;
/
③记录型变量
emp_rec emp%rowtype (一行的类型给变量 相当于数组)
--使用记录型变量,查询并打印7839的姓名和薪水
set serveroutput on
declare
--定义记录型变量:注意代表一行
emp_rec emp%rowtype
--得到7839一行的信息
select * into emp_rec from emp where empno=7839;
--打印姓名和薪水
dbms_output.put_line(emp_rec.ename||'的薪水是'||emp_rec.sal);
end;
/
4.pl/sql中if语句的使用

if 条件 then 语句1;
语句2;
end if;

if 条件 then 语句序列1;
else 语句序列2;
end if;

if 条件 then 语句;
elsif 语句 then 语句;
else 语句;
end if;
例:
--判断用户从键盘输入的数字
--1.如何使用if,2.接收一个键盘输入(字符串)
set serveroutput on
--接收一个键盘的输入
--num:地址值,含义是:在该地址保存了输入的值
accept num prompt '请输入一个数字'
declare
--定义变量保存用户从键盘输入的数字
pnum number:=#
begin
--执行if语句进行条件判断
if pnum=0 then dbms_output.put_line('领输入的数字是0');
elsif pnum=1 then dbms_outpt.put_line('您输入的数组是1')
else dbms_output.put_line('其他数字';)
end if;
end;
/
5. 循环的使用

while total<=250 loop
...
total:=total+salary;
end loop;


例:
--使用while循环打印数字的1-10
set serveroutput on

declare
--定义循环变量
pnum number:=1;
begin
while pnum<=10 loop
dbms_output.put_line(pnum);
--使该变量+1
pnum:=pnum+1;
end loop;
end;
/

loop
exit[when 条件];
...
end loop;

例:
--使用loop打印数字的1-10
set serveroutput on
declare
--定义循环变量
pnum number:=1;
begin
loop
--退出条件:循环变量大于10
exit when pnum>10;
--打印该循环变量
dbms_output.put_line(pnum);
--循环变量+1
pnum:=pnum+1;
end loop;
end;
/

for i in 1..3 loop
语句序列;
end loop;


例:
--使用for循环打印数字1-10
set serveroutput on
declare
--定义循环变量
pnum number:=1;
begin
for pnum in 1..10 loop
dbms_output.put_line(pnum);
end loop;
end;
/
6.pl/sql光标的引入
①光标的语法
cursor 光标名[(参数名 数据类型[,参数名 数据类型])]
is select 语句


-open 光标名(打开光标)
-fetch c1 into pename;(取一行到变量中,1.把当前指针指向的记录返回。2将指针指向下一条记录)
-close 光标名(关闭光标)

光标的属性
%found
%notfound


例:
--查询并打印员工的姓名和薪水
set serveroutput on
declare
--定义个光标
cursor cemp is select ename,sal from emp;
--为光标定义对应的变量
pename emp.ename%type;
psal emp.sal%type;
begin
--打开光标
open cemp;
loop
--取一条记录
fetch cemp into pename,psal;
--思考:1.循环什么时候退出2fetch不一定能取到记录
--exit when 没有记录;
exit when cemp%notfound;
--打印
dbms_output.put_line(pename||'的薪水是'||psal);
end loop;
--关闭光标
close cemp;
end;
/


②实例
--给员工涨工资
set serveroutput on
declare
--定义光标代表给哪些员工涨工资
cursor cemp is select empno,empjob from emp;
penpno emp.empno%type;
pjob emp.empjob%type;
begin
--打开光标
open cemp;
loop
--取出一个员工
fetch cemp into pempno,pjob;
exit when cemp%notfound;
--判断员工的职位
if pjob='PRESIDENT' then update emp set sal=sal+1000 where empno=pempno;
elsif pjob='ANAGER' then update emp set sal=sal+800 where empno=pempno;
else update emp set sal=sal+400 where empno=pempno;
end if;
end loop;
--关闭光标
close cemp;
--对于oracle,默认的事务隔离级别是red cmomitted
--事务的acid(原子性,一致性,隔离性,持久性)
commit;


end;
/
③pl/sql光标的属性和限制
属性:%found %notfound
%isopen:判断光标是否打开
%rowcount:影响的行数
限制:默认情况下oracle数据库只运行在同一个会话中打开300个光标。
修改光标的限制
alter system set open_cursor=400 scope=both;
socpe的取值:both,memory,spfile(数据库需要重启)
④带参数的光标
cursor 光标名[(参数名 数据类型[,参数名 数据类型])]
is select 语句
--查询某个部门中员工的姓名
set serveroutput on
declare
--定义带参数的光标
cursor cemp(dno number)is select ename from emp where deptno=dno;
pename emp.ename%type;
begin
--打开光标
open cemp(10);
loop
--取出每个员工的姓名
fetch cemp into pename
exit when cemp%notfound;
dbms_output.put_line(pename)
end loop;
close cemp;
end;
/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值