文章目录

    • 1、PL/SQL简介
    • 2、PL/SQL运行机制
    • 3、PL/SQL编译过程
    • 4、使用PL/SQL的好处
    • 5、Oracle体系架构
      • 5.1、内存结构
        • 5.1.1、SGA
        • 5.1.2、PGA
      • 5.2、后台进程
      • 5.3、逻辑结构
      • 5.4、物理结构
      • 5.5、数据字典与数据库对象
        • 5.5.1、视图
        • 5.5.2、同义词
        • 5.5.3、序列
    • 6、简单操作用户

前言:
 
Oracle数据库是什么:Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系型数据库管理系统。

1、PL/SQL简介

PL/SQL(Procedural Language/SQL):是Oracle公司对关系型数据库的标准语言SQL的过程化语言扩展。
 
PL/SQL有标准SQL没有的一些特征:变量定义、控制结构、自定义子程序、对象类型等。
 
PL/SQL有自己的字符集以及由字符组成的词汇单元
 
PL/SQL最基本的单元是PL/SQL块,而PL/SQL块又能分为:匿名块和命名块;命名块又能分为:子程序(存储过程,函数)、包、触发器。命名块编译后保存在Oracle数据库的数据字典中,从而优化性能。
 
PL/SQL块是在Oracle客户端编写的

 

2、PL/SQL运行机制

用PL/SQL编写的匿名块代码放在客户端,而命名块则放在服务器端,无论放在哪,都需要PL/SQL引擎执行。
 
PL/SQL引擎位于Oracle服务器内,负责对PL/SQL块的代码进行解释和执行,其中的PL(过程语句)是由PL/SQL引擎自己负责执行;其中的SQL语句由PL/SQL引擎将SQL语句剥离出来转发到SQL引擎,然后由SQL引擎中的SQL语句处理器来处理SQL语句。

 

3、PL/SQL编译过程

匿名PL/SQL块执行时,代码会被送到服务器上,由PL/SQL引擎编译代码块。
 
而命名PL/SQL块只在块创建或修改时被编译。
 
编译过程包括:

  1. 语法检查:包括检查PL/SQL代码的语法或编译错误。
  2. 绑定:如果语法检查通过,编译器则为Oracle存储数据的程序变量分配一个存储地址,这个过程叫做绑定。
  3. 产生伪代码:伪代码是对PL/SQL引擎的指令列表。对于命名块,伪代码存储在数据库中,以备程序下次执行时使用。

 
处理SQL语句的步骤: 语法检查 -> 语义检查 -> SQL语句解析 -> 执行SQL语句并返回结果

 

4、使用PL/SQL的好处

  1. 提高应用程序性能
    • 我们将多个select语句放入一个PL/SQL程序中,那么它们就能作为单个单元被发送到服务器,返回的结果也是单个单元,这个过程只需要一个来回,比每个select语句一个来回更有效。
  2. 提供模块化程序开发能力
    • 我们可以将业务逻辑集成到PL/SQL命名块中,然后在应用程序中调用PL/SQL命名块相应的程序功能,如果业务逻辑改变,只要重建命名块即可,不需要修改客户端应用程序的代码。
  3. 具有良好的兼容性
    • 因为PL/SQL从一个环境换到另一种环境时不会发生改变,所以不同的Oracle开发工具都可以用相同的PL/SQL脚本。
  4. 允许定义标识符
  5. 提供了程序控制结构和异常处理

 

5、Oracle体系架构

Oracle学习方向:

  • 数据库管理人员:对Oracle进行管理,提升Oracle性能、优化数据存储结构等。
  • 数据库编程人员:使用Oracle PL/SQL 数据库编程语言。

 
Oracle体系架构: 是指Oracle数据库管理系统的组成部分和这些组成部分之间的相互关系
 
Oracle数据库的组成: 数据库(物理结构,逻辑结构)和 实例(内存结构,后台进程)
 
注: 一个实例最多只能安装或打开在一个数据库上,负责数据库的相应操作并与用户交互。一般情况下,一个数据库对应一个实例,但是特定情况下,如RAC情况下,一个数据库可以对应到多个实例。

5.1、内存结构

Oracle内存结构主要分为共享内存区(SGA – System Global Area)和非共享内存区(PGA – Program Global Area)

5.1.1、SGA

SGA是由用户进程共享的一块内存区域,所以称为共享内存区。启动Oracle实例时,会自动分配SGA,关闭时自动释放。
 
SGA中的几个重要区域:

  1. 数据库缓存区(Database Buffer Cache): 用来存放读取来自数据文件的数据块副本,或用户曾经处理过的数据。作用是减少存取数据时造成的磁盘读写动作,从而提高数据存取的效率。
  2. 重做日志缓冲区(Redo Log Buffer): 是记录数据库内所有数据修改的内存区域。
  3. 共享池(Shared Pool): 共享池是对SQL、PL/SQL 程序进行语法分析、编译、执行的内存区域。
  4. 其它区域: 例如大型池(Large Pool)等,大型池用于为大的内存操作提供相对独立的内存空间,通过分配大型池,可以提高大内存操作的性能。

5.1.2、PGA

PGA 是存放服务器进程的数据和控制信息的独立于SGA的一块内存区域。当用户进程连接到Oracle服务器时,Oracle服务器会为每个服务器进程分配相应的PGA,断开连接时自动释放。
 
PGA由以下四部分组成:

  1. 排序区(Sort Area): 用于存放排序操作所产生的临时数据。
  2. 会话信息(Sessin Information): 运行应用程序访问Oracle服务器时,会话所具有的权限、角色以及会话的性能统计信息会被存放到PGA当中。
  3. 游标状态(Cursor State): 在运行SQL语句时,Oracle会在共享池中为该语句分配上下文区,游标就是指向该上下文区的指针,而游标状态则指出了该语句所处的状态。
  4. 堆栈空间(Stack Space): 用来存放会话的变量信息。

5.2、后台进程

Oracle会自动激活几个特定的后台处理程序(Background Processes),主要包括:

  1. PMON(Process Monitor Process )进程监控进程: 负责在一个Oracle进程失败时清理资源。
  2. SMON(System Monitor Process)系统监控进程 : 如果Oracle数据库不正常被关闭,下一次激活数据库时将由 SMON 进行数据库修复动作。
  3. DBWR(Database Write Process)数据库写进程: 负责将数据库缓存区内改动过的数据块写入到磁盘内的数据文件
  4. LGWR(Log Write Process)日志写进程: 将重做日志缓冲区的更改写入重做日志文件
  5. CKPT(Checkpoint Process)检查点进程 : 负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。请注意,Oracle 12c 允许全面和增量检查点。
  6. ARCH(ARCHIVE)归档进程: 在每次日志切换时把已满的日志组进行备份或归档。

5.3、逻辑结构

逻辑结构是从用户组织数据的角度来观察得到的各种对象集合,Oracle 数据库使用逻辑结构对磁盘空间使用情况进行精细控制。

  • 数据块(Data blocks): Oracle 将数据存储在数据块中,块是Oracle中最小的数据读写单元,数据块也被称为逻辑块,对应于磁盘上的字节数。
  • 区(Extents): Oracle是用区的方式来配置空间的,用于存储特定类型信息的逻辑连续数据块的具体数量。
  • 段(Segments): 分配用于存储用户对象(例如表或索引)的一个区域。
  • 表空间(Tablespaces): Oracle 对数据文件(ora/dbf)的逻辑映射。一个数据库在逻辑上被划分成一个或多个表空间,每个表空间由同一磁盘上的一个或多个数据文件(datafile)组成,一个数据文件只能属于一个表空间。

5.4、物理结构

物理结构是从操作系统的角度来观察得到的各种具体的文件,占用磁盘空间,最重要的文件有:

  • 数据文件(Data File): Oracle 数据文件是数据存储的物理单位,数据库的数据是存储在表空间中的。一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表空间才行。

  • 控制文件(Control File): 每个 Oracle 数据库都会有一个控制文件,用来记录与描述数据库的实体结构。

  • 重做日志文件(Redo Log File): 负责记录数据库内任何数据的处理情况,万一Oracle数据库不小心宕机或毁损,Oracle就可以凭借重做日志文件将数据恢复如初。重做日志文件可以分为联机重做日志文件和归档重做日志文件。

  • 初始化参数文件(Initialization Parameter File): 存放用来配置内存空间及激活相关后台处理程序的特定参数设定值的文件就是初始化参数文件。

  • 口令文件(Password File): 用于认证哪些用户有权限启动和关闭Oracle例程。

5.5、数据字典与数据库对象

数据字典:是Oracle 数据库的重要部分,保存数据对象和段的信息,它是一个存放在system表空间的只读对象,不允许任何人对其修改。Oracle DBMS用它获取对象、安全信息,用户和DBA用它查阅数据库信息。
 
数据字典中的数据库对象:用户,角色,表空间,表,视图,簇,类型,同义词,序列,索引,数据库链接,存储过程,函数,包,触发器等。
 
Oracle将这些数据库对象组合到一个称为Schema的集合中。一个Schema只能被一个数据用户所拥有,并且Schema的名称与这个用户的名称相同。
 
注:该系列笔记只讲解与PL/SQL编程有关的表、视图、类型、同义词、序列以及存储过程、函数、包、触发器等数据库对象。存储过程、函数、包、触发器会放在后续章节讲解。

5.5.1、视图

任何一个select语句得到的结果(虚拟表)都可以当做一张表来使用,可以把该结果当做一个视图(View)对象。视图存在数据字典中。
 
创建视图对象的语法:
 

-- 创建视图
create view 视图名 as select查询语句;
-- 创建或替换视图(推荐使用这种方法)
create or replace view 视图名 as select查询语句;

视图中的数据:如果用户权限足够,可以对它进行增删改操作,但是会影响原表数据。


使用视图的好处:

  1. 可以限制用户从表中查询的内容
  2. 简化了数据的查询和处理操作
  3. 有利于数据交换
  4. 有利于简化对用户权限的管理

5.5.2、同义词

简单理解:用两个不同名称,代表相同的对象,它避免了直接引用数据库对象。
 
同义词分为:公有同义词(所有用户都能访问)和私有同义词(创建它的用户可以访问)。
 
创建同义词对象的语法:
 

-- 公有同义词
create public synonym 同义词名称 for 数据库对象名;
-- 私有同义词
create synonym 同义词名称 for 数据库对象名;
-- 注意:删除,修改与DDL命令一样

5.5.3、序列

序列用于实现表中主键列的自增长。通常与触发器一起使用,用来模拟自增长列。
 
创建序列对象的语法:
 

-- 最基础方式
create sequence 序列名
-- 标准格式
create sequence 序列名 increment by 增量步长 start with 起始值 maxvalue 最大值;

序列对象的两个属性:nextval(下一个值),currval(当前值)
 
注:取 currval 时,需要先使用 nextval 生成值才可用。
 
查看序列对象的当前值是多少:select 序列对象.currval from dual
 
注:dual是一个特殊的表,它只有一行一列,列的名称是虚拟的,数据类型为char(1)。主要用于表达式计算值,获取跟外部来源或函数相关的信息。select sysdate from dual; -- 获取当前系统时间

 

6、简单操作用户

在开始编写PL/SQL块代码前,我们需要选择一个用户或创建一个用户,用来连接数据库,该系列笔记中99%的案例都是在scott用户下操作的,使用的第三方工具是sqldeveloperscott用户是Oracle数据库默认存在的一个用户,里面包含了辅助我们学习的一些表,scott用户的口令(密码)默认是 tiger
 
如下是操作用户的一些语句:
 

-- 下列格式可直接套用
-- 解锁scott账号
alter user scott account unlock;
-- 更改用户scott的密码
alter user scott IDENTIFIED BY 123456;

-- 创建用户zhangsan并设置用户密码为zhangsan
create user zhangsan IDENTIFIED BY zhangsan;
-- 给用户zhangsan授予dba(数据库管理员)权限
grant dba to zhangsan;
-- 撤销用户zhangsan的dba权限
revoke dba from zhangsan;
-- 给zhangsan用户授予connect权限
grant connect to zhangsan;

更多推荐

Oracle数据库之Oracle数据库基本概念(一)