百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Oracle快速入门学习笔记(第四课PL/SQL)

mhr18 2024-09-23 09:58 26 浏览 0 评论

PL/SQL

一、运算符

(1)赋值运算符 :=

(2)判断是否相等 =

(3)字符串相连 ||

(4)不等于 <>

二、PL/SQL——————

Procedure Language & Structured Query Language

PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据

库进行访问。

模块化

过程化

declare

-- 变量的声明

a int;

b int;

c int;

BEGIN

-- 执行的逻辑

a:=10;-- 普通赋值

b:=20;

c:=a+b;

dbms_output.put_line(c);

end;

-- 给变量赋的值来自于表 select ... into ...

-- 统计员工的人数emp

DECLARE

counts int;

BEGIN

select count(*) into counts from emp;

dbms_output.put_line('部门人数'||counts);

end;

-- 查看表结构

select * from user_tab_columns

where Table_Name='EMP';

select * from emp;

-- 将新增的数据返回到变量中 returning ...into ...

DECLARE

names varchar2(20);

row_id ROWID;

BEGIN

insert into emp(empno,ename) values(7779,'好习惯') returning rowid,ENAME into row_id,names ;

dbms_output.put_line(row_id||'----'||names);

end;

select sysdate from dual;

-- 复合数据类型(等同于java中class)

DECLARE

type student is record(

sid int,

names varchar2(10),

birthday date

);

stu1 student;

stu2 student;

BEGIN

stu1.sid:=1;

stu1.names:='刘小伟';

stu1.birthday:=sysdate;

stu2.sid:=9;

stu2.names:='厉小林';

stu2.birthday:=to_date('1999-09-09','yyyy-mm-dd');

dbms_output.put_line(stu1.names||'------'||stu2.names);

dbms_output.put_line(to_char(stu1.birthday,'yyyy-mm-dd')||'------'||stu2.birthday);

end;

-- 从表中获取数据,存入到复合类型

-- 获取10号部门的信息 DEPT

DECLARE

-- 创建复合类型

type dept_t is record(

dno number(2),

dn varchar2(14),

cc varchar2(13)

);

-- 声明复合对象mydept

mydept dept_t;

BEGIN

select deptno,dname,loc into mydept from DEPT where DEPTNO=10;

dbms_output.put_line('部门编号 部门名称 部门地址');

dbms_output.put_line(mydept.dno||' '||mydept.dn||' '||mydept.cc);

end;

-- %TYPE

-- 变量类型自动会和表的数据类型一致

DECLARE

-- 创建复合类型

type dept_t is record(

dno dept.DEPTNO%type,

dn DEPT.DNAME%type,

cc DEPT.LOC%type

);

-- 声明复合对象mydept

mydept dept_t;

BEGIN

select deptno,dname,loc into mydept from DEPT where DEPTNO=10;

dbms_output.put_line('部门编号 部门名称 部门地址');

dbms_output.put_line(mydept.dno||' '||mydept.dn||' '||mydept.cc);

end;

-- %rowtype

-- 定义的记录类型和表的一行记录一致

DECLARE

myd dept%rowtype;

BEGIN

select deptno,dname,loc into myd from DEPT WHERE deptno=10;

dbms_output.put_line('部门编号 部门名称 部门地址');

-- 记录类型变量.属性(就是表的字段名)

dbms_output.put_line(myd.deptno||' '||myd.dname||' '||myd.loc);

END;

条件控制语句

/*

IF .. THEN

elsif ... THEN

else

end if;

*/

-- 抽奖

-- 生成随机数dbms_random.value [0,1)

select dbms_random.value from dual;

declare

n int;

begin

select 151*dbms_random.value+50 into n from dual;

dbms_output.put_line('随机数='||n);

if mod(n,9)=0 THEN

dbms_output.put_line('恭喜你,中一等奖,走向人生巅峰');

elsif mod(n,7)=0 THEN

dbms_output.put_line('恭喜你,中二等奖,还差一点就要赢取白富美没了');

elsif mod(n,5)=0 THEN

dbms_output.put_line('恭喜你中了三等奖,奖品是一床被子');

ELSE

dbms_output.put_line('谢谢惠顾,纪念奖纸巾一包');

end if;

end;

-- CASE

declare

n int;

begin

select 151*dbms_random.value+50 into n from dual;

dbms_output.put_line('随机数='||n);

case

when mod(n,9)=0 THEN

dbms_output.put_line('恭喜你,中一等奖,走向人生巅峰');

when mod(n,7)=0 THEN

dbms_output.put_line('恭喜你,中二等奖,还差一点就要赢取白富美没了');

when mod(n,5)=0 THEN

dbms_output.put_line('恭喜你中了三等奖,奖品是一床被子');

ELSE

dbms_output.put_line('谢谢惠顾,纪念奖纸巾一包');

end case;

end;

-- case用在select语句中

循环语句

/* 一、简单循环

loop

循环体

exit when 条件

end loop;

*/

-- 1-100之间累和

DECLARE

i int:=1;

s int:=0;

BEGIN

loop

s:=s+i;

i:=i+1;

exit when i>100;--循环结束的条件

end loop;

dbms_output.put_line(s);

END;

-- while循环

/*

while 条件 loop

循环体

end loop;

*/

-- 1-10到累乘的结果

DECLARE

i int:=1;

s int:=1;

BEGIN

while i<=10 loop

s:=s*i;

i:=i+1;

end loop;

dbms_output.put_line(s);

end;

-- FOR循环

/*

for i in a..b loop

循环体

end loop;

【注意】循环变量i不需要声明,可以直接使用

*/

declare

s int :=0;

BEGIN

for i in 1..100 loop

if mod(i,2)=0 THEN

s:=s+i;

end if;

end loop;

dbms_output.put_line('100以内的偶数相加='||s);

end;

-- 判断一个数是否是素数

declare

m int :=9;

flag boolean :=true;

BEGIN

for i in 2..m-1 loop

if mod(m,i)=0 THEN

flag:=false;

exit;

end if;

end loop;

-- ???用函数,将true和false分别用汉字提示代替

dbms_output.put_line(decode(flag,true,'是素数',false,'不是素数'));

end;

游标

/*

游标是一个指向结果集的当前记录的指针,

游标指向哪一行,我们就能读取哪一行的数据

游标最初指向第一行的前一行

游标的分类:

A、显示游标

① 声明游标

② 打开游标

③ 提取游标

④ 关闭游标

B、隐式游标

简化上述操作,利用for循环

*/

DECLARE

x emp%rowtype;

--① 声明游标

cursor c is select * from emp;

BEGIN

-- ② 打开游标

open c;

-- ③ 提取游标

fetch c into x;-- 移动游标并且将当前行保存x变量

while c%found loop

dbms_output.put_line(x.ename||' ');

fetch c into x;-- 遍历,将下一行数据存入x对象

end loop;

--dbms_output.put_line('fsdkfj ');

-- ④ 关闭游标

close c;

end;

select * from emp;

-- 带参数的游标

DECLARE

e emp.ename%type;

j EMP.job%type;

-- ① 声明游标

cursor c(n int) is select ename,job from EMP

where mod(empno,n)=0;

BEGIN

-- 打开游标,将参数传入

open c(4);

-- 提取数据

fetch c into e,j;

while c%found loop

dbms_output.put_line(e||' '||j);

fetch c into e,j;

end loop;

-- 关闭游标

close c;

end;

--隐式游标--简化游标操作

DECLARE

cursor c is select * from dept;

BEGIN

for x in c loop

dbms_output.put_line(x.deptno||'--'||x.dname||'--'||x.loc);

end loop;

end;

-- 带参游标

DECLARE

cursor c(i int) is select * from dept where mod(deptno,i)=0;

BEGIN

for x in c(4) loop

dbms_output.put_line(x.deptno||'--'

||x.dname||'--'||x.loc);

end loop;

end;

相关推荐

基于Java实现,支持在线发布API接口读取数据库,有哪些工具?

基于java实现,不需要编辑就能发布api接口的,有哪些工具、平台?还能一键发布、快速授权和开放提供给第三方请求调用接口的解决方案。架构方案设计:以下是一些基于Java实现的无需编辑或只需少量编辑...

作为后端开发,你知道MyBatis有哪些隐藏的 “宝藏” 扩展点吗?

在互联网大厂后端开发领域,MyBatis作为一款主流的持久层框架,凭借其灵活的配置与强大的数据处理能力,广泛应用于各类项目之中。然而,随着业务场景日趋复杂、系统规模不断扩张,开发过程中常面临SQL...

SpringBoot集成Mybatis-Plus分页插件

一、官方介绍支持的数据库mysql,oracle,db2,h2,hsql,sqlite,postgresql,sqlserver,Phoenix,Gauss,clickhouse,Sybase,Oc...

深度分页为何让MySQL/Oracle集体“罢工”?

深夜,服务器突然报警!页面加载时间飙升10倍,数据库CPU直接爆表——罪魁祸首竟是一个看似无害的“分页查询”功能。无数开发者直到系统崩溃才惊觉:深度分页,正在无声吞噬你的数据库性能!一、现象直击:...

HPE 3PAR新增对3D NAND、Oracle加速支持

HewlettPackardEnterprise(HPE)在近日为其3PARStoreServ存储阵列增加了对3DNAND闪盘的支持,这将在某种程度上缓解客户购买其他存储厂商产品的情况。3D...

Innodb中的事务隔离级别和锁的关系

我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以对于...

巧用 VHD 实现多 Windows 系统共存:从原理到实战

在数字化办公与多元需求交织的时代,许多用户需要在同一台计算机上使用多个Windows系统,以满足不同工作场景、软件兼容性或开发测试的需求。传统的多系统安装方法往往需要对硬盘进行复杂分区,或是利用虚...

为什么越来越多Linux桌面系统选择Btrfs文件系统?

在过去很长一段时间里,Linux桌面用户安装系统时,大多数默认选项都是老牌文件系统EXT4。它稳定、简单、可靠,确实功不可没。但最近你有没有发现?越来越多的Linux桌面发行版开始默认使用一个...

SQLite:小众?其实它比你想象的更普及,连这个领域都有人用!

2000年,一艘美国军舰上,数据库服务器频繁宕机,弹出“无法连接数据库”的致命报错。程序员RichardHipp被“背锅”后灵光一现:“为什么不能直接从硬盘读数据?”——这句疑问,拉开了SQLite...

每日学习“IT”是什么呢?(每天学习it小技巧)

IT是信息技术(InformationTechnology)的简称,它是一个广泛的领域,涉及到利用计算机、网络通信技术、软件等来存储、处理、传输和获取信息。计算机硬件硬件组成部分:包括中央处理器(...

Spring Boot 中JPA和MyBatis技术那个更好?

你在进行SpringBoot项目开发时,是不是也经常在选择JPA和MyBatis这两个持久化技术上犯难?面对众多前辈的经验之谈,却始终拿不准哪种技术才最适合自己的项目?别担心,今天咱们就...

chiner-数据库关系模型设计神器(数据库数据关系模型)

1.简介chiner是一款布局简洁、操作简单,同时自带两个案例让你更方便入手的数据库关系模型设计平台,支持PowerDesigner导入,也对元PDMan高度兼容。核心理念:架构焕新,初心不变;功能更...

Spring Data JPA 的 JpaRepository与MyBatis区别对比

SpringDataJPA的JpaRepository和MyBatis是Java生态中两种非常流行但设计理念和使用方式截然不同的持久层框架。它们的核心区别在于如何管理对象-关系映射(...

DataStage 最佳实践之读取解析EXCEL文件

在上期发布的文章《分分钟让你学会使用DataStage连通企业级数据库》中,给大家详细介绍过DataStage广泛支持各种异构平台的数据库,提供多种功能强大、类型丰富的数据库连接器,满足企业数据集成所...

10个优秀的MySQL管理工具,都是大佬们的珍藏

Mysql开源、体积小、速度快、成本低、安全性高,目前在全球中小型网站中被广泛应用。今天给大家介绍10个优秀的MySQL管理工具,都是大佬们的珍藏,对你有用的话,可以收藏转发。1、Induction...

取消回复欢迎 发表评论: