网络异常,图片无法展示
|
思维导图
1. PL/SQL简介
a. PL/SQL是对SQL的一个增强,使SQL具有过程化的处理能力,就是在SQL能使用分支、循环等语句;
b. PL/SQL是操作oracle数据库最快的语言;
c. PL/SQL是存储过程、存储函数和触发器基础;
PL/SQL的程序结构:
declare 说明部分(变量说明,光标申明,例外说明) begin 语句序列(程序体 DML语句) exception 例外处理语句 end; /
说明部分:
定义基本变量:char,varchar2,date,number,boolean,long
--变量声明: var1 char(15); married boolean:=true; psal number(7,2); --引用变量: pename emp.ename%type;
2. PL/SQL入门案例
小案例: 打印helloworld
--打开服务器的输出功能 set serveroutput on declare --声明区:声明变量、游标、例外 begin --程序区: --打印helloworld --dbms_output:程序包,类似于java中类 --put_line:存储过程,类似于java中的方法 dbms_output.put_line('HelloWorld!'); end; /
--查看程序包结构 desc dbms_output
3. 引用型变量
小案例: 查询并打印7839号员工的姓名和工资
--打开服务器的输出功能 set serveroutput on declare --声明引用型变量 pename emp.ename%type; psal emp.sal%type; begin --查询7839号员工的姓名和工资 --可以使用into关键字赋值 select ename, sal into pename,psal from emp where empno=7839; --打印 dbms_output.put_line(pename||'的薪水是'||psal); end; /
4. 记录型变量
记录型变量,就像是将查询结果封装到了一个对象里面一样,他就是这个对象。通过(.)可以取出对中的值。
小案例: 查询并打印7839号员工的姓名和工资
set serveroutput on declare --声明记录型变量 pemp emp%rowtype; begin select * into pemp from emp where empno=7839; --打印 --从记录型变量中获取数据:记录型变量名.列名 dbms_output.put_line(pemp.ename||'的薪水是'||pemp.sal); end; /
5. 判断语句:if语句
温馨小提示:
(1)set serveroutput on
和accept num prompt '请您输入数字:'
之后均无需带分号;
(2)accept num prompt '请您输入数字:'
运行完这条语句之后,就会弹出来让你输入的提示内容,不要担心,照常输入。之后,接着上面的步骤,往下走。输入的内容已经被绑定到了指定的变量中了。
小案例: 判断用户输入的数字
set serveroutput on --accept:从标准输入获取一个数据,保存num地址变量指定位置 --prompt:自定义提示信息 --num:地址值,含义量;在该地址上保存了输入的值 accept num prompt '请您输入数字:' declare pnum number; begin --获取用户输入,赋值给pnum变量 pnum:=# if pnum=1 then dbms_output.put_line('您输入的数字是:1!'); elsif pnum=2 then dbms_output.put_line('您输入的数字是:2!'); else dbms_output.put_line('您输入的数字是:其他!'); end if; end; /
6. 循环语句(也有很多种,但是下面这一种是最常用的)
(1) 循环打印1~10(最常用的方式):
set serveroutput on declare pnum number:=1; begin loop exit when pnum > 10; dbms_output.put_line(pnum); pnum:=pnum+1; end loop; end; /
(2) 使用while循环打印数字1-10
declare --定义循环变量 pnum number:=1; begin while pnum<=10 loop --循环体 dbms_output.put_line(pnum); --使该变量+1 pnum:=pnum+1; end loop; end; /
(3) 使用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; /
7. 游标(也叫光标,就是一个结果集)
(1) 光标的语法
cursor 光标名 [(参数名 数据类型[,参数名 数据类型]...)] is select 语句;
操作光标:
--打开光标: open c1;(打开光标执行查询) --关闭光标: close c1;(关闭游标释放资源) --取一行光标的值: fetch c1 into pename;(取一行到变量中)
注意事项:
- 光标数的限制:默认情况下,oracle数据库只允许在同一个会话中,打开300个光标;
- 修改默认值:
--切换到管理员 show user conn sys/password@192.168.56.6:1521/orcl as sysdba show user --模糊查找 show parameter cursor --修改光标数的限制 --scope的取值:both,memory,spfile(数据库需要重启) alter system set open_cursor=400 scope=both;
(2) 无参游标
小案例: 查询并打印所有员工姓名和薪水
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; --游标状态:%isopen:是否打开;%rowcount:返回行数;%found:获取到数据;%notfound获取不到数据 exit when cemp%notfound; --打印 dbms_output.put_line(pename||'的薪水是'||psal); end loop; --关闭游标 close cemp; end; /
(3) 带参游标
小案例1: 查询并打印10号部门员工的姓名和薪水
set serveroutput on declare --定义带参数的游标 cursor cemp(pdeptno emp.deptno%type) is select ename,sal from emp where deptno=pdeptno; pename emp.ename%type; psal emp.sal%type; begin --作业:动态打印部门员工的信息 open cemp(10); --循环获取游标中数据 loop fetch cemp into pename,psal; --游标状态:%isopen:是否打开;%rowcount:返回行数;%found:获取到数据;%notfound获取不到数据 exit when cemp%notfound; --打印 dbms_output.put_line(pename||'的薪水是'||psal); end loop; close cemp; end; /
小案例2: 根据职位涨工资:按员工的工种涨工资,总裁1000元,经理800元,其他人400元
declare cursor cemp is select empno,job,sal from emp; pempno emp.empno%type; pjob emp.job%type; psal emp.sal%type; begin open cemp; loop fetch cemp into pempno,pjob,psal; exit when cemp%notfound; if pjob='PRESIDENT' then update emp set sal=psal+1000 where empno=pempno; elsif pjob='MANAGER' then update emp set sal=psal+800 where empno=pempno; else update emp set sal=psal+400 where empno=pempno; end if; end loop; close cemp; --提交数据 commit; end; /