Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
For loop 遍历游标并将游标的输出存储在另一个表中_For Loop_Plsql_Cursor - Fatal编程技术网

For loop 遍历游标并将游标的输出存储在另一个表中

For loop 遍历游标并将游标的输出存储在另一个表中,for-loop,plsql,cursor,For Loop,Plsql,Cursor,我试图遍历存储表值的游标。我使用FOR循环进行迭代,如果满足其中一个条件,我将输出存储在另一个表中。我不确定我所遵循的方法,并且也得到了错误(ORA-00933:SQL命令没有正确结束)。Stats_querys是我的引用表,我在其中迭代游标。统计结果卡是我的输出表,我必须在其中存储结果。请帮忙 DECLARE CURSOR c1 IS select Stats_Queries.OBJECTTYPE, Stats_Queries.CATEGORY, Stats_Quer

我试图遍历存储表值的游标。我使用FOR循环进行迭代,如果满足其中一个条件,我将输出存储在另一个表中。我不确定我所遵循的方法,并且也得到了错误(ORA-00933:SQL命令没有正确结束)。Stats_querys是我的引用表,我在其中迭代游标。统计结果卡是我的输出表,我必须在其中存储结果。请帮忙

 DECLARE
     CURSOR c1 IS
       select Stats_Queries.OBJECTTYPE, Stats_Queries.CATEGORY, Stats_Queries.QUERY  
       from Stats_Queries;
    r1 c1%ROWTYPE;
    BEGIN
      FOR r1 IN c1 LOOP
        If (r1.OBJECTTYPE = 'CARD') THEN
        INSERT INTO STATS_RESULTS_CARD (NODETYPENAME, NODEDEFNAME , CARDTYPENAME, PROVISIONSTATUSNAME, STATDATE, CARDCOUNT)
        select nt.name, nd.name, ct.name, ps.name, sysdate, count(c.cardid)
    from cardtype ct, card c, node n, nodetype nt, nodedef nd, provisionstatus ps
    where ct.name in ('SRA AMP', 'XLA AMP', 'SAM', 'ESAM')
    and ct.cardtypeid = c.card2cardtype
    and c.card2node = n.nodeid
    and n.node2nodetype = nt.nodetypeid
    and n.node2nodedef = nd.nodedefid
    and c.card2provisionstatus = ps.provisionstatusid
    group by nt.name, nd.name, ct.name, ps.name
    END If;
    END LOOP;
    END;
可能是因为您在

group by nt.name, nd.name, ct.name, ps.name

除了Finbarr提供的答案(这是完全正确的;加上缺少的分号,您的过程应该可以运行)之外,为什么还需要循环遍历光标?这是做这件事的慢方法

您可以只执行一个insert语句,例如:

  insert into stats_results_card (nodetypename,
                                  nodedefname,
                                  cardtypename,
                                  provisionstatusname,
                                  statdate,
                                  cardcount)
    select x.nt_name,
           x.nd_name,
           x.ct_name,
           x.ps_name,
           x.statdate,
           x.cnt_cardid                               
    from   (select   nt.name nt_name,
                     nd.name nd_name,
                     ct.name ct_name,
                     ps.name ps_name,
                     sysdate statdate,
                     count (c.cardid) cnt_cardid
            from     cardtype ct,
                     card c,
                     node n,
                     nodetype nt,
                     nodedef nd,
                     provisionstatus ps
            where        ct.name in ('SRA AMP',
                                     'XLA AMP',
                                     'SAM',
                                     'ESAM')
                     and ct.cardtypeid = c.card2cardtype
                     and c.card2node = n.nodeid
                     and n.node2nodetype = nt.nodetypeid
                     and n.node2nodedef = nd.nodedefid
                     and c.card2provisionstatus = ps.provisionstatusid
            group by nt.name,
                     nd.name,
                     ct.name,
                     ps.name) x
           cross join (select stats_queries.objecttype,
                              stats_queries.category,
                              stats_queries.query
                       from   stats_queries
                       where  objecttype = 'CARD');
注意:假设原始游标和循环中的select语句之间没有任何链接;我们执行交叉连接以按所需次数复制行


如果两个查询之间存在实际的连接,则可以将其替换为交叉连接。

循环中的游标和insert语句之间没有任何链接。因此,要插入相同数据的X个副本,这取决于游标中有多少行的objecttype为“CARD”(顺便说一句,为什么要在循环中而不是游标本身中进行过滤?!)。这就是你想要的吗?
  insert into stats_results_card (nodetypename,
                                  nodedefname,
                                  cardtypename,
                                  provisionstatusname,
                                  statdate,
                                  cardcount)
    select x.nt_name,
           x.nd_name,
           x.ct_name,
           x.ps_name,
           x.statdate,
           x.cnt_cardid                               
    from   (select   nt.name nt_name,
                     nd.name nd_name,
                     ct.name ct_name,
                     ps.name ps_name,
                     sysdate statdate,
                     count (c.cardid) cnt_cardid
            from     cardtype ct,
                     card c,
                     node n,
                     nodetype nt,
                     nodedef nd,
                     provisionstatus ps
            where        ct.name in ('SRA AMP',
                                     'XLA AMP',
                                     'SAM',
                                     'ESAM')
                     and ct.cardtypeid = c.card2cardtype
                     and c.card2node = n.nodeid
                     and n.node2nodetype = nt.nodetypeid
                     and n.node2nodedef = nd.nodedefid
                     and c.card2provisionstatus = ps.provisionstatusid
            group by nt.name,
                     nd.name,
                     ct.name,
                     ps.name) x
           cross join (select stats_queries.objecttype,
                              stats_queries.category,
                              stats_queries.query
                       from   stats_queries
                       where  objecttype = 'CARD');