2017-09-26 59 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;