2017-09-26 7 views
0

変換されたデータ、別個の値とレコード数を確認する必要があります。私はテーブル名を入力して列を取得し、それを別の値(実際の値ではなく、いくつの個数の個数だけでなく)を得るためにクエリで使用できるようにステートメントを書きたいと思います。ORACLE SQL CURSOR/FOR LOOP

私はLOOP FORカーソルまたはカーソルに必要だと思うし、このようなものを作成:次に、上記

select field_name, count(*) 
from table1 
group by field_name 

のようなもので、私が作成する必要がありますことを使用してクエリを実行し

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; 

を2ループ文?私はまだ1つを作成していないし、私の結果を得るためにコンテキストを得ることができません。あなたはコードの下のパラメータとしてテーブル名を与えることになります考慮

+0

の数と一緒にすべての列一つ一つのすべての値を出力しますからあなたを妨げるものがあります2つのクエリで異なる値とカウントを取得し、キーフィールドでそれらを結合しますか?私は複数のループを実行する前に、動的SQLを試してみます。 –

+0

あなたが達成したいことをより明確に示すかもしれない1つのテーブルだけに期待できるいくつかのサンプル出力を表示するように編集することができます。 – 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;