ORACLE SQL CURSOR / FOR LOOP

时间:2017-09-26 14:11:57

标签: sql oracle for-loop plsql cursor

我需要验证转换后的数据,不同的值和记录计数。我想编写语句,以便我可以输入一个表名,然后检索它的列并在查询中使用它们来获取其不同的值(实际值,而不仅仅是多少个不同的计数)和它们的计数。

我想我需要一个CURSOR或CURSOR FOR LOOP并创建这样的东西:

declare 
    cursor field_name
is 
  select COLUMN_NAME
     from user_tab_cols
     where table_name='TABLE1'
c_field_name    field_name%ROWTYPE;


BEGIN
    OPEN field_name
    loop 
        fetch field_name INTO c_field_name;
        exit when field_name%NOTFOUND;
    end loop;
    CLOSE field_name;
end;

然后使用上面的

运行查询
select field_name, count(*)
from table1
group by field_name

我是否需要创建2个循环语句?到目前为止,我还没有创建一个并且无法获得上下文来获取我的结果。

2 个答案:

答案 0 :(得分:0)

BEGIN
    FOR myrow in (select field_name, count(*) as "count" from table1 group by field_name)
    loop 
        dbms_output.put_line(myrow.field_name);
        dbms_output.put_line(myrow.count);
    end loop;
end;

答案 1 :(得分:0)

考虑到您将提供表名作为参数,代码将逐个打印所有列的所有值以及值的计数

create or replace PROCEDURE PR_PREP(
P_TABLE_NAME IN VARCHAR2)
IS
  CURSOR CUR_COLUMNS (PA_TABLE_NAME VARCHAR2)
  IS
    SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = PA_TABLE_NAME;
  COL_NAMES CUR_COLUMNS%ROWTYPE;
TYPE TYP_RECORD
 IS
 RECORD
 (
   FIELD_NAME VARCHAR2(255),
  CNT        INT);
TYPE TYP_OP_TABLE
IS
 TABLE OF TYP_RECORD;
  OP_TABLE TYP_OP_TABLE;
 I     INT;
 V_SQL VARCHAR2(2000);
BEGIN
  FOR COL_NAMES IN CUR_COLUMNS(P_TABLE_NAME)
   LOOP
     V_SQL := 'SELECT ' || COL_NAMES.COLUMN_NAME || ' AS FIELD_NAME , 
 COUNT(*) AS CNT FROM ' || 
         P_TABLE_NAME || ' GROUP BY ' || COL_NAMES.COLUMN_NAME ;
  --    DBMS_OUTPUT.PUT_LINE (V_SQL);
     EXECUTE IMMEDIATE V_SQL BULK COLLECT INTO OP_TABLE;
  dbms_output.put_line('columna name = ' ||COL_NAMES.COLUMN_NAME);
     FOR I IN OP_TABLE.FIRST .. OP_TABLE.LAST
     LOOP
       DBMS_OUTPUT.PUT_LINE('FIELD VALUE '||OP_TABLE(I).FIELD_NAME || ' COUNT = ' || OP_TABLE(I).CNT);
     END LOOP;
      DBMS_OUTPUT.PUT_LINE('ONE FILED ENDED , NEXT STARTED');
    END LOOP;
 END;