2012-08-07 68 views
1

我正在编写一个PL SQL块,用于检索数据库中所有表的列和数据类型。我能够获得列,但不能获取数据类型。寻找一个好方法的建议。任何帮助,将不胜感激。我的代码如下在PLSQL中检索列名和数据类型

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”允许

回答

3

不是PLSQL大师,但这里是我的粮食。

Select data_type from user_tab_columns where TABLE_NAME = 'YourTableName' 

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

记住你可以用DESC命令来描述一个Oracle表,视图,同义词,包装或功能。它会给你名字,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变量的数据类型。

+0

我主要关心的是如何做我宣布,将从您的select语句接受的值的变量,考虑的事实,数据类型可以是日期,数字,字符等的varchar – user1576782 2012-08-07 01:55:56

+0

我不知道你想什么完成这个变量。但是我会将data_type查询的结果放在一个普通的简单字符串中(转换或做你必须做的)并从那里向前移动。 – 2012-08-07 02:00:52

+0

那么,我目前的查询返回所有的表与列,我也希望返回数据类型。我很困惑如何使用你给出的select语句。你能给一个编码例子吗? – user1576782 2012-08-07 02:03:26

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; 

end;

3

很好的努力,但代码太多。你需要短暂的假期:)

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