免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1587 | 回复: 1
打印 上一主题 下一主题

借人气问个问题----游标嵌套 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-01-26 13:11 |只看该作者 |倒序浏览
我有一张表,表结构如下:

flowid        INT        PRIMARY_KEY
srcip        CHAR(15)
srcport        INT(4)
dstport        CHAR(15)
dstport        INT(4)
prot        INT(4)
packets        INT(4)
bytes        INT(4)

如果创建一个储存过程,用来统计从唯一的srcip的srcport端口到唯一的dstip的dstport的使用prot承载的流量?


我写的储存过程如下:



Create Procedure AggregateRecord @agg_days INT AS
        Declare @srcip NVARCHAR(50)
        Declare @srcport INT
        Declare @dstip NVARCHAR(50)
        Declare @dstport INT
        Declare @prot INT
        Declare @flows INT
        Declare @packets BIGINT
        Declare @bytes BIGINT

        Declare @ctr_srcip BIGINT
        Declare @ctr_srcport INT
        Declare @ctr_dstip BIGINT
        Declare @ctr_dstport INT
        Declare @ctr_prot INT
        Declare @ctr_flows INT

        Declare srcip_cs Cursor For
        SELECT DISTINCT srcaddr
        FROM netflow_record
        Where DateDiff(Dy,rece_time,GetDate()) >= @agg_days
        For Read Only

        Open srcip_cs
        SET @ctr_srcip = @@CURSOR_ROWS
        While (@ctr_srcip > 0) Begin
                SET @ctr_srcip = @ctr_srcip - 1
                Fetch Next
                From srcip_cs
                INTO @srcip
                       
                --第二层循环
                Declare srcport_cs Cursor For
                SELECT DISTINCT srcPort
                FROM netflow_record
                Where (srcaddr = @srcip) AND (DateDiff(Dy,rece_time,GetDate()) >= @agg_days)
                For Read Only

                Open srcport_cs
                SET @ctr_srcport = @@CURSOR_ROWS
                While (@ctr_srcport > 0) Begin
                        SET @ctr_srcport = @ctr_srcport - 1
                        Fetch Next
                        From srcport_cs
                        INTO @srcport

                        --第三层循环
                        Declare dstip_cs Cursor For
                        SELECT DISTINCT dstaddr
                        FROM netflow_record
                        WHERE (srcPort = @srcport) AND (srcaddr = @srcip) AND (DateDiff(Dy,rece_time,GetDate()) >= @agg_days)
                        For Read Only
       
                        Open dstip_cs
                        SET @ctr_dstip = @@CURSOR_ROWS
                        While (@ctr_dstip>0) Begin
                                SET @ctr_dstip = @ctr_dstip - 1
                                Fetch Next
                                From dstip_cs
                                INTO @dstip
                               
                                --第四层循环
                                Declare dstport_cs Cursor For
                                SELECT DISTINCT dstPort
                                FROM netflow_record
                                WHERE (dstaddr = @dstip) AND (srcPort = @srcport) AND (srcaddr = @srcip) AND (DateDiff(Dy,rece_time,GetDate()) >= @agg_days)
                                For Read Only
                               
                                Open dstport_cs
                                SET @ctr_dstport = @@CURSOR_ROWS
                                While (@ctr_dstport > 0) Begin
                                        SET @ctr_dstport = @ctr_dstport - 1
                                        Fetch Next
                                        From dstport_cs
                                        INTO @dstport

                                        --第五层循环
                                        Declare prot_cs Cursor For
                                        SELECT DISTINCT protocol
                                        FROM netflow_record
                                        WHERE (dstaddr = @dstip) AND (dstPort = @dstport) AND (srcPort = @srcport) AND (srcaddr = @srcip) AND (DateDiff(Dy,rece_time,GetDate()) >= @agg_days)
                                        For Read Only
       
                                        Open prot_cs
                                        SET @ctr_prot = @@CURSOR_ROWS
                                        While(@ctr_prot > 0) Begin
                                                SET @ctr_prot = @ctr_prot - 1
                                                Fetch Next
                                                From prot_cs
                                                INTO @prot
                                       
                                                --最后识别
                                                Declare flow_cs Cursor For
                                                SELECT packets,bytes
                                                FROM netflow_record
                                                WHERE (dstaddr = @dstip) AND (dstPort = @dstport) AND (srcPort = @srcport) AND (srcaddr = @srcip) AND (protocol = @prot) AND (DateDiff(Dy,rece_time,GetDate()) >= @agg_days)
                                                For Read Only

                                                Declare @flows_t INT
                                                Declare @packets_t BIGINT
                                                Declare @bytes_t BIGINT
                                                SET @flows_t = 0
                                                SET @packets_t = 0
                                                SET @bytes_t = 0

                                                Open flow_cs
                                                SET @ctr_flows = @@CURSOR_ROWS
                                                While(@ctr_flows > 0) Begin
                                                        SET @ctr_flows = @ctr_flows - 1
                                                        Fetch Next
                                                        From flow_cs
                                                        INTO @packets,@bytes

                                                        Set @flows_t = @flows_t + 1
                                                        Set @packets_t = @packets_t + @packets
                                                        Set @bytes_t = @bytes_t + @bytes
                                                                                                       
                                                END
                                                --最后识别

                                                INSERT INTO aggregate (srcIP,srcPort,dstIP,dstPort,prot,flows,packets,bytes,agg_time) VALUES (@srcip, @srcport, @dstip, @dstport, @prot, @flows_t, @packets_t, @bytes_t, getdate())
                                        END
                                        --第五层循环

                                END

                        --第四层循环
                        END               
                --第三层循环
                END
        --第二层循环
        END

        Close flow_cs
        Close prot_cs
        Close dstport_cs
        Close dstip_cs
        Close srcip_cs
        Close srcport_cs
        Deallocate flow_cs
        Deallocate prot_cs
        Deallocate dstport_cs
        Deallocate dstip_cs
        Deallocate srcip_cs
        Deallocate srcport_cs


我想将最后的结果保存到aggregate数据库中,结果只看到数据库中有一条记录,请高手帮忙指正。

论坛徽章:
0
2 [报告]
发表于 2006-01-26 17:16 |只看该作者
太长乐
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP