Oracle数据库相关操作(20220709)

记录:283

场景:Oracle数据库相关操作。比如:创建用户,用户授权、查看对象、表、注释等;创建表空间和数据文件以及应用;创建序列以及应用;建表(普通表和分区表)以及应用,全局索引和局部索引应用、创建视图以及应用、创建同义词以及应用、创建Database Link以及应用、创建存储过程以及应用、创建包和包体管理存储过程以及应用、创建Job以及应用、表分析应用。

版本:Oracle Database 11g

工具:PL/SQL Developer

一、案例场景

基础约定:

数据库1:HUB_SPRING,具备DBA权限。

数据库2:HUB_SUMMER,具备非DBA权限,即普通权限。

表空间:DATA_HUB、DATA_HUB_SUMMER。

1.数据库用户

1.1创建用户

场景:在启动新项目时,一般会把相关的数据库对象(表、索引、存储过程等)建立在一个独立用户下,便于权限管理、项目之间数据隔离,因此不影响在运项目。

1.1.1创建用户(DBA)

使用SQL命令创建Oracle用户。

create user HUB_SPRING 
identified by ***自定义密码*** 
default tablespace DATA_HUB
temporary tablespace TEMP
profile DEFAULT 
quota unlimited on DATA_HUB ;
grant connect to HUB_SPRING;
grant resource to HUB_SPRING;
grant dba to HUB_SPRING;
grant unlimited tablespace to HUB_SPRING;

1.1.2创建用户(普通用户)

使用SQL命令创建Oracle用户。

create user HUB_SUMMER
identified by ***自定义密码*** 
  default tablespace DATA_HUB_SUMMER
  temporary tablespace TEMP;
grant connect to HUB_SUMMER;
grant resource to HUB_SUMMER;
grant create any table to HUB_SUMMER;
grant create any view to HUB_SUMMER;
grant create session to HUB_SUMMER;
grant drop any table to HUB_SUMMER;
grant drop any view to HUB_SUMMER;
grant execute any procedure to HUB_SUMMER;
grant insert any table to HUB_SUMMER;
grant select any table to HUB_SUMMER;
grant update any table to HUB_SUMMER;
grant delete any table to HUB_SUMMER;
grant unlimited tablespace to HUB_SUMMER;

1.2用户授权

1.2.1 用户授权和撤销用户权限

场景:具备DBA权限的用户HUB_SPRING,给普通用户HUB_SUMMER分配指定权限。具备DBA权限的用户HUB_SPRING,给撤销分配给普通用户HUB_SUMMER权限。

--授权
grant connect to HUB_SUMMER;
grant resource to HUB_SUMMER;
grant create any table to HUB_SUMMER;
grant create any view to HUB_SUMMER;
grant create session to HUB_SUMMER;
grant drop any table to HUB_SUMMER;
grant drop any view to HUB_SUMMER;
grant execute any procedure to HUB_SUMMER;
grant insert any table to HUB_SUMMER;
grant select any table to HUB_SUMMER;
grant update any table to HUB_SUMMER;
grant delete any table to HUB_SUMMER;
grant unlimited tablespace to HUB_SUMMER;
--撤销已经授予的权限
revoke connect from hub_summer;
revoke resource from hub_summer;
revoke create any table from hub_summer;
revoke create any view from hub_summer;
revoke create session from hub_summer;
revoke drop any table from hub_summer;
revoke drop any view from hub_summer;
revoke execute any procedure from hub_summer;
revoke insert any table from hub_summer;
revoke select any table from hub_summer;
revoke update any table from hub_summer;
revoke delete any table from hub_summer;
revoke unlimited tablespace from hub_summer;

1.2.2 授权访问表权限

场景:用户HUB_SPRING的表T_USER_STAT,分配SELECT 权限给用户HUB_SUMMER。

--授权SQL
GRANT SELECT  ON T_USER_STAT TO HUB_SUMMER;
--查询赋权结果
SELECT *
  FROM all_tab_privs aa
 WHERE aa.grantor = 'HUB_SPRING'
   AND aa.table_name = 'T_USER_STAT';
--在HUB_SUMMER中使用
SELECT * FROM HUB_SUMMER.T_USER_STAT;

1.2.3 撤销访问表权限

场景:用户HUB_SPRING的表T_USER_STAT,撤销已经分配给用户HUB_SUMMER的SELECT 权限。

--撤销授权SQL
REVOKE  SELECT ON T_USER_STAT FROM HUB_SUMMER;
--查询赋权结果
SELECT *
  FROM all_tab_privs aa
 WHERE aa.grantor = 'HUB_SPRING'
   AND aa.table_name = 'T_USER_STAT';
--在HUB_SUMMER中使用
SELECT * FROM HUB_SUMMER.T_USER_STAT;

1.3 删除用户

场景:在项目下线,用户无需保留场景。

--删除用户
drop user HUB_SPRING cascade

1.4 Oracle的IP、VIP、SCAN IP

场景:在规划数据库时需要了解;在一些安全级别高的生产环境,系统之间相互访问有多重防火墙情况,因此,涉及系统之间开通防火墙和端口访问的权限事项,此刻就需搞清楚开防火墙清单中该提供哪些IP和端口。

在集群部署时,例如本例:

在使用时,组装连接信息如下即可。

使用PL/SQL工具:168.59.80.60:1521/hubdb

使用Java代码:jdbc:oracle:thin:@168.59.80.60:1521/hubdb

主机IP:Oracle数据库实际安装的物理机地址。

VIP:每个节点都有一个虚拟IP,即VIP。VIP是浮动的,而IP是固定的。例如,本例3个节点都正常运行时,每个节点都会有一个虚拟IP。当一个节点宕机时,这个节点的VIP会被转移到其它未宕机且可用的节点上。

SCAN IP:理解成负载均衡地址,在配置文件中,使用SCAN IP,就可以顺畅使用数据库。

以上,具体原来,需移步Oracle官网。

1.5 常规使用场景

场景:为高效使用Oracle,建议了解这些基础套路和招数。

1.5.1 查看版本

场景:在异构系统交互时,需提前调研清楚,双方系统版本是否满足需求,特别是有些在运系统不变的情况下,只能建设中的系统取适配这些在运系统。

查看数据库版本SQL:

--查看数据库版本
select * from v$version;
select banner from sys.v_$version;
select * from product_component_version;

1.5.2 查看实例

场景:在配置数据源时,需要调研清楚实例名称。

查看数据库实例SQL:

--查看数据库版本
select name from v$database;
select instance_name from v$instance;
show parameter instance;

1.5.3 查看数据库用户信息

场景:使用DBA权限账号,常看数据库用户信息,便于了解数据库整体情况。

查看数据库用户信息SQL,包括用户名称、用户创建时间、用户状态、用户默认表空间等信息。

--查看用户信息(全量信息)
select * from dba_users;
--查看用户信息(部分信息)
select * from all_users;
--查看用户信息(当前用户信息)
select * from user_users;

1.5.4 查看数据库角色和权限

场景:为了方便给指定用户分配权限。

查看查看数据库角色和权限。

--查看数据库角色
select * from dba_roles;
--查看数据库角色的特权
select * from dba_sys_privs;
--查看当前用户特权
select * from user_sys_privs;

1.5.5 查看用户对象(表)权限

场景:查看用户对象(表)权限。

select * from dba_tab_privs;
select * from all_tab_privs;
select * from user_tab_privs;

1.5.6 查看用户拥有的角色

场景:查看用户拥有的角色。

select * from dba_role_privs;
select * from user_role_privs;

1.5.7 查看数据库对象信息

场景:查看数据库对象信息,包括表、视图、索引、分区、等。

--查看数据库中对象信息
select * from dba_objects;
--查看指定用户表信息
select *
  from dba_objects aa
 where aa.owner = 'HUB_SPRING'
   and aa.object_type = 'TABLE'
 order by created desc;
--查看指定用户视图信息
 select *
  from dba_objects aa
 where aa.owner = 'HUB_SPRING'
   and aa.object_type = 'VIEW'
 order by created desc;
--查看数据库对象类型
select aa.object_type, count(1)
  from dba_objects aa
 group by aa.object_type;

1.5.8 查看表的字段和注释

场景:查看数据库表字段和注释。

--查看表字段信息(字段名称,类型等)
select * from user_tab_columns where table_name = 'T_SENSOR_DATA_GLOBAL';
--查看表字段注释
select * from user_tab_comments where table_name='T_SENSOR_DATA_GLOBAL'

1.5.9 查看数据库所有表

场景:查看数据库所有表.

--查看指定用户表信息
select *
  from dba_objects aa
 where aa.owner = 'HUB_SPRING'
   and aa.object_type = 'TABLE'
 order by created desc;
--所有用户的表
select * from all_tables;
--包括系统表
select * from dba_tables;
--当前用户的表
select * from user_tables;

1.5.10 查看数据库所有Jobs

场景:查看数据库所有Job定时任务。

--查看Job定时任务
select * from dba_scheduler_jobs;
--查看Job定时任务(当前用户)
select * from user_scheduler_jobs;

2.表空间和数据文件

在Oracle数据库,根据业务的数据规模规划表空间,方便管理。创建一个表空间会对应一个数据文件,当表空间指向的数量大于表空间已有数据文件最大值时,则需拓展表空间对应的数据文件。否则会出现表空间不足报错,而且数据也无法写入。通常,一个表空间会对应多个数据文件,随着数据规模递增,表空间对应的数据文件数量也会成正比增加。

2.1 查看表空间和数据文件

场景:在创建表空间前,先查看Oracle数据库已经存在的表空间的数据文件路径,拷贝出这个路径。在创建表空间和数据文件时,就根据这个路径去规划表空间的数据文件。这样也可以确保路径正确和表空间名称不重复。

-- 查看表空间数据文件
SELECT * FROM DBA_DATA_FILES;

例如:USERS表空间数据文件路径如下。

单机部署Oracle:

/opt/oracle/datafile/users01.dbf

集群部署Oracle:

+DATA/oracle/datafile/users01.dbf

2.2 表空间和数据文件(单机版)

场景:在Oracle数据库单机部署情况下,创建表空间和扩展表空间的数据文件使用绝对路径。

2.2.1 创建表空间和数据文件

场景

表空间名称:DATA_HUB

数据文件绝对路径:/opt/oracle/datafile/DATA_HUB01.dbf

执行SQL:

-- 创建表空间数据文件
CREATE TABLESPACE DATA_HUB DATAFILE '/opt/oracle/datafile/DATA_HUB01.dbf' SIZE 4096M AUTOEXTEND ON next 32M;

2.2.2 扩展表空间和数据文件

场景

表空间名称:DATA_HUB

数据文件绝对路径:/opt/oracle/datafile/DATA_HUB02.dbf

执行SQL:

-- 拓展表空间数据文件
ALTER TABLESPACE DATA_HUB ADD DATAFILE '/opt/oracle/datafile/DATA_HUB02.dbf' SIZE 4096M AUTOEXTEND ON next 32M;

2.3 表空间和数据文件(集群版)

场景:在Oracle数据库集群部署情况下,创建表空间和扩展表空间的数据文件使用相对路径。

2.3.1 创建表空间和数据文件

表空间名称:DATA_HUB

数据文件路径:+DATA/oracle/datafile/DATA_HUB01.dbf

执行SQL:

-- 创建表空间数据文件
CREATE TABLESPACE DATA_HUB DATAFILE '+DATA/oracle/datafile/DATA_HUB01.dbf' SIZE 4096M AUTOEXTEND ON next 32M;  

2.3.2 扩展表空间和数据文件

表空间名称:DATA_HUB

数据文件路径:+DATA/oracle/datafile/DATA_HUB02.dbf

执行SQL:

-- 拓展表空间数据文件
ALTER TABLESPACE DATA_HUB ADD DATAFILE '+DATA/oracle/datafile/DATA_HUB02.dbf' SIZE 4096M AUTOEXTEND ON next 32M;

3.序列

场景:使用Oracle的序列,生产一个不重复的唯一值。包括创建序列、使用序列、修改序列、删除序列。

-- 1.创建序列
create sequence SEQ_HUB_ID
minvalue 1
maxvalue 9999999999
start with 10000000
increment by 1
cache 1000;
-- 2.1使用序列-获取下一个序列值
select SEQ_HUB_ID.NEXTVAL from dual;
-- 2.2使用序列-获取当前序列值
select SEQ_HUB_ID.CURRVAL from dual;
-- 3.修改序列值
ALTER SEQUENCE SEQ_HUB_ID MAXVALUE 99999999998 MINVALUE 199;
-- 4.删除序列
DROP SEQUENCE SEQ_HUB_ID;

4.表结构

Oracle数据库表结构,主要包括建表关键字、表名、字段名称、字段类型、字段注释、表注释、主键约束、索引、分区等。

常见字段类型:NUMBER(12,6),整数值;NUMBER(12,6),带小时点的值;DATE,时间值;VARCHAR2(16),字符串值。

4.1创建普通表

4.1.1创建普通表(默认表空间)

场景:创建普通表,使用默认表空间。

create table T_SENSOR_DATA ( 
  ID  NUMBER(16) not null ,
  REGION  VARCHAR2(8),
  VALUE1  NUMBER(16,2),
  VALUE2  NUMBER(16,2)
 );
comment on table  T_SENSOR_DATA is '传感器数据';
comment on column T_SENSOR_DATA.ID is '实体唯一标识';
comment on column T_SENSOR_DATA.REGION is '区域';
comment on column T_SENSOR_DATA.VALUE1 is '取值1';
comment on column T_SENSOR_DATA.VALUE2 is '取值2';
alter table  T_SENSOR_DATA add constraint PK_T_SENSOR_DATA_ID primary key (ID);
create index  IDX_T_SENSOR_DATA_REGION on T_SENSOR_DATA (REGION);

4.1.2创建普通表(指定表空间)

场景:创建普通表-指定表空间。

create table T_SENSOR_DATA ( 
  ID  NUMBER(16) not null ,
  REGION  VARCHAR2(8),
  VALUE1  NUMBER(16,2),
  VALUE2  NUMBER(16,2)
 ) tablespace DATA_HUB;
comment on table  T_SENSOR_DATA is '传感器数据';
comment on column T_SENSOR_DATA.ID is '实体唯一标识';
comment on column T_SENSOR_DATA.REGION is '区域';
comment on column T_SENSOR_DATA.VALUE1 is '取值1';
comment on column T_SENSOR_DATA.VALUE2 is '取值2';
alter table  T_SENSOR_DATA add constraint PK_T_SENSOR_DATA_ID primary key (ID) using index 
  tablespace DATA_HUB;
create index  IDX_T_SENSOR_DATA_REGION on T_SENSOR_DATA (REGION) using index 
  tablespace DATA_HUB ;

4.2创建分区表

Oracle分区表的索引可以分为本地索引和全局索引两种。全局索引,指向指定的表空间。局部索引,指向分区表的分区。主要本地索引关键字local,只是针对分区表,才能使用。

4.2.1创建分区表(全局索引)

场景:创建分区表,使用全局索引。

create table T_SENSOR_DATA_GLOBAL
(
  id            NUMBER(12) not null,
  gather_date   DATE not null,
  position_dir  NUMBER(2) not null,
  gather_time   DATE,
  t1        NUMBER(12,2),
  t2        NUMBER(12,2),
)
partition by range (GATHER_DATE)
(
  partition T20210701 values less than 
   (TO_DATE(' 2021-07-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace DATA_HUB,
  partition T20210702 values less than 
   (TO_DATE(' 2021-07-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace DATA_HUB
  );
comment on table T_SENSOR_DATA_GLOBAL is 'T_SENSOR_DATA_GLOBAL';
comment on column T_SENSOR_DATA_GLOBAL.id is '唯一标识';
comment on column T_SENSOR_DATA_GLOBAL.gather_date is '日期';
comment on column T_SENSOR_DATA_GLOBAL.position_dir is '位置';
comment on column T_SENSOR_DATA_GLOBAL.gather_time is '时间';
comment on column T_SENSOR_DATA_GLOBAL.t1 is '值1';  
comment on column T_SENSOR_DATA_GLOBAL.t2 is '值1';  
--主键
alter table T_SENSOR_DATA_GLOBAL
  add constraint PK_T_SENSOR_DATA_GLOBAL primary key (ID,GATHER_DATE, POSITION_DIR) using index tablespace DATA_HUB;
--索引
create index IDX_T_SENSOR_DATA_GLOBAL_ID on T_SENSOR_DATA_GLOBAL (ID,GATHER_DATE, T1) tablespace DATA_HUB;

4.2.2创建分区表(本地索引)

场景:创建分区表,使用本地索引。

create table T_SENSOR_DATA_LOCAL
(
  id            NUMBER(12) not null,
  gather_date   DATE not null,
  position_dir  NUMBER(2) not null,
  gather_time   DATE,
  t1        NUMBER(12,2),
  t2        NUMBER(12,2),
)
partition by range (GATHER_DATE)
(
  partition T20210701 values less than 
   (TO_DATE(' 2021-07-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace DATA_HUB,
  partition T20210702 values less than 
   (TO_DATE(' 2021-07-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace DATA_HUB
  );
comment on table T_SENSOR_DATA_LOCAL is 'T_SENSOR_DATA_LOCAL';
comment on column T_SENSOR_DATA_LOCAL.id is '唯一标识';
comment on column T_SENSOR_DATA_LOCAL.gather_date is '日期';
comment on column T_SENSOR_DATA_LOCAL.position_dir is '位置';
comment on column T_SENSOR_DATA_LOCAL.gather_time is '时间';
comment on column T_SENSOR_DATA_LOCAL.t1 is '值1';  
comment on column T_SENSOR_DATA_LOCAL.t2 is '值1';  
--主键
alter table T_SENSOR_DATA_LOCAL
  add constraint PK_T_SENSOR_DATA_LOCAL primary key (ID, GATHER_DATE, POSITION_DIR)
  using index 
  local ;
--索引
create index IDX_T_SENSOR_DATA_LOCAL_ID on T_SENSOR_DATA_LOCAL (ID, GATHER_DATE, T1)
  local ;

4.3删除表

场景:删除表,即删除物理表。

drop table t_sensor_data_local;

4.4添加主键(单个字段和多个字段)

场景:单个字段添加主键约束和联合主键。

-- 单字段主键
alter table T_SENSOR_DATA_GLOBAL
  add constraint PK_T_SENSOR_DATA_GLOBAL primary key (ID) using index tablespace DATA_HUB;
-- 联合主键
alter table T_SENSOR_DATA_GLOBAL
  add constraint PK_T_SENSOR_DATA_GLOBAL primary key (ID,GATHER_DATE, POSITION_DIR) using index tablespace DATA_HUB;

4.5添加索引(单个字段和多个字段)

场景:单个字段添加索引和联合索引。

-- 联合索引
create index IDX_T_SENSOR_DATA_GLOBAL_ID on 
T_SENSOR_DATA_GLOBAL (ID,GATHER_DATE, T1) tablespace DATA_HUB;
-- 单字段索引
create index IDX_T_SENSOR_DATA_GLOBAL_ID on T_SENSOR_DATA_GLOBAL (ID) tablespace DATA_HUB;

4.6全局索引局部索引

Oracle分区表的索引可以分为本地索引和全局索引两种。全局索引,指向指定的表空间。局部索引,指向分区表的分区。主要本地索引关键字local,只是针对分区表,才能使用。

场景:查看表索引信息、分区信息。

--查看索引信息(全量)
select * from dba_indexes;
--查看索引信息(根据表名)
select * from dba_indexes where table_name = 'T_SENSOR_DATA_LOCAL';
--查看分区表索引信息(根据用户)
select * from dba_ind_partitions  where index_owner='HUB_SPRING';
--查看分区表索引信息(根据用户)
select * from dba_part_indexes  where owner='HUB_SPRING';
--查看当前用户的分区索引
select * from user_part_indexes;

4.7查看表分区

场景:分区表,查看具体分区。

--查看表的分区
select * from dba_tab_partitions;
--查看表的分区(根据表名)
select * from dba_tab_partitions where table_name='T_SENSOR_DATA_LOCAL';

5.操作表

场景:常规操作表包括 insert、select、update、delete、truncate。truncate 整个表时,所有的索引都不会失效。truncate 某个分区时,全局索引都会失效,需要添加 update global indexes。

SELECT * FROM T_SENSOR_DATA;
--插入一条数据
INSERT INTO T_SENSOR_DATA (ID,REGION,VALUE1,VALUE2) VALUES(20220708,'A',22.78,8.59);
--更新一条数据
UPDATE T_SENSOR_DATA SET  VALUE1=23.78 WHERE ID=20220708;
--查询一条数据
SELECT * FROM T_SENSOR_DATA WHERE ID=20220708;
--删除一条数据
DELETE FROM T_SENSOR_DATA WHERE ID=20220708;
--清空表
TRUNCATE TABLE T_SENSOR_DATA;
--清空分区表数据,并更新全局索引
alter table T_SENSOR_DATA_GLOBAL truncate partition T20210702 update global indexes;
--清空分区表数据,局部索引的分区表无需更新
alter table T_SENSOR_DATA_LOCAL truncate partition T20210702;

6.视图

视图,可以理解成就是一条查询SQL语句,用于显示一个或多个表或其它视图中的相关数据。

场景:只需要查询数据时,把SQL创建为视图,即可以方便使用。

--创建视图,前提t_sensor_data表要存在
create or replace force view view_t_sensor_data as
select * from t_sensor_data;
--使用视图
select * from view_t_sensor_data;
--删除视图
drop view view_t_sensor_data;

7.同义词(synonym)

Oracle同义词,是其对象(例如表、实体、存储过程、函数、包、序列)的别名。

场景:用户HUB_SPRING有一张表t_sensor_data,对用户HUB_SUMMER针对这张表建立一个同义词,那么在用户HUB_SUMMER中可以像在用户HUB_SPRING中使用表t_sensor_data。

--创建同义词(在用户hub_spring中操作)
--用户hub_spring的表,以同义词的方式,给用户hub_summer使用
create  synonym hub_summer.t_sensor_data for hub_spring.t_sensor_data;
--删除同义词(在hub_spring中操作)
drop synonym hub_summer.t_sensor_data;
--使用同义词(在用户中hub_summer使用)
select * from t_sensor_data;
--查看同义词
select *
  from dba_synonyms
 where table_owner = 'HUB_SPRING'
   AND table_name = 'T_SENSOR_DATA';
--如果一个用户没有创建同义词权限,可以高权限用户创建比如
--hub_summer用户的表t_sensor_data在hub_spring用户创建同义词
create  synonym hub_spring.t_sensor_data for hub_summer.t_sensor_data;  
--赋予可以创建同义词权限
--给hub_summer用户赋权可以创建同义词
grant create any synonym to hub_summer;
--撤销hub_summer用户创建同义词的权限
revoke create any synonym from hub_summer;

8.触发器

场景:Oracle触发器,在执行某个操作时,触发另一个操作。比如,在表t_sensor_data插入一条数据时,此表的ID会自动写入一个值。这个值就是触发器生成的。

--1.创建一个表
create table t_sensor_data
(
  data_id     NUMBER(20) not null,
  value1 NUMBER(16,2),
  value2 NUMBER(16,2)
);
--2.创建一个序列
create sequence seq_log_id
minvalue 1
maxvalue 9999999999999999
start with 20220708
increment by 1
cache 1000;
--3.创建触发器
create or replace trigger t_sensor_data_insert_data_id
  before insert on t_sensor_data
  for each row
begin
  select seq_log_id.Nextval into :new.data_id from dual;
end;
--4.测试验证,data_id会自动赋值
insert into t_sensor_data(value1,value2) VALUES(22.51,23.52);
--删除触发器
drop trigger t_sensor_data_insert_data_id;

9.Database Link

Oracle的Database Link提供了一个非常有效的方案取访问另一个数据库的信息。正因为高效遍历,也被认为是一个不安全的方式。

场景:在HUB_SPRING中使用DB Link访问HUB_SUMMER,那么在HUB_SPRING中创建DB Link即可。

9.1创建DB Link(单节点)

场景:单节点创建Database Link。

create  database link DEMO_02
  connect to HUB_SUMMER IDENTIFIED BY "***自定义的密码****"
  using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 168.59.80.60)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = hubdb))
)';	

9.2创建DB Link(多节点)

场景:多节点创建Database Link。

create database link DEMO_01
  connect to HUB_SUMMER  IDENTIFIED BY "***自定义的密码****"
  using '(DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 168.59.80.61)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 168.59.80.62)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 168.59.80.63)(PORT = 1521))
    (LOAD_BALANCE = yes)
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = hubdb)
      (FAILOVER_MODE =
        (TYPE = SELECT)
        (METHOD = BASIC)
        (RETRIES = 180)
        (DELAY = 5))))';

9.3使用DB Link

使用DB Link,在HUB_SPRING中使用DB Link访问HUB_SUMMER的表t_sensor_data。

select * from hub_summer.t_sensor_data@demo_01;

10.存储过程

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来调用存储过程。也可以在Job进行配置成为定时任务,即在指定时间执行相应业务。

引用:https://blog.csdn.net/zhangbeizhen18/article/details/100088094

引用:https://blog.csdn.net/zhangbeizhen18/article/details/100088152

10.1创建存储过程

场景:创建存过程,带入参和不带入参。

--存储过程(不带入参)
CREATE OR REPLACE PROCEDURE PRO_INSERT_INFO IS
BEGIN
  INSERT INTO B_LOG_INFO
    SELECT SEQ_DEMO_ID.NEXTVAL,
           SYSDATE,
           SYSDATE,
           '1',
           '执行成功',
           50,
           'DUAL'
      FROM DUAL;
  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
END PRO_INSERT_INFO;
--存储过程(带入参)
CREATE OR REPLACE PROCEDURE PRO_INSERT_INFO_ARGS(IN_DATE IN VARCHAR2 := NULL) IS
BEGIN
  -- 1.声明变量
  DECLARE
    V_DATE DATE := TRUNC(SYSDATE - 1);
  BEGIN
    -- 2.记录一条日志
    IF (IN_DATE IS NOT NULL) THEN
      V_DATE := TO_DATE(IN_DATE, 'YYYYMMDD');
    END IF;
	-- 3.处理业务逻辑
    INSERT INTO B_LOG_INFO
      SELECT SEQ_DEMO_ID.NEXTVAL,
             V_DATE,
             SYSDATE,
             '1',
             '执行成功',
             50,
             'DUAL'
        FROM DUAL;
    COMMIT;
	-- 4.更新日志(记录业务成功状态)
  EXCEPTION
    WHEN OTHERS THEN
	-- 5.更新日志(记录业务异常状态)
    ROLLBACK;
  END;
END PRO_INSERT_INFO_ARGS;

10.2 Packages和Packages bodies

场景:使用Packages和Packages bodies管理存储过程,可以模块化管理存储过程和增加SQL代码的可读性。

10.2.1创建Packages和Packages bodies

--1.创建包(Packages)
CREATE OR REPLACE PACKAGE PKG_ZBZ_PORTAL IS
END PKG_ZBZ_PORTAL;
--2.创建包体(Packages bodies)
CREATE OR REPLACE PACKAGE BODY PKG_ZBZ_PORTAL IS		
END PKG_ZBZ_PORTAL;

10.2.2 Packages

把存储过程定义放在Packages中。

CREATE OR REPLACE PACKAGE PKG_ZBZ_PORTAL IS
  PROCEDURE PRO_INSERT_INFO_ARGS(IN_DATE IN VARCHAR2 := NULL,
        FLAG OUT NUMBER,
        FAIL_INFO OUT VARCHAR2);
END PKG_ZBZ_PORTAL;

10.2.3 Packages bodies

把存储过程实现放在Packages bodies中。

CREATE OR REPLACE PACKAGE BODY PKG_ZBZ_PORTAL IS
  PROCEDURE PRO_INSERT_INFO_ARGS(IN_DATE   IN VARCHAR2 := NULL,
        FLAG  OUT NUMBER,
        FAIL_INFO OUT VARCHAR2) IS
  BEGIN
    DECLARE
      V_DATE DATE := TRUNC(SYSDATE - 1);
    BEGIN
      FLAG      := 1;
      FAIL_INFO := '';
      IF (IN_DATE IS NOT NULL) THEN
        V_DATE := TO_DATE(IN_DATE, 'YYYYMMDD');
      END IF;
      INSERT INTO B_LOG_INFO
        SELECT SEQ_DEMO_ID.NEXTVAL,
               V_DATE,
               SYSDATE,
               '1',
               '执行成功',
               50,
               'DUAL'
          FROM DUAL;
      COMMIT;
    EXCEPTION
      WHEN OTHERS THEN
        FLAG      := 0;
        FAIL_INFO := '此次执行: ' || IN_DATE || ' 输出结果: FLAG = ' || FLAG ||
                     '异常信息:  ' || SQLERRM;
        ROLLBACK;
    END;
  END PRO_INSERT_INFO_ARGS;
END PKG_ZBZ_PORTAL;

11.Job

场景:在Oracle数据库中,业务需要以定时生成数据时,可以把存储过程配置成定时任务,使用Job配置定时调度任务,即实现业务自动化处理。

11.1创建Job

在PL/SQL Developer客户端中,登录当前用户。在默认在左侧对象窗口中。

11.1.1找到Users菜单

11.1.2找到Jobs菜单

在当前用户,左侧对象对话框,依次Users->HUB_SPRING->Objects->Jobs,如图:

11.1.3右键选中Jobs,点击:新建

右键选中Jobs,选中弹出菜单,点击新建。如图窗口:

11.1.4配置Job举例

例如,配置任务场景

要求一:从2022年7月9日开始,每天10点30分执行任务。

要求二:执行存储过程为包PKG_ZBZ_PORTAL中的存储过程PRO_INSERT_INFO_ARGS

要求三:业务名称:日志信息收集任务

Program/chain中的Action的SQL如下,其它配置如图:

Action的SQL:

DECLARE
  FLAG VARCHAR2(64);
  FAIL_INFO  VARCHAR2(4096);
BEGIN
  PKG_ZBZ_PORTAL.PRO_INSERT_INFO_ARGS(
    TO_CHAR(TRUNC(SYSDATE),'YYYYMMDD'),
    FLAG,
    FAIL_INFO);
END;

其它配置如图:

 以上,注意:Enabled必须勾选,生效后才能启动任务。

(4)点击:应用,即生效

生效后,在菜单:作业,中会有新建的Job任务。

11.2配置Job的Action几种配置

情况一:存储过程,不使用包管理,无参数。

情况二:存储过程,不使用包管理,有参数。

情况三:存储过程,使用包管理,无参数。

情况四:存储过程,使用包管理,有参数。

情况五:直接写SQL。

--情况一:存储过程,不使用包管理,无参数
BEGIN PRO_INSERT_INFO; END;
--情况二:存储过程,不使用包管理,有参数
BEGIN PRO_INSERT_INFO_ARGS(TO_CHAR(TRUNC(SYSDATE),'YYYYMMDD')); END;
--情况三:存储过程,使用包管理,无参数
BEGIN PKG_INSERT.PRO_INSERT_INFO; END;
--情况四:存储过程,使用包管理,有参数
DECLARE
  FLAG VARCHAR2(64);
  FAIL_INFO  VARCHAR2(4096);
BEGIN
  PKG_ZBZ_PORTAL.PRO_INSERT_INFO_ARGS(
    TO_CHAR(TRUNC(SYSDATE),'YYYYMMDD'),
    FLAG,
    FAIL_INFO);
END;
--情况五:直接写SQL
BEGIN
INSERT INTO B_LOG_INFO_A 
SELECT * FROM B_LOG_INFO_B
COMMIT;
END;

12.表分析

表分析,收集表和索引的信息,CBO(SQL优化器)根据这些信息决定SQL最佳的执行路径。对表的分析,可以产生一些统计信息,通过这些信息oracle的优化程序可以优化。

CBO: Cost-Based Optimization 基于代价的优化器.

场景一:对用户HUB_SPRING,非分区表T_SENSOR_DATA做表分析。

场景一:对用户HUB_SPRING,分区表T_SENSOR_DATA_GLOBAL,分区T20210701做表分析。

--表分析(非分区表)
begin
dbms_stats.gather_table_stats(
    ownname          => 'HUB_SPRING',
    tabname          => 'T_SENSOR_DATA',
    estimate_percent => 60,
    degree           => 30,
    cascade          => true,
	 no_invalidate    => false);
end;
--表分析(分区表)
begin
dbms_stats.gather_table_stats(
    ownname          => 'HUB_SPRING',
    tabname          => 'T_SENSOR_DATA_GLOBAL',
    partname         => 'T20210701',
    estimate_percent => 60,
    degree           => 30,
    granularity      => 'all',
    cascade          => true,
	no_invalidate    => false
	);
end;

以上,感谢

2022年7月9日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值