在PLSQL中检索列名和数据类型

时间:2012-08-07 01:37:28

标签: sql plsql

我正在编写一个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 个答案:

答案 0 :(得分:3)

不是PLSQL大师,但这是我的遗产。

Select data_type from user_tab_columns where TABLE_NAME = 'YourTableName'

转发给Eric,检查this帖子和他的答案。

请记住,您可以使用DESC命令来描述Oracle表,视图,同义词,包或函数。它会给你name,data_type和lengh。 如果这实际上对你有用,你应该能够获得所有表的数据,虽然我不是游标的忠实粉丝,你应该做得很好。

试试这个:

-- 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变量选择的数据类型。

答案 1 :(得分:3)

努力,但代码太多了。你需要一个短暂的假期:))

SELECT table_name,
       column_name,
       data_type,
       data_length,
       nullable
FROM cols
WHERE table_name='&YOUR_TABLE'
ORDER BY column_id

答案 2 :(得分: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;

端;

答案 3 :(得分:0)

我遇到了类似的问题。可在此处查看:Retrieving Table Structure with Dynamic SQL

值得注意的是,我确保如果data_scale = 0,我表示它是一个整数,如果它是> 0,那么它就是一个Double。