Oracle系列十二:视图、记录、同义词、序列

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Oracle视图、记录、同义词、序列

1. 视图View

1基本概念

Oracle视图是数据库中的一种特殊对象它是一个虚拟的表不存储数据而是基于一个或多个表的查询结果而创建的。视图可以看作是一个存储在数据库中的查询结果集具有表的特性包含一系列带有名称的列和行数据可以被查询、修改和删除等。

视图并不在数据库中以存储的数据值集形式存在行和列数据来自由定义视图的查询所引用的表并且在引用视图时动态生成。因此可以简化复杂的查询提高查询效率同时也可以保护数据的安全性。

2视图的创建

创建Oracle视图的语法如下

CREATE [OR REPLACE] VIEW view_name [(column1, column2,)]
AS
SELECT column1, column2,FROM table1, table2,WHERE [condition];

其中view_name是视图的名称column1, column2, …是视图中的列名table1, table2, …是视图中要查询的表condition是查询条件。

例如创建一个视图显示所有员工的姓名、部门名称和薪水

CREATE VIEW emp_dept_salary AS
SELECT e.ename, d.dname, e.sal
FROM emp e, dept d
WHERE e.deptno = d.deptno;

3视图的使用

使用Oracle视图可以像使用表一样进行查询、修改和删除等操作。

e.g.

  • 查询emp_dept_salary视图中的所有数据
SELECT * FROM emp_dept_salary;
  • 修改emp_dept_salary视图中的数据
UPDATE emp_dept_salary 
SET sal = sal * 1.1 
WHERE dname = 'SALES';
  • 删除emp_dept_salary视图中的数据
DELETE FROM emp_dept_salary
WHERE ename = 'SMITH';

对于可更新的视图在视图中的行和基表中的行之间必须具有一一对应的关系

还有一些特定的其他结构这类结构会使得视图不可更新。更具体地讲如果视图包含下述结构中的任何一种那么它就是不可更新的

  • 聚合函数SUM() MIN() MAX() COUNT()等。
  • DISTINCT
  • GROUP BY
  • HAVING
  • UNIONUNION ALL
  • 仅引用文字值在该情况下没有基本表
  • 位于选择列表中的子查询
  • Join
  • FROM子句中的不可更新视图
  • WHERE子句中的子查询引用FROM子句中的表

2. 记录Record

1基本概念

Oracle中的Record对象是一种复合数据类型用于存储和操作多个相关字段或数据元素的集合

Record将多个变量组成一个单独的实体来处理常用于支持SELECT语句的返回值。使用Record可将一行数据看成一个单元进行处理而不必将每一列单独处理简化代码提高可读性和可维护性。

2记录的定义

使用以下语法定义一个RECORD对象

TYPE type_name IS RECORD(
Variable_name1 datatype1
Variable_name2 datatype2
…
Variable_nameN datatypeN);

其中type_name是RECORD对象的名称Variable_name1到Variable_nameN是RECORD对象中的字段名datatype1到datatypeN是字段的数据类型。

例如以下代码定义了一个RECORD对象employee_rec该对象具有三个字段emp_id、emp_name和emp_salary。

TYPE employee_rec IS RECORD(
   emp_id NUMBER,
   emp_name VARCHAR2(50),
   emp_salary NUMBER
);

3记录的使用

  • 声明RECORD变量
variable_name record_type;

e.g.

声明了一个变量emp_info该变量类型为employee_rec

emp_info employee_rec;
  • 对RECORD变量进行赋值
variable_name.field_name := value;

e.g.

将emp_id、emp_name和emp_salary字段分别设置为101、'John Smith’和5000

emp_info.emp_id := 101;
emp_info.emp_name := 'John Smith';
emp_info.emp_salary := 5000;
  • 用于SELECT语句的返回值

e.g.

首先使用SELECT语句从“EMPLOYEE”表中检索ID为32334的员工记录将结果存储在名为“REAL_RECORD”的record对象中然后将“REAL_RECORD”对象中的“SALARY”字段乘以1.1使用UPDATE语句将结果更新到数据库中。

DECLARE
TYPE MYRECORD IS RECORD(
ID   EMPLOYEE.ID%TYPE,
NAME EMPLOYEE.NAME%TYPE,
SALARY EMPLOYEE.SALARY%TYPE); -- 自定义定义记录MYRECORD
REAL_RECORD MYRECORD; -- 声明记录变量REAL_RECORD

BEGIN
SELECT ID,NAME,SALARY INTO REAL_RECORD FROM EMPLOYEE WHERE ID='32334';
DBMS_OUTPUT.PUT_LINE(REAL_RECORD.ID||''||REAL_RECORD.NAME||''||REAL_RECORD.SALARY);

REAL_RECORD.SALARY := REAL_RECORD.SALARY * 1.1;
UPDATE EMPLOYEE SET SALARY = REAL_RECORD.SALARY WHERE ID='32334';
DBMS_OUTPUT.PUT_LINE(REAL_RECORD.ID||''||REAL_RECORD.NAME||''||REAL_RECORD.SALARY);

END;

3. 同义词Synonym

1基本概念

Oracle的同义词是一种数据库对象它可以被用来提供对其他表、视图或同义词的简单访问。同义词的定义包括了一个名称和一个指向实际对象的引用这个对象可以是本地的也可以是远程的。

使用同义词的可以简化SQL语句并且在重命名表或移动表到不同的模式时可以减少修改查询语句的工作量。同义词还可以被用来授权到另一个用户的对象同时保持原始拥有者的安全性。

2创建同义词

Oracle中创建同义词的语法如下

CREATE [PUBLIC] SYNONYM [schema.]synonym_name FOR [schema.]object_name[@db_link];

其中PUBLIC表示同义词是公共的可以被所有用户访问schema表示对象所属的模式如果未指定则默认为当前用户synonym_name是同义词的名称object_name是同义词引用的实际对象名称db_link是可选的表示引用远程数据库的数据库链接名。

3同义词的使用

e.g.

Create Or Replace Public Synonym emp For db1.EMPLOYEE;
Select * From emp;
Drop Synonym t1_jbxx; --删除同义词
 desc user_synonyms;  --查看同义词

4. 序列Sequence

1基本概念

Oracle的序列Sequence是一种生成唯一数值序列的对象这些序列通常用作主键或其他唯一标识符。序列可以定义为单调递增的从而保证序列中的值是唯一的、不可重复的。

序列通常用于创建主键或其他需要唯一标识符的字段可被多个会话共享并且可以在许多表中使用。

2序列的定义

使用以下语法在Oracle中创建序列

CREATE SEQUENCE sequence_name
    [INCREMENT BY increment_value]
    [START WITH starting_value]
    [{ MAXVALUE max_value | NOMAXVALUE }]
    [{ MINVALUE min_value | NOMINVALUE }]
    [{ CYCLE | NOCYCLE }]
    [{ CACHE cache_value | NOCACHE }];

每个参数的含义如下

  • sequence_name: 序列的名称
  • increment_value: 序列每次增加的值默认为1
  • starting_value: 序列的起始值默认为1
  • max_value: 序列的最大值如果设置了该值则序列将在达到该值时重新循环
  • min_value: 序列的最小值如果设置了该值则序列将在达到该值时停止增长
  • CYCLE | NOCYCLE: 如果启用了CYCLE则在达到MAXVALUE时序列将重新循环如果禁用了CYCLE则在达到MAXVALUE时将停止增长
  • CACHE cache_value: 指定序列缓存的个数默认为20。

e.g.

定义了一个名为my_sequence的序列从1开始递增每次增加1最大值为1000

CREATE SEQUENCE my_sequence
  START WITH 1
  INCREMENT BY 1
  MAXVALUE 1000;
Alter Sequence my_sequence Increment By 3; --修改序列
DESC USER_SEQUENCES; --查看序列

3序列的使用

  • 引用序列
sequence_name.NEXTVAL

其中NEXTVAL是一个序列对象的方法用于获取下一个序列值。您还

  • 获取当前序列值
sequence_name.CURRVAL

需要注意的是在使用CURRVAL之前必须先使用NEXTVAL来获取序列的当前值。

  • 使用序列生成ID
INSERT INTO my_table (id, name) VALUES (my_sequence.NEXTVAL, 'John');

这个语句将会插入一条记录到my_table表中其中id字段的值将会从my_sequence序列中获取。每次调用my_sequence.NEXTVAL都会返回一个递增的唯一数字。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: oracle