Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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
Oracle 使用两个游标、一个参数创建PL/SQL脚本,并从表中给出结果?_Oracle_Plsql_Cursor_Plsqldeveloper_Bulk Collect - Fatal编程技术网

Oracle 使用两个游标、一个参数创建PL/SQL脚本,并从表中给出结果?

Oracle 使用两个游标、一个参数创建PL/SQL脚本,并从表中给出结果?,oracle,plsql,cursor,plsqldeveloper,bulk-collect,Oracle,Plsql,Cursor,Plsqldeveloper,Bulk Collect,我需要创建一个脚本,从表a中输入一个键号(稍后将用作参数),然后将该参数或键号流到一个查询中,然后将这些结果转储到一个保留记录或表中,以便稍后进行操作等等。因为每个fetch有不止一行(实际上每个查询结果或每个声明键有6行),所以我决定使用bulkcollect子句。虽然我在另一个数据库上的初始测试成功了,但我还没有弄明白为什么真正的脚本不起作用 以下是我使用的测试脚本: DECLARE --Cursors-- CURSOR prod_id is select distinct(product

我需要创建一个脚本,从表a中输入一个键号(稍后将用作参数),然后将该参数或键号流到一个查询中,然后将这些结果转储到一个保留记录或表中,以便稍后进行操作等等。因为每个fetch有不止一行(实际上每个查询结果或每个声明键有6行),所以我决定使用bulkcollect子句。虽然我在另一个数据库上的初始测试成功了,但我还没有弄明白为什么真正的脚本不起作用

以下是我使用的测试脚本:

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

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

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

  CURSOR CUR_CLAIMNUM IS
                      SELECT DISTINCT(CLAIM_NO)FROM R7_OPENCLAIMS;
。。。这似乎是有效的,所以您的列名是
CLAIM\u NO
。第7行:

  CURSOR OPEN_CLAIMS (CLAIM_NUM  R7_OPENCLAIMS.CLAIM_NUM%TYPE)  IS
。。。因此,您将列名输入错误为
CLAIM\u NUM
,该表中不存在该列名。这就是错误消息告诉你的,真的

其他错误是由于该输入错误导致光标无效

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

          OPEN OPEN_CLAIMS (CUR_CLAIMNUM2.CLAIM_NUM);
。。。它失败,因为光标正在查询
CLAIMNO
而不是
CLAIMNUM
;除了这里,它被
不同的
进一步混淆了。您没有为列名添加别名,因此Oracle应用了一个列名,您可以参考它,但添加自己的列名更简单:

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

          OPEN OPEN_CLAIMS (CUR_CLAIMNUM2.CLAIM_NO);

但是我建议您在定义和循环声明中也将游标名称从
CUR\u CLAIMNUM
更改为
CUR\u CLAIM\u NO
。让游标迭代器名为
CUR_CLAIMNUM2
很奇怪,因为它表明这本身就是一个游标名称;也许像
ROW\u CLAIM\u NO
这样的东西会更清楚。

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

  CURSOR CUR_CLAIMNUM IS
                      SELECT DISTINCT(CLAIM_NO)FROM R7_OPENCLAIMS;
。。。这似乎是有效的,所以您的列名是
CLAIM\u NO
。第7行:

  CURSOR OPEN_CLAIMS (CLAIM_NUM  R7_OPENCLAIMS.CLAIM_NUM%TYPE)  IS
。。。因此,您将列名输入错误为
CLAIM\u NUM
,该表中不存在该列名。这就是错误消息告诉你的,真的

其他错误是由于该输入错误导致光标无效

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

          OPEN OPEN_CLAIMS (CUR_CLAIMNUM2.CLAIM_NUM);
。。。它失败,因为光标正在查询
CLAIMNO
而不是
CLAIMNUM
;除了这里,它被
不同的
进一步混淆了。您没有为列名添加别名,因此Oracle应用了一个列名,您可以参考它,但添加自己的列名更简单:

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

          OPEN OPEN_CLAIMS (CUR_CLAIMNUM2.CLAIM_NO);

但是我建议您在定义和循环声明中也将游标名称从
CUR\u CLAIMNUM
更改为
CUR\u CLAIM\u NO
。让游标迭代器名为
CUR_CLAIMNUM2
很奇怪,因为它表明这本身就是一个游标名称;也许像
ROW\u CLAIM\u NO
这样的东西会更清楚。

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

  CURSOR CUR_CLAIMNUM IS
                      SELECT DISTINCT(CLAIM_NO)FROM R7_OPENCLAIMS;
。。。这似乎是有效的,所以您的列名是
CLAIM\u NO
。第7行:

  CURSOR OPEN_CLAIMS (CLAIM_NUM  R7_OPENCLAIMS.CLAIM_NUM%TYPE)  IS
。。。因此,您将列名输入错误为
CLAIM\u NUM
,该表中不存在该列名。这就是错误消息告诉你的,真的

其他错误是由于该输入错误导致光标无效

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

          OPEN OPEN_CLAIMS (CUR_CLAIMNUM2.CLAIM_NUM);
。。。它失败,因为光标正在查询
CLAIMNO
而不是
CLAIMNUM
;除了这里,它被
不同的
进一步混淆了。您没有为列名添加别名,因此Oracle应用了一个列名,您可以参考它,但添加自己的列名更简单:

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

          OPEN OPEN_CLAIMS (CUR_CLAIMNUM2.CLAIM_NO);

但是我建议您在定义和循环声明中也将游标名称从
CUR\u CLAIMNUM
更改为
CUR\u CLAIM\u NO
。让游标迭代器名为
CUR_CLAIMNUM2
很奇怪,因为它表明这本身就是一个游标名称;也许像
ROW\u CLAIM\u NO
这样的东西会更清楚。

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

  CURSOR CUR_CLAIMNUM IS
                      SELECT DISTINCT(CLAIM_NO)FROM R7_OPENCLAIMS;
。。。这似乎是有效的,所以您的列名是
CLAIM\u NO
。第7行:

  CURSOR OPEN_CLAIMS (CLAIM_NUM  R7_OPENCLAIMS.CLAIM_NUM%TYPE)  IS
。。。因此,您将列名输入错误为
CLAIM\u NUM
,该表中不存在该列名。这就是错误消息告诉你的,真的

其他错误是由于该输入错误导致光标无效

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

          OPEN OPEN_CLAIMS (CUR_CLAIMNUM2.CLAIM_NUM);
。。。它失败,因为光标正在查询
CLAIMNO
而不是
CLAIMNUM
;除了这里,它被
不同的
进一步混淆了。您没有为列名添加别名,因此Oracle应用了一个列名,您可以参考它,但添加自己的列名更简单:

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

          OPEN OPEN_CLAIMS (CUR_CLAIMNUM2.CLAIM_NO);

但是我建议您在定义和循环声明中也将游标名称从
CUR\u CLAIMNUM
更改为
CUR\u CLAIM\u NO
。让游标迭代器名为
CUR_CLAIMNUM2
很奇怪,因为它表明这本身就是一个游标名称;也许类似于
ROW\u CLAIM\u NO
的问题会更清楚。

你问了好几个问题,但我已经回答了似乎最紧迫的问题。由于您的测试块工作正常,您似乎已经知道如何使用批量收集(尽管您似乎删除了
循环
,而不是注释它)。我不确定你是否有任何进一步的问题,一旦错字是固定的,但如果是这样,你应该问一个单独的问题,显示当前和预期的行为,你真正的块<代码>dbms_输出
应该只用于基本调试,因为客户端可能不会显示输出-但不确定要对数据执行什么操作。因此,请更正输入错误(感谢我最初没有看到它)。以下是现在的错误:错误报告:ORA-06550:第41行第43列:PLS-00302:必须声明组件“索赔编号”ORA-06550:第41行第43列