安装
Mumu0407
Mumu0407
Oracel
问题:
1、死锁
原因:产生了死锁
解决办法:https://blog.csdn.net/qq_34664202/article/details/80462254
2、表关系
原因:未找到
解决办法:使用sql语句
alter table 要添加外键的表
add constraint 外键别名(给这个外键取个名字 FK_表名)
foreign key (外键字段)
references 要连接的表名(父表)(父表的字段);
Oracle语句
1、查询
select <列名> from <表名> [where <查询条件表达试>] [order by <排序的列名>[asc或desc]]
select POWER_MAKE from ST_WATPOW_REP_DAILY where DAILY_ID=1;
1.1 插入里嵌套查询
insert into 要插入的表名(字段1,字段2)
select 字段1,字段2 from 表名;
2、分组函数
1、AVG - 平均
2、COUNT - 计数
3、MAX - 最大
4、MIN - 最小
5、SUM - 求和
SELECT AVG(POWER_MAKE)*/SUM(POWER_MAKE)/MAX(POWER_MAKE)/MIN(POWER_MAKE)/COUNT(POWER_MAKE)*
FROM ST_WATPOW_REP_DAILY;
2.1按月合计
select SUM(POWER_MAKE)
from ST_WATPOW_REP_DAILY
where DAILY_DATE between to_date('2020-10-01','yy-mm-dd') and to_date('2020-10-31','yy-mm-dd');
3、添加外键
alter table 要添加外键的表
add constraint 外键别名(给这个外键取个名字 FK_表名)
foreign key (外键字段)
references 要连接的表名(父表)(父表的字段);
4、 视图
4.1、作用
基于多表的预定义查询,这些被查的表称为基表
可以通过视图对基表进行DML(数据管理语言)操作
在视图中检索信息与从基表中检索信息方法完全相同
注意:视图不存在数据,算是个虚表,视图只会访问基表的行
适用于:检查检索数据
优点:
限制用户只能通过视图检索数据,使用户看不到底层基表
将复杂查询编写为视图,降低sql的复杂性
限制用户只能访问基表的部分数据,实现安全性
4.2、视图的使用
创建:
create view shitu
as select DAILY_ID,DAILY_DATE,SUM(POWER_MAKE) from ST_WATPOW_REP_DAILY;
出现错误:使用了分组函数sum
正确:create view shitu2 as select DAILY_ID,DAILY_DATE,POWER_MAKE from ST_WATPOW_REP_DAILY where DAILY_ID<10;
删除:drop view 视图名;
5、陌生函数
5.1 NVL函数
nvl(e1, e2)
如果 e1 的计算结果为 null 值,则 NVL( ) 返回 e2。如果 e1 的计算结果不是 null 值,则返回 e1。e1 和 e2 可以是任意一种数据类型。如果 e1 与 e2 的结果皆为 null 值,则 NVL( ) 返回 .NULL.。
5.2 group by rollup
group by 后带 rollup 子句的功能可以理解为:先按一定的规则产生多种分组,然后按各种分组统计数据,另外group by 后带 rollup 子句所返回的结果集,可以理解为各个分组所产生的结果集的并集且没有去掉重复数据。
5.3日期函数
日期转换:to_date(‘要转换的日期’,‘yy-mm-dd hh-mm-ss’)
select DAILY_ID,sum(POWER_MAKE),MACHINE_INFO
from ST_WATPOW_REP_DAILY where DAILY_DATE
between to_date('2020-10-01','yy-mm-dd') and to_date('2020-10-31','yy-mm-dd') group by POWER_MAKE;
6、包、包体
6.1关系
1.包(Package):Oracle中的包是用来在数据库中对函数和过程进行分类的(近似于JAVA中的接口),包中的函数和过程都只需进行声明,不用给出具体的操作语句(近似于JAVA中抽象方法).
2.包体(Package body):只有包,我们是不能操作包中的函数和过程的,应为他们都没有给出具体的实现语句,所以如果要使用包中的函数和过程的话,就需要将其实例化成一个包体,将里面的函数和过程具体化(相当于JAVA中建立一个类去实现一个接口,重写其中的方法).
6.2创建
create or replace package bao is
-- Author : MUMU
-- Created : 2020/10/29 16:42:24
-- Purpose :
-- Public type declarations 公共类型申明
type <TypeName> is <Datatype>;
-- Public constant declarations
<ConstantName> constant <Datatype> := <Value>;
-- Public variable declarations 公共变量申明
<VariableName> <Datatype>;
-- Public function and procedure declarations
function <FunctionName>(<Parameter> <Datatype>) return <Datatype>;
end bao;
create or replace package body baoti is
-- Private type declarations
type <TypeName> is <Datatype>;
-- Private constant declarations
<ConstantName> constant <Datatype> := <Value>;
-- Private variable declarations
<VariableName> <Datatype>;
-- Function and procedure implementations
function <FunctionName>(<Parameter> <Datatype>) return <Datatype> is
<LocalVariable> <Datatype>;
begin
<Statement>;
return(<Result>);
end;
begin
-- Initialization
<Statement>;
end baoti;
7 触发器
7.1作用
触发器是通过这个“触发事件”来执行的(而存储过程的调用或执行是由用户或应用程序进行的)。能够引起触发器运行的操作被称为“触发事件”,如执行DML语句(使用INSERT、UPDATE、DELETE语句对表或视图执行数据处理操作);执行DDL语句(CREATE、ALTER、DROP语句在数据库中创建、修改、删除模式对象);引发数据库系统事件(如系统启动或退出、产生异常错误等);引发用户事件(如登录或退出数据库操作)。
7.2语法格式
create or replace trigger INSERT_Test
after insert
on onetest
for each row
declare
-- local variables here定义参数
begin
--触发语句
;
end INSERT_Test;
7.3类型
语句级、行级、替换、用户事件、系统事件
8、过程
8.1游标
1.声明游标
在DECLEAR部分按以下格式声明游标:
CURSOR 游标名[(参数1 数据类型[,参数2 数据类型…])]
IS SELECT语句;
参数是可选部分,所定义的参数可以出现在SELECT语句的WHERE子句中。如果定义了参数,则必须在打开游标时传递相应的实际参数。
SELECT语句是对表或视图的查询语句,甚至也可以是联合查询。可以带WHERE条件、ORDER BY或GROUP BY等子句,但不能使用INTO子句。在SELECT语句中可以使用在定义游标之前定义的变量。
2.打开游标
在可执行部分,按以下格式打开游标:
OPEN 游标名[(实际参数1[,实际参数2…])];
打开游标时,SELECT语句的查询结果就被传送到了游标工作区。
3.提取数据
在可执行部分,按以下格式将游标工作区中的数据取到变量中。提取操作必须在打开游标之后进行。
FETCH 游标名 INTO 变量名1[,变量名2…];
或
FETCH 游标名 INTO 记录变量;
游标打开后有一个指针指向数据区,FETCH语句一次返回指针所指的一行数据,要返回多行需重复执行,可以使用循环语句来实现。控制循环可以通过判断游标的属性来进行。
下面对这两种格式进行说明:
第一种格式中的变量名是用来从游标中接收数据的变量,需要事先定义。变量的个数和类型应与SELECT语句中的字段变量的个数和类型一致。
第二种格式一次将一行数据取到记录变量中,需要使用%ROWTYPE事先定义记录变量,这种形式使用起来比较方便,不必分别定义和使用多个变量。
定义记录变量的方法如下:
变量名 表名|游标名%ROWTYPE;
其中的表必须存在,游标名也必须先定义。
4.关闭游标
CLOSE 游标名;
显式游标打开后,必须显式地关闭。游标一旦关闭,游标占用的资源就被释放,游标变成无效,必须重新打开才能使用。
8.2创建过程
create or replace procedure P_getDates(S_RQ date,RE out sys_refcursor)
as --输入输出存储过程
begin
open RE for
select f.站点名称,g.当日,f.月累
from
(select nvl(s.DEPARTMENT,'油田发电量合计') as 站点名称, /* e.attr_set_id,*/sum(e.input_value) as 月累
from ST_WATPOW_REP_ELEC_ATTR_SET s,ST_WATPOW_REP_DAILY d,ST_WATPOW_REP_ART_INP_ACT_ELEC e
where d.daily_id=e.daily_id and d.daily_date=S_RQ and s.attr_set_id=e.attr_set_id and s.SET_ATTR='发电' --or */replace(s.SET_ATTR,chr(9),'')='外购'
group by rollup(s.DEPARTMENT)--, e.attr_set_id
) f left join
(select c.department as department,a.attr_set_id as attr_set_id,a.input_value as 当日
from ST_WATPOW_REP_ART_INP_ACT_ELEC a,ST_WATPOW_REP_DAILY b ,ST_WATPOW_REP_ELEC_ATTR_SET c
where a.daily_id=b.daily_id and b.daily_date=S_RQ and c.set_attr='发电' and c.attr_set_id=a.attr_set_id
order by a.attr_set_id) g on f.站点名称 = g.department;
close RE;
end P_getDates;
9 、同义词
类似于别名,是一种映射关系。可以多个用户用一张表。
10、数据库备份与恢复
备份
在命令行中输入命令:
EXP username/userpassword@orcl file=D:\201806041148.dmp tables=(tableName1,tableName2)
命令详细如下:
username:数据库用户名(必须)
userpassword:数据库用户密码(必须)
orcl:需备份的数据库的服务标识名(必须)
file:备份文件的全路径名称,可根据需要修改(必须)
tables:可填写需备份的表名,多个以‘,’分隔(可选)
恢复
在命令行中输入命令
imp username/userpassword@orcl file=D:\201806041148.dmp tables=(tableName1,tableName2) FULL=Y
命令详细如下:
username:数据库用户名(必须)
userpassword:数据库用户密码(必须)
orcl:需恢复的数据库的服务标识名(必须)
file:备份文件的全路径名称,可根据需要修改(必须)
tables:可填写需备份的表名,多个以‘,’分隔(可选)
FULL:FULL=Y,表示恢复备份中的所有数据,(可选)
11、实践代码:
11.1表一:
发电量统计:
select f.站点名称,g.当日,f.月累
from
(select nvl(s.DEPARTMENT,'油田发电量合计') as 站点名称, /* e.attr_set_id,*/sum(e.input_value) as 月累
from ST_WATPOW_REP_ELEC_ATTR_SET s,ST_WATPOW_REP_DAILY d,ST_WATPOW_REP_ART_INP_ACT_ELEC e
where d.daily_id=e.daily_id and d.daily_date between to_date('2020-10-01','YYYY-MM-DD') and to_date('2020-10-29','YYYY-MM-DD')
and s.attr_set_id=e.attr_set_id and s.SET_ATTR='发电' --or */replace(s.SET_ATTR,chr(9),'')='外购'
group by rollup(s.DEPARTMENT)--, e.attr_set_id
) f left join
(select c.department as department,a.attr_set_id as attr_set_id,a.input_value as 当日
from ST_WATPOW_REP_ART_INP_ACT_ELEC a,ST_WATPOW_REP_DAILY b ,ST_WATPOW_REP_ELEC_ATTR_SET c
where a.daily_id=b.daily_id and b.daily_date=to_date('2020-10-27','YYYY-MM-DD') and c.set_attr='发电' and c.attr_set_id=a.attr_set_id
order by a.attr_set_id) g on f.站点名称 = g.department
11.2 过程
创建:
create or replace procedure P_ST_WATPOW_REP_DAILY(Name in out type, Name in out type, ...) is
begin
end P_ST_WATPOW_REP_DAILY;
create or replace procedure getDates(S_RQ date,RE out sys_refcursor)
as
begin
end getDates;
在测试存储过程时,出现ORA-24338错误,将关闭游标的语句删除之后即可正常运行。
create or replace procedure P_getDates(S_RQ date,RE out sys_refcursor)
as
begin
open RE for
select f.站点名称,g.当日,f.月累
from
(select nvl(s.DEPARTMENT,'油田发电量合计') as 站点名称, /* e.attr_set_id,*/sum(e.input_value) as 月累
from ST_WATPOW_REP_ELEC_ATTR_SET s,ST_WATPOW_REP_DAILY d,ST_WATPOW_REP_ART_INP_ACT_ELEC e
where d.daily_id=e.daily_id and d.daily_date=S_RQ and s.attr_set_id=e.attr_set_id and s.SET_ATTR='发电' --or */replace(s.SET_ATTR,chr(9),'')='外购'
group by rollup(s.DEPARTMENT)--, e.attr_set_id
) f left join
(select c.department as department,a.attr_set_id as attr_set_id,a.input_value as 当日
from ST_WATPOW_REP_ART_INP_ACT_ELEC a,ST_WATPOW_REP_DAILY b ,ST_WATPOW_REP_ELEC_ATTR_SET c
where a.daily_id=b.daily_id and b.daily_date=S_RQ and c.set_attr='发电' and c.attr_set_id=a.attr_set_id
order by a.attr_set_id) g on f.站点名称 = g.department;
end P_getDates;
11.3 包、包体 含过程
包:
create or replace package SDGLTest is
-- Author : MUMU
-- Created : 2020/10/30 10:06:16
-- Purpose :
-- Public type declarations
--type <TypeName> is <Datatype>;
type cur is ref cursor;
-- Public constant declarations
--<ConstantName> constant <Datatype> := <Value>;
-- Public variable declarations
--<VariableName> <Datatype>;
S_RQ date;
-- Public function and procedure declarations
--function <FunctionName>(<Parameter> <Datatype>) return <Datatype>;
procedure P_getDates(S_RQ date,RE out sys_refcursor);
end SDGLTest;
包体:
create or replace package body SDGLTest is
procedure P_getDates(S_RQ date,RE out sys_refcursor) as
begin
open RE for
select f.站点名称,g.当日,f.月累
from (select nvl(s.DEPARTMENT,'油田发电量合计') as 站点名称, /* e.attr_set_id,*/sum(e.input_value) as 月累
from ST_WATPOW_REP_ELEC_ATTR_SET s,ST_WATPOW_REP_DAILY d,ST_WATPOW_REP_ART_INP_ACT_ELEC e
where d.daily_id=e.daily_id and d.daily_date=S_RQ and s.attr_set_id=e.attr_set_id and s.SET_ATTR='发电' --or */replace(s.SET_ATTR,chr(9),'')='外购'
group by rollup(s.DEPARTMENT)--, e.attr_set_id
) f left join
(select c.department as department,a.attr_set_id as attr_set_id,a.input_value as 当日
from ST_WATPOW_REP_ART_INP_ACT_ELEC a,ST_WATPOW_REP_DAILY b ,ST_WATPOW_REP_ELEC_ATTR_SET c
where a.daily_id=b.daily_id and b.daily_date=S_RQ and c.set_attr='发电' and c.attr_set_id=a.attr_set_id
order by a.attr_set_id) g on f.站点名称 = g.department;
end P_getDates;
end SDGLTest;
11.4 包体 存储过程建表一
未完成
insert into ONETEST(DEPARTMENT,INPUT_VALUE)
select s.department as DEPARTMENT,e.input_value as INPUT_VALUE
from ST_WATPOW_REP_ELEC_ATTR_SET s,ST_WATPOW_REP_ART_INP_ACT_ELEC e,ST_WATPOW_REP_DAILY d
where e.daily_id=d.daily_id and s.set_attr='外购' and s.attr_set_id=e.attr_set_id
order by e.attr_set_id;
insert into ONETEST(DEPARTMENT,INPUT_VALUE)
values ('测试',23333);