PL/SQL

简介

  • PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言。
  • PL/SQL 是对 SQL 的扩展。
  • 支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构。
  • 可用于创建存储过程、函数、触发器和程序包,给SQL语句的执行添加程序逻辑。

作用:

如果出现需要插入1000条数据,这些数据带有某种规律性,就可以通过PL/SQL进行增加数据的操作

优点:

  1. 支持 SQL,在 PL/SQL 中可以使用:

    • 数据操纵命令:DML,DDL(需要动态执行)
    • 事务控制命令:TCL
    • 游标控制, 下一章学习
    • SQL函数和SQL运算符
  2. 与 SQL 紧密集成,简化数据处理。
    • 支持所有 SQL 数据类型
    • 支持 NULL 值
    • 支持 %TYPE 和 %ROWTYPE
      • %TYPE: 引用字段类型,如:employee.ename%TYPE
      • %ROWTYPE:引用表的行类型, 如: employee%ROWTYPE
  3. 支持面向对象编程 (OOP)
  4. 可移植性,可运行在任何操作系统和平台上的Oralce 数据库
  5. 更佳的性能,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语法结构以及使用的更多相关文章

  1. Oracle学习笔记十 使用PL/SQL

    PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用 ...

  2. oracle学习笔记4:PL/SQL

    PL/SQL是没命名的存储过程,函数,触发器,PL/SQL块的语法格式如下: [declare] --声明部分,可选 begin --执行部分,必须 [exception] --异常处理部分,可选 e ...

  3. Oracle 学习笔记 17 -- 异常处理(PL/SQL)

    程序异常是在操作期间正常,出现在节目的准备过程是不可避免的例外.但是,必须有一个相应的异常处理机 制,以保证程序的正常运行.PL/SQL程序运行过程中出现的错误.称为异常. 一个优秀的程序都应该可以正 ...

  4. oracle学习笔记(五) SQL操作符

    SQL操作符 算术操作符:+加,-减,*乘,/除 比较操作符: <,>,=,!=,<>,<=,>= 常用的判断,<>和!=相同 between $low ...

  5. python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

  6. Oracle学习笔记(十二)

    十三.存储过程和存储函数1.掌握存储过程(相当于建立一个函数或者方法体,然后通过外部对其调用) 指存储在数据库中供所有程序调用的子程序叫做存储过程或存储函数. 相同点: 完成特定功能的程序 区别: 是 ...

  7. oracle学习(二)pl/sql基础

    pl/sql组成:DDL DML DCL pl/sql特点: SQL&PL/SQL编译器集成PL/SQL,支持SQL所有范围的语法 支持CASE语句和表达式 继承和动态方法释放 类型进化.属性 ...

  8. Oracle学习笔记十二 子程序(存储过程、自定函数)和程序包

    子程序 子程序:命名的 PL/SQL 块,编译并存储在数据库中.   子程序的各个部分: 1.声明部分 2.可执行部分 3.异常处理部分(可选) 子程序的分类: 1.过程 - 执行某些操作 2.函数 ...

  9. (转载)西门子PLC学习笔记十五-(数据块及数据访问方式)

    一.数据块 数据块是在S7 CPU的存储器中定义的,用户可以定义多了数据块,但是CPU对数据块数量及数据总量是有限制的. 数据块与临时数据不同,当逻辑块执行结束或数据块关闭,数据块中的数据是会保留住的 ...

随机推荐

  1. 阿里云 centOS系统 配置 node + ngnix

    **centOS系统可以直接使用yun命令** 安装node 1.使用git将源码克隆到本地的~/.nvm目录下,并检查最新版本.> yum install git > git clone ...

  2. java之Objects类

    Objects类概述 在JDK7添加了一个Objects工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组成,这些方法是null-save(空指针安全的)或null-tolerant(容忍空 ...

  3. MongoDB自学------(4)MongoDB主从搭建

    MongoDB复制原理 mongodb的复制至少需要两个节点.其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据. mongodb各个节点常见的搭配方式为:一主一从.一主多 ...

  4. docker 部署springcloud项目

    一.首先从 docker.hub[地址:https://hub.docker.com] 中根据各自的需求 pull 对应的 openjdk镜像(本次直接在修改后的docker镜像源中下载) docke ...

  5. Redis入门(一)-Redis简介

    最近几年,Rddis非常的火,受到广大中大型公司,特别是互联网公司的青睐.而作为后端开发,如果你不知道Redis或不会用,没用过,你都不好意思出去找工作.可想而知Redis对于IT行业意义多么重大.对 ...

  6. Qt平台下使用QJson解析和构建JSON字符串

    前言 上一篇介绍了C语言写的JSON解析库cJSON的使用:使用cJSON库解析和构建JSON字符串 本篇文章介绍,Qt开发环境下QJson库的使用示例,JSON解析配合API接口,就可以实现一些有趣 ...

  7. go语言之指针

    package main import "fmt" //指针 //go语言的指针是非常容易学习的,比c中容易很多,他可以更简单的执行一些任务 //与变量类型,使用前需要定义 fun ...

  8. [Spring cloud 一步步实现广告系统] 9. 主类和配置文件

    搜索系统启动主类 /** * AdSearchApplication for 广告搜索服务启动类 * * @author <a href="mailto:magicianisaac@g ...

  9. C# 模拟Windows键盘事件

    发送键盘消息 [DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true) ...

  10. ASP.NET Core 2.2 WebApi 系列【八】统一返回格式(返回值、模型验证、异常)

    现阶段,基本上都是前后端分离项目,这样一来,就需要前后端配合,没有统一返回格式,那么对接起来会很麻烦,浪费时间.我们需要把所有接口及异常错误信息都返回一定的Json格式,有利于前端处理,从而提高了工作 ...