plsql简单入门
# 一、PL/SQL简介
PL/SQL(Procedural Language/SQL)是甲骨文公司专有的SQL扩展语言,应用在甲骨文公司的Oracle数据库系统。一些的SQL数据库管理系统也提供了类似的扩展SQL语言。PL/SQL的的语法非常类似于Ada,而且像1980年代的Ada编译器一样,PL/SQL的运作系统使用Diana作为中介语言。
# 二、基本语法
测试表
# 2.1基本语法骨架
declare
声明区
begin
核心代码
end;
2
3
4
5
# 2.1.1 输出hello world
declare
s varchar2(11) :='hello world';
begin
dbms_output.put_line(s);
end;
2
3
4
5
# 2.1.2声明变量、赋值
1.声明格式: 变量名 数据类型及长度
i number(10) := 10;
name varchar2(10) :=abc;
--根据emp表中的ename的数据类型来声明
name2 emp.ename%type;
2
3
4
2.sql赋值 ||符号是字符连接符号
declare
name emp.ename%type;
msal emp.sal%type;
begin
select ename,sal into name,msal from emp where empno=7369;
dbms_output.put_line(name || '--' || msal);
end;
2
3
4
5
6
7
# 2.2流程控制
&inNum 读入一个数,名字随意
# 2.2.1 if判断
读入一个数,根据数值判断哪个年代
declare
i number(2) :=&inNum;
begin
if i<18 then
dbms_output.put_line('未成年');
elsif i<40 then
dbms_output.put_line('不惑之年');
else
dbms_output.put_line('老了老了');
end if;
end;
2
3
4
5
6
7
8
9
10
11
# 2.2.2 while循环
打印1到10
declare
i number(2) :=1;
begin
while i<11 loop
dbms_output.put_line(i);
i := i+1;
end loop;
end;
2
3
4
5
6
7
8
# 2.2.3 exit 循环
打印1到10
declare
i number(2) :=1;
begin
loop
exit when i>10;
dbms_output.put_line(i);
i := i+1;
end loop;
end;
2
3
4
5
6
7
8
9
# 2.2.3 for 循环
打印1到10
declare
begin
for i in 1..10 loop
dbms_output.put_line(i);
end loop;
end;
2
3
4
5
6
# 2.3 游标
可以记录多个对象,多行记录
declare
--无参游标
cursor c1 is select * from emp;
empRow emp%rowtype; --一行数据类型
--带参游标
cursor c2(dno emp.deptno%type) is select empno from emp where deptno=dno;
eno emp.empno%type;
begin
--无参遍历
open c1;
loop
fetch c1 into empRow;
exit when c1%notfound;
dbms_output.put_line(empRow.ename||'--'||empRow.sal);
end loop;
close c1;
--带参遍历
open c2(10);
loop
fetch c2 into eno;
exit when c2%notfound;
dbms_output.put_line(eno);
end loop;
close c2;
end;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 三、存储过程、函数
# 3.1存储过程
存储过程的就是提前编译好的一段pl/sql语言,放置在数据库中,可以直接被调用,这一段pl/sql一般都是固定步骤的业务 注意:参数和返回值的数据类型不能带长度
# 3.1.1 创建语法
create [or replace] procedure 过程名字(参数 in/out 数据类型)
as/is
begin
程序体
end;
2
3
4
5
# 3.1.2 例子
create or replace procedure findNameById(eno in emp.empno%type,sname out emp.ename%type)
is
begin
select ename into sname from emp where empno=eno;
end;
--调用
declare
sname emp.ename%type;
begin
findNameById(7782,sname);
dbms_output.put_line(sname);
end;
2
3
4
5
6
7
8
9
10
11
12
13
# 3.2存储函数
# 3.2.1创建语法
create [or replace] function 函数名字(参数 数据类型) return 数据类型
as/is
begin
程序体
end;
2
3
4
5
# 3.2.2 例子
create or replace function findNameByEid(eno emp.empno%type) return emp.ename%type
is
sname emp.ename%type;
begin
select ename into sname from emp where empno=eno;
return sname;
end;
--调用
declare
begin
dbms_output.put_line(findNameByEid(7782));
end;
2
3
4
5
6
7
8
9
10
11
12
13
# 四、触发器
数据库触发器是一个与表相关联的、存储的 PL/SQL 程序。每当一个特定的数据操作语句 (Insert,update,delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。
# 4.1 作用及器类型
# 4.1.1 触发器可用于
- 数据确认
- 实施复杂的安全性检查
- 做审计,跟踪表上所做的数据操作等
- 数据的备份和同步
# 4.1.2 触发器的类型 :
语句级触发器 :在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行 。 行级触发器(FOR EACH ROW):触发语句作用的每一条记录都被触发。在行级触 发器中使用old和new伪记录变量, 识别值的状态。
在触发器中触发语句与伪记录变量的值
# 4.2基本语法
CREATE [or REPLACE] TRIGGER 触发器名
{BEFORE | AFTER}
{DELETE | INSERT | UPDATE [OF 列名]}
ON 表名
[FOR EACH ROW [WHEN(条件) ] ]
declare
begin
PLSQL 块
End;
# 4.3 例子
实现主键自增长,user_k是自定义的序列,每次执行insert语句都会自动增长id了
create or replace trigger myAutoAdd
before
insert
on c##user
for each row
declare
begin
select user_k.nextval into :new.id from dual;
end;
2
3
4
5
6
7
8
9