1

データベース内のすべての列とテーブルのデータ型を取得する PL SQL ブロックを作成しています。列を取得できますが、データ型は取得できません。良いアプローチの提案を探しています。どんな助けでも大歓迎です。私のコードは次のとおりです

ACCEPT p_1 PROMPT 'Please enter the Table Name'

DECLARE
    v_table_name    VARCHAR2(40) :='&p_1';
    -- First cursor 
    CURSOR get_tables IS    
        SELECT DISTINCT table_name 
        FROM user_tables 
        WHERE UPPER(table_name) = UPPER(v_table_name);
    --Second cursor 
    CURSOR get_columns IS
        SELECT DISTINCT column_name
        FROM user_tab_columns
        WHERE table_name = v_table_name;
    v_column_name   VARCHAR2(100);
    -- Third Cursor
    CURSOR get_types IS
        SELECT data_type 
        FROM user_tab_columns
        WHERE table_name = v_table_name;

    v_data_type user_tab_columns.data_type%type;
BEGIN
    -- Open first cursor
    OPEN get_tables;
    FETCH get_tables INTO v_table_name;
    DBMS_OUTPUT.PUT_LINE(' ');
    DBMS_OUTPUT.PUT_LINE('Table = ' || v_table_name );
    DBMS_OUTPUT.PUT_LINE('=========================');
    CLOSE get_tables;
    -- Open second cursor
    OPEN get_columns;
    FETCH get_columns INTO v_column_name;
    WHILE get_columns%FOUND LOOP
        DBMS_OUTPUT.PUT_LINE('  ' || v_column_name);
        FETCH get_columns INTO v_column_name;
    END LOOP;
    CLOSE get_columns;
    --Open Third Cursor
    OPEN get_types;
    FETCH get_types into v_data_type;
    WHILE get_types%FOUND LOOP
        DBMS_OUTPUT.PUT_LINE(' ' || v_data_type );
        FETCH get_types into v_data_type;
    END LOOP;

    CLOSE get_types;     
END;

私のエラーはPLS-00371を示しています:「V_DATA_TYPE」の宣言は最大1つ許可されています

4

4 に答える 4

3

努力はしましたが、コードが多すぎます。あなたは短い休暇が必要です:)

SELECT table_name,
       column_name,
       data_type,
       data_length,
       nullable
FROM cols
WHERE table_name='&YOUR_TABLE'
ORDER BY column_id
于 2012-08-07T23:21:14.630 に答える
3

PLSQLの第一人者ではありませんが、これが私の穀物です。

Select data_type from user_tab_columns where TABLE_NAME = 'YourTableName'

エリックへの小道具、このスレッドと彼の答えをチェックしてください。

command を使用DESCして、Oracle のテーブル、ビュー、シノニム、パッケージ、または関数を記述できることに注意してください。名前、data_type、および長さを提供します。これが実際に機能する場合は、すべてのテーブルのデータを取得できるはずですが、私はカーソルの大ファンではありませんが、うまくいくはずです。

これを試して:

-- Open second cursor
            OPEN get_columns;
            LOOP
            FETCH get_columns INTO v_column_name, v_data_type;
            EXIT WHEN get_columns%NOTFOUND;
            DBMS_OUTPUT.PUT_LINE('  ' || v_column_name);
            END LOOP;
            CLOSE get_columns;
    END LOOP;

v_data_typeただし、変数に選択したデータ型には注意してください。

于 2012-08-07T01:53:33.953 に答える
0

ブロックのコードが多すぎます。必要なのはこれだけです:

begin
    for r in ( select column_name, data_type
               from    user_tab_columns 
               where table_name = upper('&&p_1')
               order by column_id )
    loop
        dbms_output.put_line(r.column_name ||' is '|| r.data_type );
    end loop;

終わり;

于 2012-08-07T17:15:41.993 に答える
0

同様の問題が発生しました。ここで表示できます:動的 SQL を使用したテーブル構造の取得

注意すべき点として、data_scale = 0 の場合は Integer であることを示し、>0 の場合は Double であることを確認しました。

于 2016-08-18T20:47:15.793 に答える