记录: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日