oracle 如何在对表中的特定列名进行连接后使用游标访问不同表的不同列

yeotifhr  于 2023-02-07  发布在  Oracle
关注(0)|答案(2)|浏览(113)

因此,我在理解如何使用游标访问不同的列名时遇到了问题,在游标中,对三个不同的表的单个公共列执行了连接操作。
例如

DECLARE
  CURSOR joined_table_cur IS
    SELECT a.col1, a.col2, b.col5, c.col7 ...
    FROM table1 a
    JOIN table2 b ON a.col1 = b.col1 JOIN
    table3 c on b.col1 = c.col1 
;

  joined_table_rec joined_table_cur%ROWTYPE;
BEGIN
  FOR joined_table_rec IN joined_table_cur
  LOOP    
   -- how to access col7 from table3 ie c in this cursor--
  END LOOP;
END;

我不明白怎么做这件事。

nmpmafwu

nmpmafwu1#

要在示例中循环遍历游标行,只需在下面的代码中使用第二种类型的循环,并使用已声明的变量joined_table_rec引用列-对于col 1,它是joined_table_rec.col1,对于col 2,它是joined_table_rec.col2......依此类推。
如果你想使用FOR LOOP,那么你不需要声明joined_table_rec变量,因为for循环会自己创建变量-只需要在下面的代码中给予名称-rec 2。下面是两种循环游标的方法的示例:

SET SERVEROUTPUT ON
DECLARE
  CURSOR cur IS
    SELECT *
    FROM
    (
          Select 1 "COL_ID", 'Name 1' "COL_NAME", 'Somethong else 1' "COL_ELSE" From Dual Union All
          Select 2 "COL_ID", 'Name 2' "COL_NAME", 'Somethong else 2' "COL_ELSE" From Dual Union All
          Select 3 "COL_ID", 'Name 3' "COL_NAME", 'Somethong else 3' "COL_ELSE" From Dual
    );
    rec cur%ROWTYPE;
    m_sql VarChar2(500);
BEGIN

  FOR rec2 IN cur LOOP
      DBMS_OUTPUT.PUT_LINE(rec2.COL_ID);
  END LOOP;
  

  OPEN cur;
  LOOP   
        FETCH cur Into rec;
        EXIT WHEN cur%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(rec.COL_NAME);
  END LOOP;
  CLOSE cur;
END;

Result: 
anonymous block completed
1
2
3
Name 1
Name 2
Name 3

更多关于它here

luaexgnf

luaexgnf2#

这不是答案。d r已经回答了您的问题,并解释了如何访问您的游标的两个选项。
我只想补充一点,你根本不需要显式的游标,我通常是这样做的:

BEGIN
  FOR rec IN
  (
    SELECT a.col1, a.col2, b.col5, c.col7 ...
    FROM table1 a
    JOIN table2 b ON a.col1 = b.col1
    JOIN table3 c ON b.col1 = c.col1 
  )
  LOOP    
    DBMS_OUTPUT.PUT_LINE('table1.col1 is ' || rec.col1);
    DBMS_OUTPUT.PUT_LINE('table2.col5 is ' || rec.col5);
    ...
  END LOOP;
END;

就当这是对dr答案的评论吧,我只是把它作为“答案”贴在这里,因为如果没有换行符,它很难被当作评论来阅读。

相关问题