文章目录

  • 一、PL/SQL块结构
  • 二、注释
  • 三、数据类型
    • Number(p,s)
    • %TYPE
    • Record
    • %ROWTYPE
  • 四、选择语句
    • If......then
    • If....then.....else
    • If....then....elsif......then....else
    • Case语句
  • 五、循环语句
    • Loop
    • While
    • For
  • 六、游标
    • 显式游标:
    • 隐式游标
    • 遍历隐式游标
    • 遍历显式游标
  • 七、存储过程
    • 存储过程创建
    • 存储过程参数
      • IN
      • Out
      • IN OUT
      • 删除存储过程
  • 八、异常处理
    • 使用oracle预处理异常
    • 自定义异常:错误编号异常
    • Raise主动抛出异常
  • 九、触发器
    • 语句级触发器
    • 行级别触发器
    • 用户事件触发器
    • 删除触发器
  • 十、视图
    • 创建简单视图
    • 复杂视图
    • 连接视图
    • 删除视图

一、PL/SQL块结构

(1)声明部分(DECLARE)开始(可选),到BEGIN关键字结束,这一部分可以声明PL/SQL程序块中所用到的变量、常量和游标等。
注:再某个PL/SQL块中声明的内容,只能在当前块中使用
(2)执行部分(BEGIN)开始(必须有),结束方式有两种。如果语句块中运行出现异常,则执行异常处理部分的代码结束。如果代码块没有异常,则以执行到END关键字结束。
(3)异常处理部分(EXCEPTION),语句块出现异常时执行该部分,执行结束后,整个PL/SQL语句块执行结束。

注:每一条语句都必须以分号结束,每条SQL语句可以写成多行,以分号结束;

二、注释

单行注释 –
多行注释 /。。。。。/

三、数据类型

Number(p,s)

p标识精度(所有有效数字) s标识刻度范围(小数点右边的位数)

Char长度固定,最大2000字节
Varchar2长度不固定,最大4000字节
Long长度不固定,最大32767字节

%TYPE

优点
(1)用户不必查看表结构中各列的数据类型就可以定义保存某列值的变量
(2)如果对表中列的类型进行修改,无需考虑更改pl/sql语句块中定义的变量类型
Select…into 对变量进行赋值

Record

存储由多列组成的一行数据,是一种结构化的数据类型,使用type语句进行定义

%ROWTYPE

结合了%TYPE和RECORD变量的优点,可以根据数据表中行的结构,定义一种特殊的数据类型,用来存储从数据表中检索到的一行数据

declare
--定义能够存储emp表中一行数据的变量row_emp emp%rowtype;begin--检索数据存储到定义的变量select * into row_empfrom empwhere empno = 7369;--输出查询的数据dbms_output.put_line('雇员'||row_emp.ename||'的编号'||row_emp.empno||'职务是'||row_emp.job);end;

四、选择语句

If…then

只做一种情况条件判断

declarevar_name1 varchar2(50);var_name2 varchar2(50);beginvar_name1 := 'AAA';var_name2 := 'BB';if length(var_name1) > length(var_name2) thendbms_output.put_line('字符串'||var_name1||'的长度比字符串'||var_name2||'的长度大');end if;end;

If…then…else

可以实现判断两种情况分支

declareage int := 20;begin if age >= 18 then dbms_output.put_line('你已经老了');else dbms_output.put_line('你还年轻');end if;end;

If…then…elsif…then…else

实现多分支选择语句

declare--定义月份变量month int;
begin--获取系统当前时间月份,赋值给month变量select to_char(sysdate,'MM')into monthfrom dual;--判断是第几季度if month >= 1 and month <=3 thendbms_output.put_line('这是第一季度');elsif month >=4 and month <=6 thendbms_output.put_line('这是第二季度');elsif month >=7 and month <=9 thendbms_output.put_line('这是第三季度');elsif month >=10 and month <=12 thendbms_output.put_line('这是第一季度');elsedbms_output.put_line('月份不符合要求');end if;
end;

Case语句

与elseif类似,case后面通常是一个变量

declareseason int :=3;info varchar2(50);
begincase seasonwhen 1 then info := '季度包含1,2,3月份';when 2 then info := '季度包含4,5,6月份';when 3 then info := '季度包含7,8,9月份';when 4 then info := '季度包含10,11,12月份';else info := '季度不合法';end case;dbms_output.put_line(info);
end;

五、循环语句

Loop

Loop语句会先执行一次循环体,然后判断‘EXIT WHEN’关键字后面的条件表达式,若为true则退出循环体,否则继续执行循环体,所以loop至少执行一次循环体

declare--定义整数变量,存储整数和sum_i int := 0;--定义整数变量,存储自然数i int := 0;
begin--循环累加loop--给自然数赋值i := i+1;--计算前n个自然数的和sum_i := sum_i+i;--当循环100次时,程序退出循环体exit when i = 100;end loop;dbms_output.put_line('前100个自然数之和为:'||sum_i);
end;    

While

执行0次或多次循环体,在每次执行循环体之前,首先判断条件表达式的值是否为true,若为true在执行循环体语句,否则退出循环体

declaresum_i int := 0;i int :=0;beginwhile i <= 100 loopi := i+1;sum_i := sum_i + i;end loop;dbms_output.put_line(sum_i);end;

For

For语句是一个可以预置循环次数的循环控制语句,它有一个循环计数器,通常是一个整型变量,通过这个循环计数器来控制循环次数

declaresum_i int := 0;beginfor i in reverse 1..100 loop--判断是否为偶数if mod(i,2) = 0 thensum_i := sum_i + i;end if;end loop;dbms_output.put_line('和为'||sum_i);end;   

六、游标

显式游标:

声明游标
主要包括游标名和为游标提供结果集的select语句,因此声明游标时必须指定游标名和游标所使用的select语句

打开游标
游标声明完之后,必须打开才能使用
Open 游标名称[()],当省略参数后,传入的就为默认值

读取游标
读取游标就是逐行将结果集中的数据保存到变量中处理。
Fetch cur_name into(variable)
Variable:一个变量列表或‘记录’变量(record类型)
%found:布尔值,存在值为true,否则为false

关闭游标
Close cur_name;
实例:

declare
--声明游标cursor cur_emp(var_job in varchar2 := 'SALESMAN')is select empno,ename,salfrom empwhere job = var_job;--声明一个记录类型,用于存放游标每行的值type reco_emp is record(var_empno emp.empno%type,var_ename emp.ename%type,var_sal emp.sal%type);--声明一个reco_emp类型的变量emp_row reco_emp;
begin--打开游标open cur_emp('MANAGER');--先让指针指向结果集中的第一行fetch cur_emp into emp_row;while cur_emp%found loopdbms_output.put_line(emp_row.var_ename||'编号是'||emp_row.var_empno||'工资为'||emp_row.var_sal);fetch cur_emp into emp_row;end loop;--关闭游标close cur_emp;
end;

隐式游标

将emp表中销售员的工资上调20%,然后使用隐式游标sql的%rowcount属性输出上调员工的数量
%rowcount受sql语句影响的行数

begin update empset sal = sal*1.2where job = 'SALESMAN';if sql%notfound thendbms_output.put_line('没有雇员需要上调工资');elsedbms_output.put_line('有'||sql%rowcount||'个雇员工资上调20%');end if;end;

遍历隐式游标


遍历显式游标


七、存储过程

存储过程创建



存储过程参数

IN



Out

IN OUT

删除存储过程


drop procedure pro_square;

八、异常处理

使用oracle预处理异常


自定义异常:错误编号异常


自定义异常:业务逻辑异常

Raise主动抛出异常


九、触发器

语句级触发器


行级别触发器

用户事件触发器

删除触发器


drop trigger tri_ddl_oper;

十、视图

创建简单视图

复杂视图

复杂视图指包括函数、表达式或分组数据的视图

连接视图

连接视图指基于多个表所建立的视图。使用连接视图主要目的是为了简化连接查询。需要注意,连表查询时,必须使用where子句指定有效的连接条件,否则结果就是毫无意义的笛卡尔积

删除视图

drop view emp_view_uni;

(Oracle学习笔记) PL/SQL编程语言相关推荐

  1. Oracle学习笔记_PL/SQL语句块

    推荐一个学习视频:https://www.bilibili.com/video/BV1AX4y1T7KG?spm_id_from=333.1007.top_right_bar_window_custo ...

  2. oracle数据库笔记---pl/sql的基础使用方法

    2.pl/sql的使用:创建表: a.输入账户,密码进入后, b.在左侧下拉框选择All objects,中的tables有很多,是系统自带的表; 在左侧下拉框选择My objects,中的table ...

  3. oracle程序包写法,Oracle学习笔记20150913pl/sql编程包的写法

    1.包体是一种实现在包中声明函数与过程的数据对象(在包体中实现的函数或者过程必须先在包中声明) 在调用包中的方法或者过程时①控制台中 exec 方案名.包名.过程名(参数...);或者call 方案名 ...

  4. oracle update单引号,Oracle学习笔记:update的字段中包括单引号

    平时update的时候直接更改字段内的值,例如: update table_temp set name = 'Hider' where id = 100; 但更新后的值中包括单引号,则不能按以上方式进 ...

  5. Oracle数据库学习:PL/SQL(详解)

    Oracle数据库学习:PL/SQL 什么是PL/SQL PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的扩展语言; 使用PL/SQL 可以编写具 ...

  6. Oracle(五)PL/SQL编程语言

    Oracle(五)PL/SQL编程语言 ---pl/sql编程语言 ---pl/sql语言是对sql语言的扩展,使得sql语言具有过程化编程的特性. ---pl/sql编程语言比一般的过程化编程语言, ...

  7. Oracle学习笔记---(一)

    Oracle学习笔记---(一) 一 1.Oracle简介     Oracle是以高级结构化查询语言(SQL)为基础的大型关系数据库:是一个对象关系数据库管理系统(ORDBMS).它提供了关系数据库 ...

  8. Oracle 学习笔记,,,经验总结整理的。。。

    cmd进入: 1. D:\oracle\ora92\bin> 2. sqlplus /nolog 3. conn sys/sys as sysdba sqlplus进入: username:sy ...

  9. Oracle学习笔记 字符集概述

    Oracle 学习笔记 字符集概述 这节课开始讲oracle里面的字符集 偏重于原理和简单的一些判断以及实现 字符集它涉及到很多的东西 比如建库和操作系统环境 这节课把字符集的原理性的东西以及常见的操 ...

最新文章

  1. HttpWebRequest.GetResponse() raises exception when http status code 400 (bad request) is returned
  2. api权限管理系统与前后端分离实践
  3. mysql用户数据导入_MySQL添加用户、删除用户与授权和数据的导入导出
  4. sql中 set 和select 的区别
  5. java io系列09之 FileDescriptor总结
  6. ssas从mysql获取数据库_通过AMO获取SQL Server SSAS信息
  7. Android测试——ADB工具的安装笔记
  8. 一个肥皂泡的破灭(组图)
  9. B站高清视频下载方法揭密
  10. Mysql计算同比环比(超详细)
  11. C语言之for循环应用之断案篇----找凶手
  12. 洛谷 P4704 太极剑【贪心】
  13. Holy Grail 圣杯布局详解
  14. 不同参数对分类模型性能影响记录
  15. PPT的常用技巧(1):
  16. ffmpeg官方下载网址
  17. 机器视觉在烟草领域中的应用
  18. 利用Python进行性能测试(上)
  19. P1618 三连击(升级版)C语言
  20. matlab中常微分方程数值计算的方法

热门文章

  1. 并发安全Sync包的使用
  2. java中 instanceof 的用法
  3. [JAVA基础] 了解构造器Constructor———你真的会用构造器吗?
  4. Dockerfile 部署Djano项目
  5. autossh端口映射
  6. androidstuido_schooltest_1
  7. VMP分析之VMP1.09虚拟化架构分析(二)
  8. 宏病毒的研究与实例分析06——终结篇 进击的MACRO
  9. MySQL修改数据库:ALTER DATABASE用法简介
  10. 1.11 Lambda表达式遍历Iterator迭代器