在新QUERY中的LOOP中使用光标

时间:2019-07-24 07:34:08

标签: plsql

“我在树林中迷失了森林...”

我想查询在FOR LOOP中检索的表的每一列,但内部查询未返回正确的内容。 似乎内部查询未使用当前的column_name。

DECLARE
v_max_TS TIMESTAMP;

BEGIN

FOR cols IN (SELECT column_name FROM all_tab_cols WHERE table_name = '<tablename>')
LOOP
    SELECT 
    MAX(CURR_TIMESTAMP) INTO v_max_TS
    FROM <tablename> 
    WHERE cols.column_name IS NOT NULL
    ORDER BY TO_TIMESTAMP(CURR_TIMESTAMP,'MM/DD/YYYY HH24:MI:SS') DESC;

    dbms_output.put_line(cols.column_name || '         ' || v_max_TS); 
END LOOP;
END;

1 个答案:

答案 0 :(得分:0)

除了您的查询没有多大意义(如Boneist所说的那样)之外,由于您需要使用动态SQL(execute immediate)来实现此目的,因此这是行不通的。< / p>

这是一个基于Scott架构的示例。看看,必要时进行调整。

SQL> set serveroutput on
SQL> declare
  2    l_str varchar2(200);  -- will hold the SELECT statement
  3    v_max varchar2(30);
  4  begin
  5    for cols in (select column_name
  6                 from all_tab_cols
  7                 where table_name = 'DEPT'
  8                )
  9    loop
 10      l_str := 'select max(' || cols.column_name ||') from dept';
 11      execute immediate l_str into v_max;
 12      dbms_output.put_line(cols.column_name ||': '|| v_max);
 13    end loop;
 14  end;
 15  /
DEPTNO: 40
DNAME: SALES
LOC: NEW YORK

PL/SQL procedure successfully completed.

SQL>