oracle 所选语言,(Oracle学习笔记) PL/SQL编程语言

本文详细介绍了Oracle的PL/SQL编程语言,涵盖了块结构、数据类型、选择语句、循环、游标、存储过程、异常处理和触发器等内容。通过实例解析了如何声明变量、执行条件判断、处理数据表行以及创建和使用存储过程。此外,还讲解了如何利用隐式和显式游标进行数据操作,并展示了如何定义和处理异常,确保程序的健壮性。最后,提到了触发器和视图的创建与管理,为数据库应用程序开发提供了全面的指导。
摘要由CSDN通过智能技术生成

文章目录

一、PL/SQL块结构

二、注释

三、数据类型

Number(p,s)

%TYPE

Record

%ROWTYPE

四、选择语句

If......then

If....then.....else

If....then....elsif......then....else

Case语句

五、循环语句

Loop

While

For

六、游标

显式游标:

隐式游标

遍历隐式游标

遍历显式游标

七、存储过程

存储过程创建

存储过程参数

IN

Out

IN OUT

删除存储过程

八、异常处理

使用oracle预处理异常

自定义异常:错误编号异常

Raise主动抛出异常

九、触发器

语句级触发器

行级别触发器

用户事件触发器

删除触发器

十、视图

创建简单视图

复杂视图

连接视图

删除视图

一、PL/SQL块结构

(1)声明部分(DECLARE)开始(可选),到BEGIN关键字结束,这一部分可以声明PL/SQL程序块中所用到的变量、常量和游标等。

注:再某个PL/SQL块中声明的内容,只能在当前块中使用

(2)执行部分(BEGIN)开始(必须有),结束方式有两种。如果语句块中运行出现异常,则执行异常处理部分的代码结束。如果代码块没有异常,则以执行到END关键字结束。

(3)异常处理部分(EXCEPTION),语句块出现异常时执行该部分,执行结束后,整个PL/SQL语句块执行结束。

注:每一条语句都必须以分号结束,每条SQL语句可以写成多行,以分号结束;

7d01505818c3e561303583f71ad6d891.png

二、注释

单行注释 –

多行注释 /。。。。。/

三、数据类型

Number(p,s)

p标识精度(所有有效数字) s标识刻度范围(小数点右边的位数)

Char长度固定,最大2000字节

Varchar2长度不固定,最大4000字节

Long长度不固定,最大32767字节

%TYPE

优点

(1)用户不必查看表结构中各列的数据类型就可以定义保存某列值的变量

(2)如果对表中列的类型进行修改,无需考虑更改pl/sql语句块中定义的变量类型

Select…into 对变量进行赋值

24f22d08cd058df20f5f671171653a00.png

Record

存储由多列组成的一行数据,是一种结构化的数据类型,使用type语句进行定义

eba0639fd62a48966cfcc34bcf1fc190.png

471cdd3dacbd53258d5fae20e48827b1.png

%ROWTYPE

结合了%TYPE和RECORD变量的优点,可以根据数据表中行的结构,定义一种特殊的数据类型,用来存储从数据表中检索到的一行数据

declare

--定义能够存储emp表中一行数据的变量

row_emp emp%rowtype;

begin

--检索数据存储到定义的变量

select *

into row_emp

from emp

where empno = 7369;

--输出查询的数据

dbms_output.put_line('雇员'||row_emp.ename||'的编号'||

row_emp.empno||'职务是'||row_emp.job);

end;

b17b298c3bd21b1579dffb67cca85f54.png

四、选择语句

If…then

只做一种情况条件判断

declare

var_name1 varchar2(50);

var_name2 varchar2(50);

begin

var_name1 := 'AAA';

var_name2 := 'BB';

if length(var_name1) > length(var_name2) then

dbms_output.put_line('字符串'||var_name1||'的长度比字符串'

||var_name2||'的长度大');

end if;

end;

e8758b34b87c4e2ac147efa131c84e00.png

If…then…else

可以实现判断两种情况分支

declare

age int := 20;

begin

if age >= 18 then

dbms_output.put_line('你已经老了');

else

dbms_output.put_line('你还年轻');

end if;

end;

b8a5d2278f4ecdded96e4aa071558fe4.png

If…then…elsif…then…else

实现多分支选择语句

declare

--定义月份变量

month int;

begin

--获取系统当前时间月份,赋值给month变量

select to_char(sysdate,'MM')

into month

from dual;

--判断是第几季度

if month >= 1 and month <=3 then

dbms_output.put_line('这是第一季度');

elsif month >=4 and month <=6 then

dbms_output.put_line('这是第二季度');

elsif month >=7 and month <=9 then

dbms_output.put_line('这是第三季度');

elsif month >=10 and month <=12 then

dbms_output.put_line('这是第一季度');

else

dbms_output.put_line('月份不符合要求');

end if;

end;

b4a1164b3721bcd8c12cbacae0cb77a3.png

Case语句

与elseif类似,case后面通常是一个变量

declare

season int :=3;

info varchar2(50);

begin

case season

when 1 then

info := '季度包含1,2,3月份';

when 2 then

info := '季度包含4,5,6月份';

when 3 then

info := '季度包含7,8,9月份';

when 4 then

info := '季度包含10,11,12月份';

else info := '季度不合法';

end case;

dbms_output.put_line(info);

end;

c4c8ffec044d3f12d6013038c4e1261f.png

五、循环语句

Loop

Loop语句会先执行一次循环体,然后判断‘EXIT WHEN’关键字后面的条件表达式,若为true则退出循环体,否则继续执行循环体,所以loop至少执行一次循环体

declare

--定义整数变量,存储整数和

sum_i int := 0;

--定义整数变量,存储自然数

i int := 0;

begin

--循环累加

loop

--给自然数赋值

i := i+1;

--计算前n个自然数的和

sum_i := sum_i+i;

--当循环100次时,程序退出循环体

exit when i = 100;

end loop;

dbms_output.put_line('前100个自然数之和为:'||sum_i);

end;

b71bbbc18748365b313bb20315919321.png

While

执行0次或多次循环体,在每次执行循环体之前,首先判断条件表达式的值是否为true,若为true在执行循环体语句,否则退出循环体

declare

sum_i int := 0;

i int :=0;

begin

while i <= 100 loop

i := i+1;

sum_i := sum_i + i;

end loop;

dbms_output.put_line(sum_i);

end;

b7bcb1110121b8441d0cfc2c86f62f29.png

For

For语句是一个可以预置循环次数的循环控制语句,它有一个循环计数器,通常是一个整型变量,通过这个循环计数器来控制循环次数

declare

sum_i int := 0;

begin

for i in reverse 1..100 loop

--判断是否为偶数

if mod(i,2) = 0 then

sum_i := sum_i + i;

end if;

end loop;

dbms_output.put_line('和为'||sum_i);

end;

4aacf28310ec1db4f40d0f78f7d49962.png

六、游标

显式游标:

声明游标

主要包括游标名和为游标提供结果集的select语句,因此声明游标时必须指定游标名和游标所使用的select语句

6ff3773a725692f64b1ecb429e3a02ad.png

打开游标

游标声明完之后,必须打开才能使用

Open 游标名称[()],当省略参数后,传入的就为默认值

557429d687500a59c36f5dc260535ac6.png

读取游标

读取游标就是逐行将结果集中的数据保存到变量中处理。

Fetch cur_name into(variable)

Variable:一个变量列表或‘记录’变量(record类型)

%found:布尔值,存在值为true,否则为false

关闭游标

Close cur_name;

实例:

declare

--声明游标

cursor cur_emp(var_job in varchar2 := 'SALESMAN')

is select empno,ename,sal

from emp

where job = var_job;

--声明一个记录类型,用于存放游标每行的值

type reco_emp is record

(

var_empno emp.empno%type,

var_ename emp.ename%type,

var_sal emp.sal%type

);

--声明一个reco_emp类型的变量

emp_row reco_emp;

begin

--打开游标

open cur_emp('MANAGER');

--先让指针指向结果集中的第一行

fetch cur_emp into emp_row;

while cur_emp%found loop

dbms_output.put_line(emp_row.var_ename||'编号是'||

emp_row.var_empno||'工资为'||emp_row.var_sal);

fetch cur_emp into emp_row;

end loop;

--关闭游标

close cur_emp;

end;

e95d002e4edd6d0a60f2a0c6ae1688dc.png

隐式游标

将emp表中销售员的工资上调20%,然后使用隐式游标sql的%rowcount属性输出上调员工的数量

%rowcount受sql语句影响的行数

begin

update emp

set sal = sal*1.2

where job = 'SALESMAN';

if sql%notfound then

dbms_output.put_line('没有雇员需要上调工资');

else

dbms_output.put_line('有'||sql%rowcount||'个雇员工资上调20%');

end if;

end;

2f240ee7039f5f6509aaffd0d7d8048d.png

遍历隐式游标

32e4f1a53eaa901b1ffecebfb362d248.png

dacf49d9fc61f7f3334c91edbbd8136c.png

遍历显式游标

656f95b419ab3bc84e3b9289b116eb90.png

d4ad07b5c30f7244b241964e7237d371.png

七、存储过程

存储过程创建

ae90ec1e14199d2487bae64201d64801.png

35744fbf27af2ee3b812625e1d958d2d.png

385a19c94c4957514754b4b0c3f98ad4.png

存储过程参数

IN

18aee9ee7fb9bc6278bf8874031dde43.png

b200df883e0fe26a2a97259138a19191.png

101976ba7a4417db1b1a9e82158d9d45.png

Out

65c227f3d8e594a766c39e3e76068e74.png

IN OUT

c5f9ce2830945ec701869ddff64b6366.png

删除存储过程

5607224ff4f4635f45f838ae07987179.png

drop procedure pro_square;

八、异常处理

使用oracle预处理异常

7f14d1e9470fcf26aa7e162ea2392bb0.png

d44addc6bdbe4ed50c2c181a2973971e.png

自定义异常:错误编号异常

1604d2a6ad3f380ec7c46a0b1c45a19f.png

c89a0b88d237838150e8cd41e8501309.png

自定义异常:业务逻辑异常

Raise主动抛出异常

ee56de652a7efc54a43e3144d638dd13.png

b59d5ad76cd9f343fe59af0011d99625.png

九、触发器

语句级触发器

2edf43fc61fd795a26f426b5e62a955d.png

7b1cbc700f8a1cfa50d66905883cf717.png

行级别触发器

f471b21db99e3f1c1203cd1608c0f0fd.png

用户事件触发器

a9856ea848e44ccb9f85b63e84f79d5f.png

删除触发器

e6a51c8509704dd75ce9d52d08cb10fe.png

drop trigger tri_ddl_oper;

十、视图

创建简单视图

b3c83a2f6e05c2d7c8f7b14f21b18510.png

复杂视图

复杂视图指包括函数、表达式或分组数据的视图

1d5aca9a8f8910e0ea38ce78d0b7e1ee.png

连接视图

连接视图指基于多个表所建立的视图。使用连接视图主要目的是为了简化连接查询。需要注意,连表查询时,必须使用where子句指定有效的连接条件,否则结果就是毫无意义的笛卡尔积

723c364c3b17b3abdacc1acffb42075c.png

删除视图

drop view emp_view_uni;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值