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