我创建了一个游标,它返回一组行。在遍历每一行时,我想从另一个表中获取另一个结果集(通过使用具有来自已处理行的值的WHERE子句形成SELECT语句)。我是PLSQL的新手。你能指导我如何做到这一点吗? (我们可以在循环中为游标的结果集循环时定义一个Cursor吗?)
如果我无法说清楚,请原谅。
提前致谢
DECLARE
CURSOR receipts IS
SELECT CREATED_T, ACCT_NO, AMT FROM receipt_t
WHERE OBJ_TYPE='misc';
receipts_rec receipts%ROWTYPE;
BEGIN
-- Open the cursor for processing
IF NOT receipts%ISOPEN THEN
OPEN receipts;
END IF;
LOOP
FETCH receipts INTO receipts_rec;
EXIT WHEN receipts%NOTFOUND;
/* Loop through each of row and get the result set from another table */
newQuery := 'SELECT * FROM ageing_data WHERE ACCT_NO = ' || receipts_rec.ACCT_NO;
-- Execute the above query and get the result set, say RS
LOOP
-- For above result set-RS
END LOOP;
END LOOP;
CLOSE receipts;
END;
答案 0 :(得分:1)
是的,您可以定义一个带有一组参数的游标,并在WHERE子句中使用这些值。
DECLARE
CURSOR c_cursor1 IS
SELECT field1, field2, ... , fieldN
FROM table1
WHERE conditions;
CURSOR c_cursor2 (p_parameter NUMBER) IS
SELECT field1, field2, ..., fieldN
FROM table2
WHERE table2.field1 = p_parameter;
BEGIN
FOR record1 IN c_cursor1 LOOP
FOR record2 IN c_cursor2(record1.field1) LOOP
dbms_output.put_line('cursor 2: ' || record2.field1);
END LOOP
END LOOP;
END;
答案 1 :(得分:1)
是的,你可以这样做,但绝对没有理由。请尝试以下方法:
BEGIN
FOR aRow IN (SELECT rt.CREATED_T, rt.ACCT_NO, rt.AMT, ad.*
FROM RECEIPT_T rt
INNER JOIN AGEING_DATA ad
ON (ad.ACCT_NO = rt.ACCT_NO)
WHERE rt.OBJ_TYPE='misc')
LOOP
-- Process the data in aRow here
END LOOP;
END;
这与原始的“loop-in-a-loop”结构完全相同,但使用数据库将表连接在一起,而不是多次打开和关闭游标。
分享并享受。
答案 2 :(得分:0)
这样的事情可以通过以下方式完成:
DECLARE
CURSOR cursor1 IS
SELECT *
FROM table1;
CURSOR cursor2 IS
SELECT *
FROM table2
WHERE column1 = I_input_param;
BEGIN
FOR table_1_rec in cursor1 LOOP
I_input_param := table_1_rec.column_1;
FOR table_2_rec in cursor2 LOOP
....
....
END LOOP;
END LOOP;
END;
我在这里使用了隐式打开/提取。我希望你明白这一点。
答案 3 :(得分:0)
是的,你可以。 以前曾问过类似的问题。请检查一下: Nested cursor in a cursor