有关常用项集的PL / SQL问题

时间:2013-11-16 18:56:23

标签: oracle plsql bigdata analysis

我正在尝试构建一个PL / SQL应用程序来从一组给定数据中挖掘频繁项目集,我遇到了一些障碍。我的PL / SQL技能不如我所希望的那样好,所以也许你们中的一个可以帮助我更好地理解这一点。

首先,我正在使用Oracle数据挖掘过程:* DBMS_FREQUENT_ITEMSET.FI_TRANSACTIONAL *

在阅读文档时,我遇到了以下示例,我操作过这个示例来查询我的数据集:

CREATE OR REPLACE TYPE FI_VARCHAR_NT AS TABLE OF NUMBER;
/

CREATE TYPE fi_res AS OBJECT (
itemset      FI_VARCHAR_NT,
support      NUMBER,
length       NUMBER,
total_tranx  NUMBER
);
/

CREATE TYPE fi_coll AS TABLE OF fi_res;
/

create or replace 
PROCEDURE freq_itemset_test is
    cursor freqC is
          SELECT itemset
          FROM table(
            CAST(DBMS_FREQUENT_ITEMSET.FI_TRANSACTIONAL(CURSOR(SELECT sale.customerid, sale.productid FROM Sale INNER JOIN Customer ON customer.customerid = sale.customerid WHERE customer.region = 'Canada' )
                  ,0,2, 2, NULL, NULL) AS fi_coll));   
      coll_nt  FI_VARCHAR_NT;
    num_rows int;
    num_itms int;
  BEGIN
    num_rows := 0;
    num_itms := 0;
    OPEN freqC;
    LOOP
      FETCH freqC INTO coll_nt;
      EXIT WHEN freqC%NOTFOUND;
      num_rows := num_rows + 1;
      num_itms := num_itms + coll_nt.count;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('Rows: ' || num_rows || ' Columns: ' || num_itms);
  CLOSE freqC;
END;

我使用Oracle FI_TRANSACTIONAL而不是直接SQL的原因是我需要对K的多个动态值重复此分析,那么为什么要重新发明轮子呢?最终,我的目标是引用过程返回的每个单独的项集,并根据一些查询逻辑返回具有最高支持的集。我将把这个PL / SQL块合并到另一个块中,基本上根据数据内容将查询中的文字从“加拿大”更改为多个其他区域。

我的问题是:如何才能真正获得游标返回的数据(freqC)的程序化参考?显然,我不需要计算行和列,但这是示例的一部分。在找到最多的项目集后,我想用DBMS打印行打印出项目集。当我在调试器中查看它时,我看到每次获取光标实际上返回一个项集(在这种情况下,k = 2,所以两个项)。但是我如何以编程方式实际触摸它们呢?我想抓住这些套装以及fi_res.support。

一如既往,感谢大家分享他们的才华!

1 个答案:

答案 0 :(得分:2)

您正在将数据提取到嵌套表中。因此,要查看其中的数据,您需要遍历嵌套表:

FOR i IN coll_nt.FIRST .. coll_nt.LAST
LOOP
    dbms_output.put_line(i||': '||coll_nt(i));
END LOOP;

有关嵌套表和其他类型集合的更多信息,请参阅以下位置的演示文稿: http://www.toadworld.com/platforms/oracle/w/wiki/8253.everything-you-need-to-know-about-collections-but-were-afraid-to-ask.aspx