Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PLSQL中检索列名和数据类型_Sql_Plsql - Fatal编程技术网

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

在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

我正在编写一个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”声明

不是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的数据类型应该是什么?我很抱歉,如果这是拉伸,但这是一个小事情,我无法掌握