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. Linux下安装Redis以及遇到的问题

    参考链接:https://www.cnblogs.com/zdd-java/p/10288734.html https://www.cnblogs.com/uncleyong/p/9882843.ht ...

  2. 开发一个这样的 APP 要多长时间?

    作者:蒋国刚 www.cnblogs.com/guogangj/p/4676836.html 这是一个“如有雷同,纯属巧合”的故事,外加一些废话,大家请勿对号入座.开始了…… 我有些尴尬地拿着水杯,正 ...

  3. ansible执行带有环境变量的脚本不生效

    1背景 jenkins发布时,使用ansible执行远程主机上的启动tomcat脚本发现不生效,启动tomcat的脚本中有环境变量. ansible主机为:172.16.35.8 tomcat服务器为 ...

  4. Json数组(以[ ] 中括号开头)字符串转为json对象

    以 [] 开头的json数组字符串: str = "[{ "姓名":"张三", "年龄":"28" }]&qu ...

  5. Python三级菜单作业实现

    数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家':{}, ...

  6. PalletOne调色板跨链的BTC实现

    之前已经讲到了PalletOne调色板跨链以太坊ETH和ERC20的技术原理,接下来我们来讲解PalletOne跨链比特币BTC的技术原理. 一.BTC充币 假如用户A持有一定数量的比特币BTC,他希 ...

  7. shell生成指定长度的随机数

    生成指定长度是随机数 # 8位纯数字的随机数 tr -cd '0-9' </dev/urandom | head -c 8 # 16位包含字母.数字的随机数 tr -cd '[:alnum:]' ...

  8. ASP.NET Core部署系列二:发布到CentOS上

    前言: 在上一节中,通过一系列的步骤,已经将项目部署到IIS上,虽然遇到了一些问题,但最终解决并成功运行了.而在这一节中,将尝试通过linux系统的环境下,部署项目,实现Net Core跨平台的亮点. ...

  9. Slickflow.NET 开源工作流引擎高级开发(六) -- WebTest 引擎接口模拟测试工具集

    前言:引擎组件的接口测试不光是程序测试人员使用,而且也是产品负责人员需要用到的功能,因为在每一步流转过程中,就会完整模拟实际用户发生的场景,也就容易排查具体是程序问题还是业务问题,从而快速定位问题,及 ...

  10. CentOS 7安装配置MySQL 5.7

    概述 前文记录了在Windows系统中安装配置MySQL 5.7(前文连接:https://www.cnblogs.com/Dcl-Snow/p/10513925.html),由于安装部署大数据环境需 ...