PL/SQL

本文介绍了OracleSqlDeveloper作为图形化工具用于编写PL/SQL程序,讲解了如何连接Oracle数据库,包括连接名、用户名、口令、主机名、端口和SID等参数。PL/SQL作为Oracle对SQL的扩展,提供了更强大的数据库操作能力。文章还详细阐述了PL/SQL程序的结构,包括DECLARE、BEGIN、END等关键字,并展示了如何声明变量、使用DBMS_OUTPUT.PUT_LINE打印日志以及PL/SQL的控制流程结构如IF语句和循环。此外,光标的概念也被提及,用于处理查询结果集。最后,文章提到了异常处理和瀑布模型在软件开发中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网址: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语句,变量(初始值是多少,最终值如何得到)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值