在PLSQL中检索列名和数据类型
我正在编写一个PL SQL块,用于检索数据库中表的所有列和数据类型。我可以得到列,但不能得到数据类型。寻找一个好方法的建议。任何帮助都将不胜感激。我的代码如下在PLSQL中检索列名和数据类型,sql,plsql,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 D
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”声明不是PLSQL专家,但这是我的要点
Select data_type from user_tab_columns where TABLE_NAME = 'YourTableName'
给Eric道具,检查线程和他的答案
请记住,您可以使用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变量选择的数据类型。不是PLSQL专家,但这是我的要点
Select data_type from user_tab_columns where TABLE_NAME = 'YourTableName'
给Eric道具,检查线程和他的答案
请记住,您可以使用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变量选择的数据类型。您的块有太多的代码。这就是您所需要的:
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;
结束 您的块的代码太多了。这就是您所需要的:
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;
结束 很好,但是代码太多了。你需要一个短暂的假期:
SELECT table_name,
column_name,
data_type,
data_length,
nullable
FROM cols
WHERE table_name='&YOUR_TABLE'
ORDER BY column_id
很好的努力,但是代码太多了。你需要一个短暂的假期:
SELECT table_name,
column_name,
data_type,
data_length,
nullable
FROM cols
WHERE table_name='&YOUR_TABLE'
ORDER BY column_id
我遇到了类似的问题。可以在此处查看:
需要注意的是,我确保如果data_scale=0,我指示它是一个整数,如果它大于0,则是一个双精度数。我遇到了类似的问题。可以在此处查看:
需要注意的是,我确保如果data_scale=0,我指出它是一个整数,如果它大于0,它是一个双精度。我主要关心的是,考虑到数据类型可以是日期、数字、时间和时间,我如何声明一个变量来接受select语句中的值,char varchar etcI我不确定你想用这个变量实现什么。但是,我会将数据类型查询的结果放在一个简单的字符串转换中,或者做您必须做的事情,然后从那里向前移动。我不知道如何使用你给出的select语句。您能给出一个编码示例吗?当您打开游标编号2时,将get_列提取到column_name变量中,您应该将另一个也添加到data_type中。游标2定义选择了两个对象,您希望将这两个对象放在一个变量中。我的问题是,v_data_type的数据类型应该是什么?我很抱歉,如果这是拉伸,但这是我无法掌握的一件小事,我主要关心的是,考虑到数据类型可能是date、Number、char varchar etcI这一事实,我不确定如何声明一个可以接受select语句中的值的变量。我不确定您试图用该变量实现什么。但是,我会将数据类型查询的结果放在一个简单的字符串转换中,或者做您必须做的事情,然后从那里向前移动。我不知道如何使用你给出的select语句。您能给出一个编码示例吗?当您打开游标编号2时,将get_列提取到column_name变量中,您应该将另一个也添加到data_type中。游标2定义选择了两个对象,您希望将这两个对象放在一个变量中。我的问题是,v_data_type的数据类型应该是什么?我很抱歉,如果这是拉伸,但这是一个小事情,我无法掌握