当前位置: 主页 > 行业资讯 > 大数据培训 > oracle 数据库必知必会

oracle 数据库必知必会

2018-03-21 17:55:08 作者:光环大数据 栏目:未知

光环大数据作为国内知名的高端IT就业培训机构,多年来培养无数高薪人才!为了让更多人了解大数据、人工智能、数据分析、python等相关技能,光环大数据免费提供学习视频、2周免费跟班试听课程,如有需要,可点击留言


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;

/

感谢大家阅读由大数据教程分享的“oracle数据库必知必会”希望对大家有所帮助,更多精彩内容请关注大数据培训机构官网


光环大数据作为国内知名的高端IT就业培训机构,多年来培养无数高薪人才!为了让更多人了解大数据、人工智能、数据分析、python等相关技能,光环大数据免费提供学习视频、2周免费跟班试听课程,如有需要,可点击留言
Tags标签 大数据培训

领取资料

X
立即免费领取

请准确填写您的信息

点击领取