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.1.1 输出hello world
declare
	s varchar2(11) :='hello world';
begin
	dbms_output.put_line(s);
end;
2.1.2声明变量、赋值

1.声明格式: 变量名 数据类型及长度

i number(10)  := 10;
name varchar2(10) :=abc;
--根据emp表中的ename的数据类型来声明
name2 emp.ename%type;

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.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.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.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.2.3 for 循环

打印1到10

declare
begin
    for i in 1..10 loop
    	dbms_output.put_line(i);
    end loop;
end;
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;

三、存储过程、函数

3.1存储过程

存储过程的就是提前编译好的一段pl/sql语言,放置在数据库中,可以直接被调用,这一段pl/sql一般都是固定步骤的业务
注意:参数和返回值的数据类型不能带长度

3.1.1 创建语法
create [or replace] procedure 过程名字(参数 in/out 数据类型)
as/is
begin 
	程序体
end;
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;
3.2存储函数
3.2.1创建语法
create [or replace] function 函数名字(参数  数据类型) return 数据类型
as/is
begin 
	程序体
end;
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;

四、触发器

数据库触发器是一个与表相关联的、存储的 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
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值