0

我需要创建一个脚本,从表 A 中放置一个键号(稍后将用作参数),然后将该参数或键号流入查询中,然后将这些结果转储到保存记录或表中以供以后操作和这样的。因为每次提取有超过 1 行(实际上每个查询结果或每个声明键有 6 行),我决定使用 Bulk Collect 子句。虽然我对不同数据库的初始测试有效,但我还没有弄清楚为什么真正的脚本不工作。

这是我使用的测试脚本:

DECLARE

--Cursors--
CURSOR prod_id is select distinct(product_id) from product order by 1 asc;

CURSOR cursorValue(p_product_id NUMBER) IS
        SELECT h.product_description,o.company_short_name
        FROM company o,product h
        WHERE o.product_id =h.product_id
        AND h.product_id =p_product_id
        AND h.product_id IS NOT NULL
        ORDER by 2;

    --Table to store Cursor data--        
    TYPE indx IS TABLE OF cursorValue%ROWTYPE
    INDEX BY PLS_INTEGER;
    indx_tab  indx;

    ---Variable objects---
    TotalIDs PLS_INTEGER;
    TotalRows PLS_INTEGER := 0 ;

BEGIN
      --PARAMETER CURSOR RUNS---
    FOR prod_id2 in prod_id LOOP
    dbms_output.put_line('Product ID: ' || prod_id2.product_id);
    TotalIDs := prod_id%ROWCOUNT;

          --FLOW PARAMETER TO SECOND CURSOR--
        Open cursorValue(prod_id2.product_id);
        Loop 
        Fetch cursorValue Bulk collect into indx_tab;

          ---data dump into table---
        --dbms_output.put_line('PROD Description: ' || indx_tab.product_description|| ' ' ||'Company Name'|| indx_tab.company_short_name);
        TotalRows := TotalRows + cursorValue%ROWCOUNT;
        EXIT WHEN cursorValue%NOTFOUND;
        End Loop;
        CLOSE cursorValue;
    End Loop;    
dbms_output.put_line('Product ID Total: ' || TotalIDs);
dbms_output.put_line('Description Rows: ' || TotalRows);
END;


Test Script Results:
anonymous block completed
Product ID: 1
Product ID: 2
Product ID: 3
Product ID: 4
Product ID: 5
Product ID Total: 5
Description Rows: 6

更新:将问题标记为“已回答”谢谢。

4

1 回答 1

3

第一个错误在第 7 行。在第 4 行,您有:

  CURSOR CUR_CLAIMNUM IS
                      SELECT DISTINCT(CLAIM_NO)FROM R7_OPENCLAIMS;

...这似乎是有效的,所以你的列名是CLAIM_NO. 第 7 行:

  CURSOR OPEN_CLAIMS (CLAIM_NUM  R7_OPENCLAIMS.CLAIM_NUM%TYPE)  IS

...因此您将列名输入错误CLAIM_NUM,该表中不存在该列名。这是错误消息告诉你的,真的。

其他错误是因为光标无效,因为那个错字。

当您打开第二个光标时,您会遇到相同的名称混淆:

          OPEN OPEN_CLAIMS (CUR_CLAIMNUM2.CLAIM_NUM);

...失败,因为游标没有CLAIMNO查询CLAIMNUM;除了这里,它被distinct. 您没有为列名起别名,因此 Oracle 应用了一个,您可以参考,但添加您自己的更简单:

  CURSOR CUR_CLAIMNUM IS
                      SELECT DISTINCT(CLAIM_NO) AS CLAIM_NO FROM R7_OPENCLAIMS;

接着

          OPEN OPEN_CLAIMS (CUR_CLAIMNUM2.CLAIM_NO);

但是我建议您在定义和循环声明中也将游标名称从CUR_CLAIMNUMto更改。CUR_CLAIM_NO并且调用游标迭代器CUR_CLAIMNUM2很奇怪,因为它表明它本身就是一个游标名称。也许类似的东西ROW_CLAIM_NO会更清楚。

于 2014-09-15T21:50:22.697 回答