oracle学习笔记(十五) PL/SQL语法结构以及使用
PL/SQL
简介
- PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言。
- PL/SQL 是对 SQL 的扩展。
- 支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构。
- 可用于创建存储过程、函数、触发器和程序包,给SQL语句的执行添加程序逻辑。
作用:
如果出现需要插入1000条数据,这些数据带有某种规律性,就可以通过PL/SQL进行增加数据的操作
优点:
- 支持 SQL,在 PL/SQL 中可以使用:
- 数据操纵命令:DML,DDL(需要动态执行)
- 事务控制命令:TCL
- 游标控制, 下一章学习
- SQL函数和SQL运算符
- 与 SQL 紧密集成,简化数据处理。
- 支持所有 SQL 数据类型
- 支持 NULL 值
- 支持 %TYPE 和 %ROWTYPE
- %TYPE: 引用字段类型,如:employee.ename%TYPE
- %ROWTYPE:引用表的行类型, 如: employee%ROWTYPE
- 支持面向对象编程 (OOP)
- 可移植性,可运行在任何操作系统和平台上的Oralce 数据库
- 更佳的性能,PL/SQL 经过编译执行
常用数据类型
- 数值
number, numeric, decimal, float, int, integer, real - 字符串
varchar,varchar2,string(PLSQL特有的) - 布尔类型boolean
- 日期常用类型
date, timestamp - 属性类型
%type:引用某一个变量的类型或都是某个列名(字段)的类型。employee.ename%type;
%rowtype:表示可存储某表行的记录类型。Employee%rowtype;
变量声明以及赋值
--赋值号为 :=
$变量名$ [CONSTANT] $datatype$ [NOT NULL] [:= value];--赋值
$变量名$ [CONSTANT] $datatype$ [NOT NULL] [DEFAULT expr];--默认值
age int;--声明一个整型变量age,
age int := 18;--声明age并赋值
age int default 18;--默认age为18
age constant int :=18;--声明整型常量age并赋值为18
--声明一个与employee.ename相同类型的变量myname
myname employee.ename%type;
--声明一个变量,类型为表的行类型(相当于表中每条数据对应的实体类)
rec_emp employee%rowtype;--employee表中的数据有多少列,rec_emp也有多少列
--例子,输入员工编号,输出该员工信息
declare
v_empno employee.empno%type;
rec_emp employee%rowtype;
begin
v_empno := &请输入员工编号;
select * into rec_emp from employee where empno=v_empno;
--使用 .列名 得到列的值
dbms_output.put_line(rec_emp.empno||','
||rec_emp.ename||','
||rec_emp.sal||','
||rec_emp.job);
end;
/
--自定义一个新的数据类型,然后再用这个去声明变量,使用的话也是 .列名
type TYPE_EMP_REC is record(
empno employee.empno%type,
ename employee.ename%type,
sal employee.sal%type,
job employee.job%type
);
--赋值还可以通过select into语句
select ename into myname from employee where empno=7879;
--多个变量,注意要两边要对应
select ename,sal into myname,mysal from employee where empno =7879;
基本单元框架
[DECLARE
--声明变量、常量、游标、自定义记录类型等。
]
BEGIN
--执行部分。
[EXCEPTION
--异常处理部分。
]
END;
/ --立即执行
输出输入语句
输出
oracle内置有一个dbms_output对象,负责输出
dbms_output对象有两个输出方法,一个为put,另外一个外put_line
参数可以接收数值型
--此方法不能立即输出,需要等待数据缓冲区满了之后或者是刷新数据缓冲区之后才会输出
dbms_output.put('hello world');
--下面两个任选一个即可让上面的hello world立即输出
dbms_output.put_line('');
dbms_output.new_line;
dbms_output.put_line('hello world');--立即输出
如果是在命令行窗口的话,没有见到输出语句,需要设置开启输出
set serveroutput on;
输入
--&号在PL/SQL中作为一个替代变量,用于在运行中输入值。如果输入的是字符类型那把&号放在两个单引号中,
--若是数字则不用单引号括起来
v_ename := '&请输入姓名:';
v_sal := &请输入工资;
输入输出例子
declare
v_name varchar2(10) := '&输入名字';
v_age int := &输入年龄;
begin
dbms_out.put_line('我是'||v_name||'年龄为'||v_age);
--使用||连接字符串
end;
/
判断与分支语句
if判断
--if判断
if 表达式 then
end if
if-else判断
--if-else判断
if 表达式 then
--代码
else
--代码
end if
if-else if判断
--if-else if判断
if 表达式 then
else if 表达式 then
--代码
else
--代码
end if
end if
例子:
--出现几个if就得出现几个end if
declare
v_sal employee.sal%type := &请输入工资;
begin
if v_sal >=5000 then
dbms_output.put('经理');
else if v_sal<5000 and v_sal >=3000 then
dbms_output.put('员工');
else if v_sal<3000 and v_sal>1000 then
dbms_output.put('other');
else
dbms_output.put('others');
end if;
end if;
end if;
dbms_output.new_line;
end;
/
--少了elsle
declare
v_sal employee.sal%type := &请输入工资;
begin
if v_sal >=5000 then
dbms_output.put('经理');
else if v_sal<5000 and v_sal >=3000 then
dbms_output.put('员工');
else if v_sal<3000 and v_sal>1000 then
dbms_output.put('other');
end if;
end if;
end if;
dbms_output.new_line;
end;
/
case分支语句
--1.判断是否满足表达式
case
when 表达式 then
--代码
when 表达式 then
--代码
else
--代码
end case;
--2.判断是否等于某个数值
case
when 数值 then
--代码
when 数值 then
--代码
else
--代码
end case;
数值不能能为字符串类型
循环语句for while loop
loop循环
--无条件循环
loop
--代码以及初始化相关
--满足条件退出当前循环
IF 条件 THEN
EXIT;
END IF;
--或者使用 EXIT WHEN 条件
end loop;
while循环
--有条件循环
--满足条件进入循环
while 条件 LOOP
--初始化数值;
--代码
EXIT WHEN 条件; --满足条件退出循环
--代码
end loop;
for循环
--oracle会自动创建计数器变量,也就是我们的i
--除了i,也可以起其他的名字
--相当于for(i=1;i<=10;i++)
for i in 1..10 loop
--statement;
end loop;
--相当于for(i=10;i>=1;i--)
for i in reverse 1..10 loop
--statement;
end loop;
-使用变量作为for循环的范围
declare
v_min integer default 1;
v_max integer default 20;
begin
for i in reverse v_min..v_max loop
dbms_output.put(i||',');
end loop;
dbms_output.new_line;
end;
/
循环结构练习
--遍历输出某个部门的全部员工信息
declare
v_deptno integer := &请输入部门号;
begin
for emp in (select e.* from employee e where deptno=v_deptno) loop
dbms_output.put_line(||emp.empno||','||emp.ename||','||emp.job||','||emp.sal);
end loop;
end;
/
--for打印99乘法表
begin
--如果不在rownum,可以吗?
for num1 in 1..9 loop
for num2 in 1..num1 loop
dbms_output.put(num2||'*'||num1||'='||num1*num2||' ');
end loop;
dbms_output.new_line;
end loop;
end;
/
--loop打印99乘法表
declare
num1 int := 1;
num2 int;
begin
loop
num2 := 1;
loop
dbms_output.put(num2||'*'||num1||'='||num1*num2||' ');
exit when num1=num2;
num2 := num2+1;
end loop;
dbms_output.new_line;
exit when num1=9;
num1 := num1+1;
end loop;
end;
/
--while打印99乘法表
declare
num1 int := 1;
num2 int;
begin
while num1 <= 9 loop
num2 := 1;
while num2 <= num1 loop
dbms_output.put(num2||'*'||num1||'='||num1*num2||' ');
exit when num2=num1;
num2 :=num2+1;
end loop;
dbms_output.new_line;
exit when num1=9;
num1 := num1+1;
end loop;
end;
/
oracle学习笔记(十五) PL/SQL语法结构以及使用的更多相关文章
- Oracle学习笔记十 使用PL/SQL
PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用 ...
- oracle学习笔记4:PL/SQL
PL/SQL是没命名的存储过程,函数,触发器,PL/SQL块的语法格式如下: [declare] --声明部分,可选 begin --执行部分,必须 [exception] --异常处理部分,可选 e ...
- Oracle 学习笔记 17 -- 异常处理(PL/SQL)
程序异常是在操作期间正常,出现在节目的准备过程是不可避免的例外.但是,必须有一个相应的异常处理机 制,以保证程序的正常运行.PL/SQL程序运行过程中出现的错误.称为异常. 一个优秀的程序都应该可以正 ...
- oracle学习笔记(五) SQL操作符
SQL操作符 算术操作符:+加,-减,*乘,/除 比较操作符: <,>,=,!=,<>,<=,>= 常用的判断,<>和!=相同 between $low ...
- python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...
- Oracle学习笔记(十二)
十三.存储过程和存储函数1.掌握存储过程(相当于建立一个函数或者方法体,然后通过外部对其调用) 指存储在数据库中供所有程序调用的子程序叫做存储过程或存储函数. 相同点: 完成特定功能的程序 区别: 是 ...
- oracle学习(二)pl/sql基础
pl/sql组成:DDL DML DCL pl/sql特点: SQL&PL/SQL编译器集成PL/SQL,支持SQL所有范围的语法 支持CASE语句和表达式 继承和动态方法释放 类型进化.属性 ...
- Oracle学习笔记十二 子程序(存储过程、自定函数)和程序包
子程序 子程序:命名的 PL/SQL 块,编译并存储在数据库中. 子程序的各个部分: 1.声明部分 2.可执行部分 3.异常处理部分(可选) 子程序的分类: 1.过程 - 执行某些操作 2.函数 ...
- (转载)西门子PLC学习笔记十五-(数据块及数据访问方式)
一.数据块 数据块是在S7 CPU的存储器中定义的,用户可以定义多了数据块,但是CPU对数据块数量及数据总量是有限制的. 数据块与临时数据不同,当逻辑块执行结束或数据块关闭,数据块中的数据是会保留住的 ...
随机推荐
- STM32F429的新版用户手册更新记录, 改进、交流(2019-08-18发布V0.9版本)
2019-06-16 发布首版V0.1 2019-06-23 发布V0.2版本 新增章节: 第3章 STM32F429 整体把控 第4章 STM32F429 工程模板建立(MDK5) 第5章 STM3 ...
- 如何解决eclipse远程服务器上面的Rabbitmq连接超时问题?
1.嗯,问题呢,就是一开始安装好RabbitMQ,练习了一下RabbitMQ的使用,但是呢,过了一段时间,我来复习的时候,发现运行出现下面的错误了.后来想想,是自己学习微服务的时候,修改了/etc/h ...
- 前端知识体系-NodeJS相关】NodeJS基础知识全面总结
NodeJS基础知识 1. Node的全局对象和全局变量 1.1 全局对象:所有模块都可以调用的 global:表示Node所在的全局环境,类似于浏览器的window对象. process:该对象表示 ...
- JavaScript---动态加载script和style样式
一个网页里面的内容理解为一个XML或者说网页本身也就是一个XML文档,XML文档都有很特殊的象征:"标签"也叫"节点". 一个基本的网页格式 <!DOCT ...
- 利用Azure虚拟机安装Dynamics 365 Customer Engagement之五:安装SQL Server
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- MySQL复习值代码知识点(1)
MySQL复习值代码知识点 一. 创建数据库 create database 数据库名: 二. 删除数据库 drop database 数据库名: 三. 选择相应的数据库 use 数据库名: 四. 创 ...
- RCA:收单设备调用云端接口频繁超时排查总结
研发中心/王鹏 2019年7月 关键词:OKHTTP,安卓,连接复用,开源软件BUG 一.背景知识: OKHTTP已是安卓项目中被广泛使用的网络请求开源库,它有如下特性: 1.支持HTTP/2,允许所 ...
- ORACLE EXPIRED(GRACE)
查询用户状态col username for a20col account_status for a20select username,account_status,LOCK_DATE,EXPIRY_ ...
- html 初识 文档结构 常用标签
HTML初识 △HTML: 超文本标记语言,是一种用于创建网页的标记语言,不是编程语言,没有逻辑 本质上是浏览器可识别的规则 我们按照规则写网页,浏览器根据规则渲染我们的网页.对于不同的浏览器,对同一 ...
- MySql 库/表级操作 及 数据类型
数据库分类 关系型数据库(SQL):存储方式固定,安全 非关系型数据库(NoSQL):存储方式比较灵活,存储数据的效率比较高,不太安全 MySQL是一种关系型数据库管理系统(采用关系模型来组织管理数据 ...