2017-09-26 34 views
0

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

我想我需要for循环CURSOR或CURSOR,创造这样的事情:

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循环语句?我还没有创建一个,并且无法完全获取上下文来获得我的结果。

+0

的计数一起打印一个所有列的所有值由一个有什么阻止你在2个查询中获得不同的值和计数,然后在关键字段上将它们连接在一起?在去做多个循环之前,我会尝试使用动态SQL。 –

+0

如果您可以编辑以显示您可能期望的一些示例输出,那么可以更好地说明您想要实现的功能。 – BriteSponge

回答

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; 
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;