oracle的包、用户数据类型与内存表的实现

        最近在做的一个项目中,需要从UDP接收数据,数据记录了同样的点不同时间的值,然后每分钟定时将接收到的值更新到数据库中,但是接收数据的时间虽然在一分钟左右,但时间并不准确,如果UDP没有接收到数据,也必须将上次收到的数据再次提交给数据库,因此将接收数据和定时更新分开,接收数据和提交数据互不干涉。然而这么做问题来了,整个系统是建立在ORACLE库上的,而ORACLE是没有内存表的,如果在ORACLE中建表来保存数据,会对硬盘的频繁读写,时间长了容易出现硬盘坏道;如果在程序中保存,那么提交时必须采用循环整个数组,一次次地提交,效率上就会比较低。

       我考虑了两种方案,一种是采用在操作系统上建虚拟硬盘,然后再在虚盘上建立SQL server数据库,接收到的UDP数据直接发送到SQL server更新数据,然后再在ORACLE中建立一个从这个SQL server到ORACLE数据库的透明网关,定时从SQL server库中更新ORACLE库德数据。

        另外一种方法,就是使用包和用户数据类型来实现内存表,这样可以利用ORACLE本身的功能,而不用再去使用别的数据库服务,从效率上来说,也比较高。

        ORACLE库中表mytable结构为:

       MYINDEX                                            NUMBER
       SAVETIME                                           DATE
       MYVALUE                                            NUMBER

       首先,需要建立一个对象类型:

CREATE TYPE myobjtype AS OBJECT ( "MYINDEX " NUMBER, "MYNAME"  VARCHAR2(12), "MYVALUE" FLOAT     )

     然后根据这个对象类型来建立一个表类型:

CREATE TYPE mytabletype AS    TABLE OF myobjtype

    鉴于UDP接收时更新的需要,再建立一个对象类型用于更新:

CREATE TYPE mysetvalobjtype AS OBJECT ( "MYNAME" VARCHAR2(12),  "MYVALUE" FLOAT     )

然后建立一个程序包:

CREATE OR REPLACE  PACKAGE mytest is
 TESTNO mytabletype :=mytabletype ();
 Procedure setTESTNO(setval in mysetvalobjtype );
 Procedure ADDTESTNO(setval in myobjtype );
 function getTESTNO return mytabletype ;
end MYTEST;

建立包体:

CREATE OR REPLACE  PACKAGE BODY .""  is
 Procedure setTESTNO(setval in TESTNAMEVAL)
 is
   i number;
 begin
   for i in 1..TESTNO.count loop
     if TESTNO(i).MYNAME=setval.MYNAME then
       TESTNO(i).MYVALUE:=setval.MYVALUE;
     end if;
   end loop;
 end;
 
Procedure ADDTESTNO(setval in myobjtype )
 is
 begin
   TESTNO.extend;
   TESTNO(TESTNO.count):=setval;
 end;

  function getTESTNO return mytabletype 
 is
 begin
   return TESTNO;
 end;
end MYTEST;

        在这当中,TESTNO是保存数据的变量, ADDTESTNO是增加数据中成员的过程,setTESTNO是修改数据中成员的值的过程,getTESTNO是返回所有成员的函数,

       然后建一个程序来接收UDP(我使用的是C#),程序在开始向数据库写数据前要初始化,使用ADDTESTNO将变量的成员加进去,下面是初始化循环中的语句:

cmd.CommandText = "mytest.ADDTESTNO(TESTOBJTYPE(" + myindex.ToString() + ",/'" + myname + "/',0))";
cmd.ExecuteNonQuery();

其中myindex是循环中当前的数据对应的编号,myname 是当前的数据名称(UDP以它作为数据的标识)
然后是接收UDP数据后对变量成员的修改:

cmd.CommandText = "mytest.setTESTNO(TESTNAMEVAL(/'" +udpdataname + "/'," +udpdatavalue.ToString() + "))";
cmd.ExecuteNonQuery();
其中udpdataname 是从UDP中解析出来的名称,udpdatavalue是从UDP中解析出来的值。

最后就是每分钟定时修改数据了:

cmd.CommandText = "insert into testmemtable select MYINDEX,sysda,MYVALUE from table(mytest.gettestno)";
cmd.ExecuteNonQuery();

运行程序,程序就会定时将数据保存到数据库。

需要注意的是,写包变量和读包变量要在同一个程序,如果程序退出,变量TESTNO 中的内容也会被清掉,虽然在程序的生命周期中该变量可以当作全局的来使用,但是其它程序无法读取变量中的内容的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一部分 数据库体系结构 第1章 Oracle体系结构 1 1.1 数据库概述及实例 1 1.2 数据库 1 1.2.1 空间 2 1.2.2 文件 2 1.3 实例 3 1.4 数据库内部结构 3 1.4.1 、列和数据类型 4 1.4.2 约束条件 5 1.4.3 抽象数据类型 6 1.4.4 分区和子分区 7 1.4.5 用户 7 1.4.6 模式 8 1.4.7 索引 8 1.4.8 簇 9 1.4.9 散列簇 9 1.4.10 视图 9 1.4.11 序列 10 1.4.12 过程 10 1.4.13 函数 10 1.4.14 软件 11 1.4.15 触发器 11 1.4.16 同义词 12 1.4.17 权限及角色 12 1.4.18 数据库链接 13 1.4.19 段、盘区和块 14 1.4.20 回滚段 14 1.4.21 快照和显形图 14 1.5 内部存储结构 15 1.5.1 系统全局区 15 1.5.2 环境区 17 1.5.3 程序全局区 17 1.6 后台进程 18 1.7 外部结构 20 1.7.1 重做日志 20 1.7.2 控制文件 21 1.7.3 跟踪文件与警告日志 21 1.8 基本数据库实现 21 1.8.1 备份/恢复功能 22 1.8.2 安全性能 23 1.8.3 典型数据库逻辑设计 24 1.8.4 典型数据库物理设计 24 1.9 逻辑模型约定 25 1.9.1 一对一关系 25 1.9.2 一对多关系 26 1.9.3 多对多关系 26 1.10 创建数据库 27 1.10.1 修改创建模板的脚本文件 27 1.10.2 创建数据库后修改 MAXDATAFILES 27 1.10.3 使用OEM 28 第2章 硬件配置研究 30 2.1 结构概述 30 2.2 独立主机 31 2.2.1 磁盘阵列独立主机 31 2.2.2 磁盘镜像独立主机 34 2.2.3 多数据库独立主机 35 2.3 网络主机 36 2.3.1 数据库网络 37 2.3.2 远程更新:高级复制选项 39 2.3.3 集群服务器:Oracle并行服务器 40 2.3.4 多处理器:并行查询和并行装载 选项 41 2.3.5 客户机/服务器数据库应用 42 2.3.6 三层体系结构 43 2.3.7 Oracle透明网关访问 44 2.3.8 备用数据库 44 2.3.9 复制型数据库 45 2.3.10 外部文件访问 45 第3章 数据库逻辑设计 47 3.1 最终产品 47 3.2 优化软结构 47 3.2.1 起点:SYSTEM空间 47 3.2.2 分离应用程序数据段:DATA 48 3.2.3 分离应用程序索引段:INDEXES 48 3.2.4 分离工具段:TOOLS 49 3.2.5 分离回滚段:RBS 50 3.2.6 分离临时段:TEMP 50 3.2.7 分离用户:USERS 51 3.3 扩展OFA 51 3.3.1 分离低使用的数据段:DATA_2 51 3.3.2 分离低使用的索引段:INDEXS_2 52 3.3.3 分离工具索引:TOOLS_1 52 3.3.4 分离特殊回滚段:RBS_2 53 3.3.5 分离用户特殊临时段: TEMP_USER 53 3.3.6 附加的应用特殊OFA扩展 54 3.4 合理的逻辑设计 54 3.5 解决方案 55 第4章 数据库物理设计 57 4.1 数据库文件设计 57 4.1.1 数据文件间的I/O冲突 57 4.1.2 所有数据库文件中的I/O瓶颈 59 4.1.3 后台进程中的并发I/O操作 61 4.1.4 定义系统恢复能力与性能目标 61 4.1.5 系统硬件及结构镜像的定义 62 4.1.6 识别专用于数据库的磁盘 62 4.1.7 选择正确的设计 63 4.2 I/O权值估计的检验 66 4.3 如何解决磁盘不足问题 69 4.4 解决方案 70 4.4.1 小型开发数据库设计 70 4.4.2 产品OLTP数据库设计 70 4.4.3 具有历史数据的产品OLTP数据库 设计 71 4.4.4 数据仓库设计 72

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值