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”

4

4 回答 4

3

不是 PLSQL 大师,但这是我的观点。

Select data_type from user_tab_columns where TABLE_NAME = 'YourTableName'

给埃里克的道具,检查这个线程和他的答案。

请记住,您可以使用DESC命令来描述 Oracle 表、视图、同义词、包或函数。它会给你名字、数据类型和长度。如果这确实对您有用,您应该能够获取所有表的数据,尽管我不是游标的忠实粉丝,但您应该做得很好。

试试这个:

-- 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 回答
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 回答
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 我表明它是一个整数,如果它是 >0,它是一个双精度数。

于 2016-08-18T20:47:15.793 回答