水电管理oracel学习笔记

安装

在这里插入图片描述
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);

猜你喜欢

转载自blog.csdn.net/Wendy_i/article/details/109337526