我正在尝试构建一个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。
一如既往,感谢大家分享他们的才华!
答案 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