【问题标题】:Retrieving Column Names and Data types in PLSQL在 PLSQL 中检索列名和数据类型
【发布时间】:2012-08-04 00:13:27
【问题描述】:

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

【问题讨论】:

    标签: sql plsql


    【解决方案1】:

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

    需要注意的是,我确保如果 data_scale = 0 我表明它是一个 Integer,如果它是 >0,它是一个 Double。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        你的代码块太多了。这就是你所需要的:

        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;
        

        结束;

        【讨论】:

          【解决方案4】:

          不是 PLSQL 专家,但这是我的观点。

          Select data_type from user_tab_columns where TABLE_NAME = 'YourTableName'
          

          给 Eric 的道具,检查 this 线程和他的答案。

          请记住,您可以使用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 变量选择的数据类型。

          【讨论】:

          • 考虑到数据类型可能是 date 、 Number 、 char varchar 等,我主要关心的是如何声明一个接受 select 语句中的值的变量
          • 我不确定你想用那个变量来完成什么。但我会将 data_type 查询的结果放在一个简单的字符串中(转换或做你必须做的),然后从那里继续前进。
          • 好吧,我当前的查询返回所有带有列的表,我也希望返回数据类型。我对如何使用您给出的 select 语句感到困惑。能给个编码例子吗??
          • 当你打开游标号 2 时,你 FETCH get_columns 到 column_name 变量中,你也应该添加另一个(data_type)。您的光标 2 定义选择了 2 个东西,您希望将这两个东西放入一个变量中。
          • 正是我的问题,v_data_type 的数据类型应该是什么?如果这被拉长了,我很抱歉,但这是我无法掌握的小事
          猜你喜欢
          • 2023-03-16
          • 1970-01-01
          • 2016-04-08
          • 2014-11-28
          • 1970-01-01
          • 2015-06-14
          • 2017-04-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多