光环大数据的大数据培训班,只聘请精英讲师,确保教学的整体质量与教学水准,讲师团及时掌握时代潮流技术,将前沿技能融入教学中,确保学生所学知识顺应时代所需,通过深入浅出、通俗易懂的教学方式,指导学生更快的掌握技能知识,成就上万个高薪就业学子。
深圳大数据培训告诉你oracle数据库必知必会,深圳大数据培训(光环大数据)专家就针对oracle数据库必知必会这一问题做一个详细的分解。希望能在工作中对你有所帮助!
1.基本结构:
打印hell world
declare 这是开头
begin
--程序体 DML语句
dbms_output.put_line('hello world');
end;
/ 表示结束
在sql plus 里要打开执行程序开关:set serveroutput on 然后再执行就有了
在sql plus 里查看程序包的结构:desc dbms_output 按回车
例子.简单的命令式语言 例子:为职工涨工资,没人涨10%的工资
update emp set sal = sal*1.1;
pl/sql程序结构
declare
说明部分(变量说明,光标申明,例外说明)
begin
语句序列(DML语句)
exception
例外处理语句
end;
/
(1)说明部分:定义基本变量
类型: varl carchar2,date,number,boolean,long
举例:varl cahr(15);
married boolean : = true;
psal number(7,2);
A:例子:
--使用基本变量类型
declare
--定义基本变量类型
--基本数据类型
pnumber number(7,2);
--字符串变量
pname varchar2(20);
2基本变量
A--日期变量
pdate date;
begin
pnumber :=1;
dbms_output.put_line(pumber);
pname :='Tom';
dbms_output.put_line(Tom);
pdate :=sysdate;
dbms_output.put_line(sysdate);
--计算明天的日期
dbms_output.put_line(pade + 1);
end;
/
B:引用型变量
举例:
my_name emp.ename%type;
比如:
--引用型变量
set serveroutput on
declare
--定义引用型变量,查询并打印7839的姓名何薪水
--pename 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;
--上面的解释通过into 将得到的姓名和薪水付给变量值
--打印姓名和薪水
dbms_output.put_line(pename||'的薪水是'||psal);
end;
/
C:记录型变量
举例:emp_rec emp%rowtype;
记录型变量分量的引用
emp_rec.ename :='ADAMS';
例子:
--使用记录变量,查询并打印7839的姓名和薪水
set serveroutput on
declare
--定义记录变量:注意代表一行
emp_rec emp%rowtype;
begin
--得到7839一行的信息
select * into emp_rec from emp where empno=7839;
--打印姓名和薪水
dbms_output.put_line(emp_rec.ename||'的薪水是'||emp+rec.sal);
end;
/
结果1--10;
2.if 语句
判断用户从键盘输入的数字
/*
判断用户从键盘输入数字
1.如何使用if语句
2.接收一个键盘输入(字符串)
*/
--接收一个键盘输入
--num是一个地址值,含义是:在该地址上保存了输入的值
accept num prompt '请输入一个数字';
declare
--定义变量保存用户键盘输入的数字
pnum number :=#
begin
--执行if语句进行条件判断
if pnum = 0 then dbms_output.put_line('您输入数字是0');
elsif pnum = 1 then dbms_output.put_line('您输入的是1'); --如果他的值不是0,是1的时候
elsif pnum = 2 then dbms_output.put_line('您输入的是2');
else dbms_output.put_line('其他数字');
end if;
end;
/
3.循环语句while:
(1)例子:
--使用while循环打印数字的1-10;
set serveroutput on
declare
-- 定义循环变量
pnum number :=1;
begin
while pnum <=10 loop
--循环体
dbm_output.put_line(pnum);
--使该变量+1
pnum :=pnum + 1;
end loop;
end;
/
(2)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;
/
结果:1---10;
(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;
/
结果:1---10;
4.光标
就是一个结果集(result set)
光标的语法:cursor 光标名 [(参数名 数据类型[,参数名 数据类型]...)]
is select 语句;
例子:cursor cl is select ename from emp;
使用光标首先要打开一个光标:
-open c1;(打开光标执行查询)
使用完之后关闭光标
-close c1;(关闭游标释放资源)
取一行的光标的值:
- fetch c1 into pename;(取一行到变量中)
例子1:使用光标查询员工姓名和工资,并打印
--查询并打印员工的姓名和薪水
/*
1.光标的属性
%found %notfound 光标的属性都是以百分号开头 found:如果fetch取到值就是true
否则就是false;
*/
set serveroutput on
declae
--定义一个光标
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 循环什么时候退出?2.fetch不一定能取到记录
--exit when 没有取到记录循环退出;
exit when cemp%notfound;
--打印
dbms_output.put_line(pname||'的薪水是'||psal);
end loop;
--关闭光标
close cemp;
end;
/
例子2:
按员工的职位长工资,总裁涨1000,经理涨800,其他人员涨400.
--给员工涨工资,总裁1000,经理800,其他400
set serveroutput on
declare
--定义光标代表给哪些员工涨工资
--alter table "SCOTT"."EMP" rname column"JOB" to empjob
cursor cemp is select empno,empjob from emp;
pempno emp.empno%type;
pjob emp.empjob%type;
begin
rollback; 这句是可以不写 回退的意思 因为刚才没写commit提交 要写了就不用写
--打开光标
open cemp;
loop
--取出一个员工
fetch cemp into pempno,pjob;
exit when cemp%notfound; --如果没有取到员工
--判断员工的职位
if pjob = 'PRESIDENT' then update emp set sal = sal + 1000 where enpmo = pempno;
--如果不是那个名字
elsif pjob = 'MANAGER' 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,默认的事物隔离级别是read committed
--事物的ACID
commit;--更改得提交
dbms_output.put_line('涨工资完成');
end;
/
写完程序后要提交commit
5.光标的属性
/*
(1).光标的属性
%found %notfound
%isopen:判断光标是否打开
%rowcount:影响的行数
2.光标的限制 :默认情况下,oracle 数据库只允许在同一个会话中,打开300个光标
修改光标的限制:
alter system set open_cursors=400 scope = both;
scope的取值:both,memory,spfile(数据库需要重启)
查看更改结果:show parameter cursor
*/
例子
set serveroutput on
declare
--定义光标
cursor cemp is select empno,empjob from emp;
pempno emp.empno%type;
pjob emp.empjob%type;
begin
--打开光标
open cemp;
if cemp%isopen then --如果光标是打开的
dbms_output_put_line('光标已经打开');
else
dbms_output_put_line('光标没有打开');
end if;
--关闭光标
close cemp;
end;
/
(2)rowcount例子:
set serveroutput on
declare
--定义光标
cursor cemp is select empno,empjob from emp;
pempno emp.empno%type;
pjob emp.empjob%type;
begin
--打开光标
open cemp;
loop
--取出一条记录
fetch cemp into pempno,pjob;
exit when cemp%notfound
--打印rowcount的值
dbms_output.put_line('rowcount:' || cemp%rowcount);
end loop;
--关闭光标
close cemp;
end;
/
6.带参数的光标:
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);--打印10号部门的员工姓名
loop
--取出每个员工的姓名
fetch cemp into pename;
exit when cemp%notfound;
dbms_output.put_line(pename);
end loop;
--关闭光标
close cemp;
end;
/
7.例外:
例外是程序设计语言提供的一种功能,用来增强程序的健壮性和容错性。
系统例外:
(1)no_data_found (没有找到数据)
(2)too_many_rows (select ...into 语句匹配多个行)
(3)zero_divide (被零除)
(4)value_error (算数或转换错误)
(5)timeout_on_resource (在等待资源时发生超时)
例子1:no_data_found
set serveroutput on
declare
pename emp.ename%type;
begin
--查询员工是123的员工姓名,因为表里没有123的员工
select ename into pename from emp where empno=123;
exception
when no_date_found then dbms_output.put_line('没有找到该员工');
when others then dbma_output.put_line('其他例外')--当有其他例外就用other来捕获
end;
/
结果:没有找到该员工
例子2:too_many_rows
set serveroutput on
declare
--定义变量
pename emp.ename%type;
begin
--查询所有10号部门的员工姓名
select ename into pename from emp where deptno=10;
exception
when too_many_rows then dbms_output.put_line('select into 匹配了多行');
when others then dbms_output.put_line('其他例外');
end;
/
例子3 zero_divide 被0除
set serveroutput on
declare
--定义一个基本变量
pnum number;
begin
pnum :=1/10;
exception
when zero_divide then dbms_output.put_line('1:0不能做除数');
dbms_output.put_line('2:0不能做除数');
when others then dbms_output.put_line('其他例外');
end;
/
例子4 :value_error算数或转换例外
set serveroutput on
declare
--定义number类型的变量;
pnum number;
begin
pnum = 'abc';
exception
when valu_error then dbms_output.put_line('算数或者转换错误');
when others then dbms_output.put_line('其他例外');
end;
/
例子5 timeout_on_resource
自定义例外 。 使用raise 抛出自定义例外
--查询50号部门员工的姓名 因为没有50号
declare
--定义光标 代表50号部门员工姓名
cursor cemp is select ename from emp where deptno = 50;
pename emp.ename%type;
--自定义例外
no_emp_found exception;
begin
--打开光标
open cemp;
fetch cemp into pename;
if cemp%notfound then
--抛出例外
raise no_emp_found;
end if;
--关闭光标
close cemp;
exception
when no_emp_found then dbms_output.put_line('没有找到员工');
when others then dbms_output.put_line('其他例外');
end;
/
想知道更多关于IT行业的信息吗?想远远不如行动,行动起来,一起加入光环大数据,一起进入IT行业,跟着光环大数据的脚步,一起走进如今的互联网信息时代,带给你不一样的色彩生活——【深圳大数据培训】