我正在编写一个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'声明
答案 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。