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

原创 2007年10月12日 16:24:00

        最近在做的一个项目中,需要从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 中的内容也会被清掉,虽然在程序的生命周期中该变量可以当作全局的来使用,但是其它程序无法读取变量中的内容的。

Oracle建表常用数据类型详解

前言: 为列指定数据类型并不难,难的是指定合适的数据类型。同样是字符串类型,选择定长还是变长,其中大有文章。所以需要耐心而细致的学习下面的内容。 创建表时,必须为表的各个列指定数据类型。如果实...
  • congcongsuiyue
  • congcongsuiyue
  • 2014年11月14日 10:25
  • 1655

oracle将一个用户下的所有表复制到以一个用户下

在测试过程中,一般为了让测试环境与开发环境隔离,一般要球测试环境对应的数据库也与开发环境进行隔离 这时候我的做法是:先创建一个用于测试环境的用户,然后将开发环境中该用户对应的表及数据导出,再导入到测试...
  • russ44
  • russ44
  • 2016年07月13日 13:21
  • 2632

oracle数据库_实例_用户_表空间之间的关系

oracle数据库_实例_用户_表空间之间的关系 基础概念:Oracle数据库、实例、用户、表空间、表之间的关系 数据库: Oracle数据库是数据的物理存储。这就包括(数据文件ORA或者DBF...
  • haiross
  • haiross
  • 2014年03月03日 09:33
  • 32353

oracle用户和表空间以及表之间的关系

1 oracle的数据模式是:用户建在数据库实例上,表建在用户上      不同数据库实例可以建相同的用户;     同一个数据库实例,用户名不能相同;     一个用户可以使用多个表空间; ...
  • smithdoudou88
  • smithdoudou88
  • 2014年11月17日 16:21
  • 1119

oracle一个创建用户、创建表空间、授权、建表的完整过程

原文地址: http://skyuck.iteye.com/blog/847859 1.首先我们可以用scott用户以sysdba的身份登录oracle. Sql代码   ...
  • xiewendong93
  • xiewendong93
  • 2016年12月14日 14:18
  • 2623

Oracle查询用户所有的表、包、包体、过程、函数等信息

-- 查询所有用户的表,视图等 select * from all_tab_comments    -- 查询本用户的表,视图等 select * from user_tab_comment...
  • yixh1
  • yixh1
  • 2013年12月06日 14:17
  • 529

Oracle查看用户所在的表空间

oracle 查看表空间有哪些表 select * from dba_tables where tablespace_name='表空间名',注意表空间名大小写敏感。 select tab...
  • truelove12358
  • truelove12358
  • 2017年04月10日 16:02
  • 1228

oracle 中显示用户表和数据库

原文地址:http://challengecn2008.blog.sohu.com/105857276.html oracle 中如何查看用户表和数据库 首先需要了解oracle中...
  • xiaogugood
  • xiaogugood
  • 2013年06月28日 16:35
  • 4066

查询某表空间被哪些用户所使用

原创作品,出自 “深蓝的blog” 博客,深蓝的blog:   昨天为测试的妹子如何查查出表空间都被哪些用户使用的方法,给了几个建议。小费了几个周折,怪自己开始的时候情况考虑的不周全,不过总体上还好,...
  • huangyanlong
  • huangyanlong
  • 2015年07月16日 15:24
  • 2898

Oracle - 数据库的实例、表空间、用户、表之间关系

Oracle数据库,实例,表空间,用户,表之间的关系简析
  • SinsiWoo
  • SinsiWoo
  • 2016年04月01日 14:53
  • 1132
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:oracle的包、用户数据类型与内存表的实现
举报原因:
原因补充:

(最多只允许输入30个字)