现在有表north,south。
north表字段的值全部来自于south表。
north表有少部分字段值是等于south表某个字段的值,大部分字段是等于south表中若干个字段的值作数学运算。
我想是用存储过程实现。声明游标来取出south表的记录集,然后循环结果集,对每条记录作运算,赋值给为north表字段准备的变量。
然后往north表insert或update。因为south表的主键值也将插入north,而那个字段在north表也是主键。所以会有判断,若insert时主键重复,就update那条记录的别的字段。另外,数据量大不大还不知道。目前还没有数据。领导只是让我写好存储过程,测试。估计量不会太大。关键是表的字段特别多。north表一百多个,south表三百多个。我在网上看见有人说在游标循环中,进行insert操作,效率很低。所以不放心。建表和写存储过程花了好大工夫。不想做无用功。

解决方案 »

  1.   

    我们的系统还没开始写代码,现在只是准备阶段。一切都是测试。整个架构还没下来。leader就是想操纵数据库的复杂点的交给数据库去做,那样写代码的人员会比较方便。
    其实我只是写JAVA代码的,由于没有DBA,leader把DBA负责的事情交给我做了。看了两个礼拜MYSQL存储过程,然后开始写存储过程。
    觉得存储过程用的不熟,会适得其反。
      

  2.   

    我把数据库脚本和存储过程脚本都放上来吧。大家帮忙看看,要怎么改改。我现在做的有游标的嵌套循环,在循环里面有insert语句,感觉不是太好。如果数据量大了,会出现瓶颈吧?
    字段太多,脚本好长,只能分几次了CREATE DATABASE IF NOT EXISTS cunbi;USE cunbi;CREATE TABLE IF NOT EXISTS south_neighbouringrnc(
    `start_time` DATETIME,
    `stop_time` DATETIME,
    moi VARCHAR(256),
    related_rnc VARCHAR(256),
    `RAB.SuccEstab.PS.TrChn.NeighbRnc.DCH_DCH` FLOAT,
    `RAB.SuccEstab.PS.TrChn.NeighbRnc.DCH_HSDSCH` FLOAT,
    `VS.RAB.Mean.CSV.Sum.NeighbRnc.Avg` FLOAT,
    PRIMARY KEY(`start_time`,`stop_time`)
    );CREATE TABLE IF NOT EXISTS south_rnc(
    `start_time` DATETIME,
    `stop_time` DATETIME,
    moi VARCHAR(256),
    `FromCoreNwCsInvalidLac` FLOAT,
    `WithCoreNetworkCs` FLOAT,
    `WithCoreNetworkPs` FLOAT,
    `WithCoreNwPsInvalidRac` FLOAT,
    PRIMARY KEY(`start_time`,`stop_time`)
    );
      

  3.   


    CREATE TABLE IF NOT EXISTS south_fddcell(
    `start_time` DATETIME,
    `stop_time` DATETIME,
    moi VARCHAR(256),
    related_rnc VARCHAR(256),
    `IRATHO.FailOutPSUTRAN.NoRsrcCacFailure` FLOAT,
    `IRATHO.FailOutPSUTRAN.RescuePs` FLOAT,
    `IRATHO.FailOutPSUTRAN.ServicePs` FLOAT,
    `RAB.AttEstab.PS.TrChn.DCH_HSDSCH` FLOAT,
    `RAB.AttEstab.PS.TrChn.EDCH_HSDSCH` FLOAT,
    `RAB.FailEstab.CS.CodeStarv` FLOAT,
    `RAB.FailEstab.CS.DLPwr` FLOAT,
    `RAB.FailEstab.CS.RBSetupExp` FLOAT,
    `RAB.FailEstab.CS.RBSetupFail` FLOAT,
    `RAB.FailEstab.CS.RLFailNodeBErr` FLOAT,
    `RAB.FailEstab.CS.RLFailNodeBResource` FLOAT,
    `RAB.FailEstab.CS.RLFailOther` FLOAT,
    `RAB.FailEstab.CS.RLReconfigExp` FLOAT,
    `RAB.FailEstab.CS.ULLoad` FLOAT,
    `RAB.FailEstab.PS.CodeStarv` FLOAT,
    `RAB.FailEstab.PS.DLPwr` FLOAT,
    `RAB.FailEstab.PS.RBSetupExp` FLOAT,
    `RAB.FailEstab.PS.RBSetupFail` FLOAT,
    `RAB.FailEstab.PS.RLFailNodeBErr` FLOAT,
    `RAB.FailEstab.PS.RLFailNodeBResource` FLOAT,
    `RAB.FailEstab.PS.RLFailOther` FLOAT,
    `RAB.FailEstab.PS.RLReconfigExp` FLOAT,
    `RAB.FailEstab.PS.ULLoad` FLOAT,
    `RAB.SuccEstab.CS.Conv64` FLOAT,
    `RAB.SuccEstab.CS.SpeechConv` FLOAT,
    `RAB.SuccEstab.CS.Strm` FLOAT,
    `RAB.SuccEstab.PS.TrChn.DCH_DCH` FLOAT,
    `RAB.SuccEstab.PS.TrChn.DCH_HSDSCH` FLOAT,
    `RAB.SuccEstab.PS.TrChn.EDCH_HSDSCH` FLOAT,
    `RRC.AttConnEstab.TermBgrdCall` FLOAT,
    `RRC.AttConnEstab.TermConvCall` FLOAT,
    `RRC.AttConnEstab.TermHighPrioSig` FLOAT,
    `RRC.AttConnEstab.TermIntactCall` FLOAT,
    `RRC.AttConnEstab.TermLowPrioSig` FLOAT,
    `RRC.AttConnEstab.TermStrmCall` FLOAT,
    `RRC.AttConnEstab.TermUnknown` FLOAT,
    `RRC.SuccConnEstab.CallReestab` FLOAT,
    `RRC.SuccConnEstab.Detach` FLOAT,
    `RRC.SuccConnEstab.Emergency` FLOAT,
    `RRC.SuccConnEstab.IRATCCO` FLOAT,
    `RRC.SuccConnEstab.IRATCellResel` FLOAT,
    `RRC.SuccConnEstab.OrigBgrdCall` FLOAT,
    `RRC.SuccConnEstab.OrigConvCall` FLOAT,
    `RRC.SuccConnEstab.OrigHighPrioSig` FLOAT,
    `RRC.SuccConnEstab.OrigIntactCall` FLOAT,
    `RRC.SuccConnEstab.OrigLowPrioSig` FLOAT,
    `RRC.SuccConnEstab.OrigStrmCal` FLOAT,
    `RRC.SuccConnEstab.OrigSubscCall` FLOAT,
    `RRC.SuccConnEstab.Registration` FLOAT,
    `RRC.SuccConnEstab.TermBgrdCall` FLOAT,
    `RRC.SuccConnEstab.TermConvCall` FLOAT,
    `RRC.SuccConnEstab.TermHighPrioSig` FLOAT,
    `RRC.SuccConnEstab.TermIntactCall` FLOAT,
    `RRC.SuccConnEstab.TermLowPrioSig` FLOAT,
    `RRC.SuccConnEstab.TermStrmCall` FLOAT,
    `RRC.SuccConnEstab.TermUnknown` FLOAT,
    `SHO.SuccRLAddUESide` FLOAT,
    `SHO.SuccRLDelUESide` FLOAT,
    `VS.AvgTxPower.Avg` FLOAT,
      

  4.   


    `VS.AvgTxPower.Max` FLOAT,
    `VS.DdUlAmrABtBadFrm.AmrRtChgLnkFrm10p2` FLOAT,
    `VS.DdUlAmrABtBadFrm.AmrRtChgLnkFrm12p2` FLOAT,
    `VS.DdUlAmrABtBadFrm.AmrRtChgLnkFrm4p75` FLOAT,
    `VS.DdUlAmrABtBadFrm.AmrRtChgLnkFrm5p15` FLOAT,
    `VS.DdUlAmrABtBadFrm.AmrRtChgLnkFrm5p9` FLOAT,
    `VS.DdUlAmrABtBadFrm.AmrRtChgLnkFrm6p7` FLOAT,
    `VS.DdUlAmrABtBadFrm.AmrRtChgLnkFrm7p4` FLOAT,
    `VS.DdUlAmrABtBadFrm.AmrRtChgLnkFrm7p95` FLOAT,
    `VS.DdUlAmrABtGoodFrm.AmrRtChgLnkFrm10p2` FLOAT,
    `VS.DdUlAmrABtGoodFrm.AmrRtChgLnkFrm12p2` FLOAT,
    `VS.DdUlAmrABtGoodFrm.AmrRtChgLnkFrm4p75` FLOAT,
    `VS.DdUlAmrABtGoodFrm.AmrRtChgLnkFrm5p15` FLOAT,
    `VS.DdUlAmrABtGoodFrm.AmrRtChgLnkFrm5p9` FLOAT,
    `VS.DdUlAmrABtGoodFrm.AmrRtChgLnkFrm6p7` FLOAT,
    `VS.DdUlAmrABtGoodFrm.AmrRtChgLnkFrm7p4` FLOAT,
    `VS.DdUlAmrABtGoodFrm.AmrRtChgLnkFrm7p95` FLOAT,
    `VS.DedicatedDownlinkActivityRlcRefCell.DlRabCsData64` FLOAT,
    `VS.DedicatedDownlinkActivityRlcRefCell.DlRabCsSpeech` FLOAT,
    `VS.DedicatedDownlinkActivityRlcRefCell.DlRabHsdpa` FLOAT,
    `VS.DedicatedDownlinkKbytesRlcReferenceCell.DlRabCsData64` FLOAT,
    `VS.DedicatedDownlinkKbytesRlcReferenceCell.DlRabCsSpeech` FLOAT,
    `VS.DedicatedDownlinkKbytesRlcReferenceCell.DlRabCsStr` FLOAT,
    `VS.DedicatedDownlinkKbytesRlcReferenceCell.DlRabHsdpa` FLOAT,
    `VS.DedicatedDownlinkKbytesRlcReferenceCell.DlRabOther` FLOAT,
    `VS.DedicatedDownlinkKbytesRlcReferenceCell.DlRabPsIb128` FLOAT,
    `VS.DedicatedDownlinkKbytesRlcReferenceCell.DlRabPsIb16` FLOAT,
    `VS.DedicatedDownlinkKbytesRlcReferenceCell.DlRabPsIb256` FLOAT,
    `VS.DedicatedDownlinkKbytesRlcReferenceCell.DlRabPsIb32` FLOAT,
    `VS.DedicatedDownlinkKbytesRlcReferenceCell.DlRabPsIb384` FLOAT,
    `VS.DedicatedDownlinkKbytesRlcReferenceCell.DlRabPsIb64` FLOAT,
    `VS.DedicatedDownlinkKbytesRlcReferenceCell.DlRabPsIb8` FLOAT,
    `VS.DedicatedDownlinkKbytesRlcReferenceCell.DlRabPsStr128` FLOAT,
    `VS.DedicatedDownlinkKbytesRlcReferenceCell.DlRabPsStr256` FLOAT,
    `VS.DedicatedDownlinkKbytesRlcReferenceCell.DlRabPsStr384` FLOAT,
    `VS.DedicatedDownlinkKbytesRlcReferenceCell.DlRabPsStrOther` FLOAT,
    `VS.DedicatedDownlinkPdusRlcReferenceCell.DlRabHsdpa` FLOAT,
    `VS.DedicatedDownlinkPdusRlcReferenceCell.DlRabOther` FLOAT,
    `VS.DedicatedDownlinkPdusRlcReferenceCell.DlRabPsIb128` FLOAT,
    `VS.DedicatedDownlinkPdusRlcReferenceCell.DlRabPsIb16` FLOAT,
    `VS.DedicatedDownlinkPdusRlcReferenceCell.DlRabPsIb256` FLOAT,
    `VS.DedicatedDownlinkPdusRlcReferenceCell.DlRabPsIb32` FLOAT,
    `VS.DedicatedDownlinkPdusRlcReferenceCell.DlRabPsIb384` FLOAT,
    `VS.DedicatedDownlinkPdusRlcReferenceCell.DlRabPsIb64` FLOAT,
    `VS.DedicatedDownlinkPdusRlcReferenceCell.DlRabPsIb8` FLOAT,
    `VS.DedicatedDownlinkPdusRlcReferenceCell.DlRabPsStr128` FLOAT,
    `VS.DedicatedDownlinkPdusRlcReferenceCell.DlRabPsStr256` FLOAT,
    `VS.DedicatedDownlinkPdusRlcReferenceCell.DlRabPsStr384` FLOAT,
    `VS.DedicatedDownlinkPdusRlcReferenceCell.DlRabPsStrOther` FLOAT,
    `VS.DedicatedDownlinkRetransmittedPdusRlcReferenceCell.DlRabHsdpa` FLOAT,
    `VS.DedicatedDownlinkRetransmittedPdusRlcReferenceCell.DlRabOther` FLOAT,
    `DedicatedDownlinkRetransmittedPdusRlcReferenceCell.DlRabPsIb128` FLOAT,
    `DedicatedDownlinkRetransmittedPdusRlcReferenceCell.DlRabPsIb16` FLOAT,
    `DedicatedDownlinkRetransmittedPdusRlcReferenceCell.DlRabPsIb256` FLOAT,
    `DedicatedDownlinkRetransmittedPdusRlcReferenceCell.DlRabPsIb32` FLOAT,
    `DedicatedDownlinkRetransmittedPdusRlcReferenceCell.DlRabPsIb384` FLOAT,
    `DedicatedDownlinkRetransmittedPdusRlcReferenceCell.DlRabPsIb64` FLOAT,
    `VS.DedicatedDownlinkRetransmittedPdusRlcReferenceCell.DlRabPsIb8` FLOAT,
    `DedicatedDownlinkRetransmittedPdusRlcReferenceCell.DlRabPsStr128` FLOAT,
    `DedicatedDownlinkRetransmittedPdusRlcReferenceCell.DlRabPsStr256` FLOAT,
    `DedicatedDownlinkRetransmittedPdusRlcReferenceCell.DlRabPsStr384` FLOAT,
    -- the below colum is:DedicatedDownlinkRetransmittedPdusRlcReferenceCell.DlRabPsStrOther
    `DedicatedDownlinkRetransmittedPdusRlcReferenceCell.DlRabPsStrOth` FLOAT,
    `VS.DedicatedUplinkActivityRlcRefCell.UlRabCsData64` FLOAT,
    `VS.DedicatedUplinkActivityRlcRefCell.UlRabCsSpeech` FLOAT,
    `VS.DedicatedUplinkActivityRlcRefCell.UlRabHsupa` FLOAT,
    `VS.DedicatedUplinkActivityRlcRefCell.UlRabPsStrHsupa` FLOAT,
    `VS.DedicatedUplinkBadPdusRlcRefCell.UlRabCsData64` FLOAT,
    `VS.DedicatedUplinkBadPdusRlcRefCell.UlRabCsSpeech` FLOAT,
    `VS.DedicatedUplinkBadPdusRlcRefCell.UlRabCsStr` FLOAT,
      

  5.   

    你的计算是指什么,有多复杂?如果只是简单的计算,不如直接就用SQL语句实现,这样就不需要使用存储过程。MYSQL中有专门的语法。
    MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
      

  6.   


    north south间的数据要实时吗?
      

  7.   

    不知道是否要实时
    是领导让我写存储过程
    我也是刚学存储过程
    看书一两周而已由于字符数实在是太多
    在回复中分割了发也放不下
    全部代码在下载频道:
    http://download.csdn.net/source/2643331包括DDL脚本,插入测试数据的脚本,存储过程脚本
    可以导入进行测试
      

  8.   


    north表字段值需要根据三个south表进行计算,你看看下载频道的脚本
      

  9.   

    主要问题是表字段较多,字段名太长,所以看起来脚本老长
    要达到的效果
    mysql> show tables;
    +-----------------------+
    | Tables_in_cunbi       |
    +-----------------------+
    | north_rnc             |
    | north_utrancell       |
    | south_fddcell         |
    | south_neighbouringrnc |
    | south_rnc             |
    +-----------------------+首先说明一下,这些表主键字段都一样:(start_time,stop_time)south_fddcell、south_neighbouringrnc 、south_rnc这三张表的数据不用管,数据来自将来用别处取文件处理然后存储进这三张表。
    而现在要处理的是north_rnc、north_utrancell表的数据来源。其中,north_utrancell字段值比较好处理点,都是south_fddcell一张表的字段进行计算得来,计算例如几个字段相加等等。
    麻烦的是north_rnc表,字段值需要根据south_fddcell、south_neighbouringrnc 、south_rnc这三张表计算,嵌套的游标循环。
    亲只需看看north_rnc()此存储过程,代码从1300行开始,打开游标从1937行开始,接下来是给north_rnc表的字段设置值(当然是赋值给预先定义的变量),绝大部分字段值是由south_fddcell表字段计算而来,这些直接设置值,最外层打开的游标也是从此表查询的数据。然后是涉及到三张表字段交叉计算的,就迭代另外两个游标,判断主键值是否相等,相等才将字段进行计算(不同表的字段计算,当然要有关联才行)。
    这样,给所有变量设置完值,在最外层的游标循环中往south_rnc表insert数据,此时用到了insert into ... ON DUPLICATE KEY UPDATE ...其实逻辑很简单,只是脚本老长了
      

  10.   

    上帝啊,字段太多,贴出记录实在不可能呢。我只插入了一条测试数据到三张south表。
    north表的记录是调用存储过程插入的看看那个存储过程里面,在游标循环里面,作了什么运算
      

  11.   

     (不要高估你的汉语表达能力或者我的汉语理解能力)
       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  12.   

    mysql> select version();
    +----------------------+
    | version()            |
    +----------------------+
    | 5.4.3-beta-community |
    +----------------------+mysql> use cunbi;
    Database changed
    mysql> show tables;
    +-----------------------+
    | Tables_in_cunbi       |
    +-----------------------+
    | north_rnc             |
    | north_utrancell       |
    | south_fddcell         |
    | south_neighbouringrnc |
    | south_rnc             |
    +-----------------------+还有,建表语句和测试数据都在下载频道了,就是我贴出来的那个地址。字段太多,没法把表结构列出来。
    简单的说,要做的事情就是根据三个south表的字段值,往north表insert数据。先运行我给出的ddl.sql和insert.sql吧。表和数据就有了。
    存储过程脚本是stored_procedure.sql