网址:https://www.imooc.com/video/6980
结构和组成
1.图形化工具: Oracle Sql Developer
它用来编写PL/SQL程序
它是使用java程序编写的
它基于java的JDBC来连接数据库,所以只要有数据库的驱动,就可以连接任意数据库
自带Oracle和Access驱动,若想连接MySql需要下载MySql驱动
window使用.exe
Linux使用.sh
2. 如何连接Oracle数据库
连接名: 随意起
用户名,口令: 装好Oracle数据库以后,会自动一个用户名和口令,scott
主机名字:数据库所在的服务器的IP地址(电脑)
端口:Oracle默认端口1521 ,MySql默认端口3306
sid: 数据库的名字
点击连接就连接到了Oracle数据库上了
3.PL/SQL的作用
PL/SQL是Oracle数据库对sql语言的一个扩展,从而形成的一个程序
操作Oracle数据库最快的程序语言就是PL/SQL
方便后续学习存储过程,存储函数,触发器
4.PL/SQL程序的使用
declare 开头,声明
说明部分(变量,光标或者例外):若没有说明部分,可省略declare
begin 程序以begin开始,end结束
程序体
dbms_output.put_line("hello worild") :存储过程,打印日志,Oracle提供的程序包
end;
/ 代表退出这个编辑环境,并且执行这个PL/SQL程序
默认PL/SQL的输出日志开关是关闭的,打开如下
set serveroutput on
5. 什么是PL/SQL
PL/SQL:Procedure Language/SQL 过程语言
PL/SQL是Oracle对sql语言的过程化扩展
指在SQL命令语言(增删改查)中增加过程处理语句(如分支,循环等),使SQL语言具有过程处理能力
PL/SQL是面向过程的语言,但是比过程语言更简单,高效,灵活,实用
SQL语言➡️数据操纵能力,增删改查
过程语言➡️数据处理能力
PL/SQL = SQL语言➕过程语言
不同的数据库对sql语言有不同的扩展:
Oracle: PL/SQL
DB2 : SQL/PL
SQL Server :T-SQL
6. PL/SQL的程序结构
declare
说明部分(变量说明、光标申明、例外说明)
begin
语句序列(DML语句)
exception
例外处理语句
end;
/
说明部分(定义基本变量)
类型:char,vachar2,date,number,boolean,long
举例:(变量名称在前,类型在后)
var1 char(15); 定义字符var1,长度为15位
marriedd boolean := true;定义boolean值married,初始值为true( :=代表赋值)
psal number(7,2);定义数字psal,长度为7,并且有2位小数
pdate date :=sysdate; sysdate代表当前时间年月日
说明部分(引用型变量)
my_name emp.ename%type
my_name代表变量名
emp代表员工表
ename代表员工表的员工姓名
%type是固定的,代表引用类型
总体意思是: 引用员工姓名的类型作为变量的类型
若ename类型是字符串,my_name就是字符串
好处: 不需要知道后面类型是什么,会跟着后面的类型做变化
PL/SQL有两种赋值方式,一种是 := ,一种是into关键字
declare
ename emp.name%type;
begin
select name into ename from emp;
dbms_output.putline(ename||'名字');
||是连接符
end
/
说明部分(记录型变量)
emp_rec emp%rowtype
emp_res代表变量名
emp代表员工表
%rowtye代表行类型
记录型变量代表的是表中一行的数据
记录型变量可以理解为数组,因为一行有多个列
IF语句
1.
if 条件 then 语句1;
语句2;
end if;
2.
if 条件 then 语句序列1;
else 语句序列2;
end if;
3.注意是elsif,而不是elseif
if 条件 then 语句;
elsif 语句 then 语句;
else 语句;
end if;
判断用户从键盘输入的数字
/**接收一个键盘输入
num: 变量名,地址值,含义是:在该地址上保存了输入的值
prompt:提示,后面跟提示信息**/
accept num prompt '请输入一个数字'
declare
/** &num:代表num这个地址上的值, &是地址符号 **/
pnum number:= #
begin
if pnum = 1 then dbms_output_line('您输入的是1'); // pnum=1代表判断, :=代表赋值
elsif pnum = 2 then dbms_output_line('您输入的是2');
else dbms_output_line('您输入的是其他数字');
end if;
end
/
循环语句(pl/sql没有自增++,自减–的写法)
更推荐使用loop循环(控制光标的时候比较方便简单)
1.while循环
while total<=25000 loop
total := total +1;循环体
end loop;
2.loop循环(when条件是退出条件)
loop
exit [when 条件]
end loop;
3. for循环
for i in 1..3 loop
语句序列;
end loop
7.光标
就是一个结果集
使用光标代表集合
1.定义光标
cursor 光标名 [(参数名 数据类型[,参数名 数据类型]...)]
is select 语句
完整例子:
cursor c1 is select ename from emp;
is是光标的关键字,后面是查询语句
2.使用光标前,要先打开光标
open c1;(打开光标执行查询)
3.取一行光标的值
fetch c1 into pname;(取一行到变量中)
fetch的作用:1.把当前指针指向的记录返回2.将指针指向下一条记录
4.关闭光标
close c1;(关闭光标释放资源)
光标的属性,以%开头
%found:取到了记录
%notfound:没取到记录
%isopen: 判断光标是否打开
%rowcount:影响的行数,不是总行数,从1开始
光标数的限制
默认情况下,oracle数据库只允许在同一个会话中,打开300个光标
可以通过alter sysytem set open_cursor = 400 scope = both;//修改为400
scope可取值: both,memory(只更改当前实例),spfile(只更改参数文件,数据库需要重启)
获取姓名和薪水例子
declare
cursor c1 is select name,sal from emp;//创建光标
ename emp.name%type;//引用型变量
esal emp.sal%type;
begin
open c1;打开光标
loop
fetch c1 into ename,esal;//取出一条数据到变量中去
exit when c1%nofound;//没取到数据
dbms_output_line(ename||'的薪水是'||esal);
end loop;
close c1;//关闭光标
end
/
给员工涨薪
declare
cursor c1 is select account,job from emp;//创建光标
eaccount emp.account%type;//引用型变量
ejob emp.job%type;
begin
open c1;打开光标
loop
fetch c1 into eaccount,ejob;//取出一条数据到变量中去
exit when c1%nofound//没取到数据
if(ejob=‘boss’) then update emp set sal = sal+1000 where account = eaccount;
elsif (ejob=‘manager’) then update emp set sal = sal+500 where account = eaccount;
else update emp set sal = sal+500 ;
end loop;
close c1;//关闭光标
commit;//提交事务, 对于oracle,默认的事务隔离级别是read committed,不提交,需要写commit。事务的acid特性:原子性,一致性,隔离性,持久性。
end
带参数的光标(和无参数的光标区别:定义光标和打开光标)
cursor emp(njob number) is select name from emp where job = njob;
open emp(10);
8.例外
例外是程序设计语言提供的的一种功能,原来增强程序的健壮性和容错性 。
系统例外和自定义例外
系统例外
No_data_found //没有找到数据
Too_many_rows //select...into语句匹配多个行
Zero_Devide //被零除
Value_error //算术或转换错误,例如负数开平方
Timeout_on_resourcce //在等待资源时发生超时,例如分布式数据库(一个数据库在北京,一个在上海,北京访问上海时,网络断了,北京发生超时)
No_data_found
declare
nname emp.name%type;
begin
select name into nname where job ='1234';
exception
when no_data_found then dbms_output.put_line('没有找到这个员工');
when others then dbms_output.put_line('其他报错'); //others代表其他例外
end
/
自定义例外
定义变量,类型是exception
使用raise抛出自定义例外
7.瀑布模型
1.瀑布模型:需求分析(作用,目的)➡️ 设计(概要设计,详细设计)➡️ 编码(coding)➡️ 测试➡️2上线
2. 设计分析: SQL语句,变量(初始值是多少,最终值如何得到)