Oracle 在循环中创建结果集(使用select语句)

Oracle 在循环中创建结果集(使用select语句),oracle,plsql,cursor,Oracle,Plsql,Cursor,我创建了一个游标,它将返回一组行。在遍历每一行时,我希望从另一个表中获得另一个结果集(通过使用WHERE子句和处理过的行中的值组成SELECT语句)。我是PLSQL的新手。你能告诉我怎么做吗?(在循环游标的结果集时,是否可以在循环内定义游标) 如果我说不清楚,请原谅 提前谢谢 DECLARE CURSOR receipts IS SELECT CREATED_T, ACCT_NO, AMT FROM receipt_t

我创建了一个游标,它将返回一组行。在遍历每一行时,我希望从另一个表中获得另一个结果集(通过使用WHERE子句和处理过的行中的值组成SELECT语句)。我是PLSQL的新手。你能告诉我怎么做吗?(在循环游标的结果集时,是否可以在循环内定义游标)

如果我说不清楚,请原谅

提前谢谢

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;

类似的操作可以通过以下方式完成:

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;

我在这里使用了隐式的open/fetch。我希望您能理解。

是的,您可以定义一个游标,它接受一组参数,并在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;

是的,你可以这么做,但绝对没有理由这么做。请尝试以下操作:

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;
这与原始的“循环中的循环”结构的工作完全相同,但使用数据库根据公共条件将表连接在一起,而不是多次打开和关闭游标


分享和享受。

基本上,你的问题的答案是:是的,你可以嵌套游标。如果您发布示例代码,将更容易为您提供更实用的建议。是的,您可以。以前也有人提出过类似的问题。请检查:这应该是首选的方法,因为您的问题中的逐行处理可能会导致严重的性能问题。