【问题标题】:Creating a result set (using a select statement ) within a loop在循环中创建结果集(使用 select 语句)
【发布时间】:2014-03-11 18:56:00
【问题描述】:

我创建了一个游标,它返回一组行。在遍历每一行时,我想从另一个表中获取另一个结果集(通过使用具有来自已处理行的值的 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;

【问题讨论】:

标签: oracle plsql cursor


【解决方案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;

【讨论】:

    【解决方案2】:

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

    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;
    

    这与原始的“循环中的循环”结构完全相同,但使用数据库根据通用标准将表连接在一起,而不是多次打开和关闭游标。

    分享和享受。

    【讨论】:

    • 这应该是首选的方法,因为您问题中的逐行处理可能会导致严重的性能问题。
    【解决方案3】:

    这样的事情可以通过以下方式完成:

    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;
    

    我在这里使用了隐式打开/获取。我希望你能明白。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 2013-10-18
      • 1970-01-01
      • 2012-12-12
      相关资源
      最近更新 更多