1

是否可以将列的大小(例如 varchar2(25))增加 50?准确地说,我不是在寻找这样的东西:

ALTER TABLE <Table_name> modify <Column_name> varchar2(75);

相反,我很好奇将大小增加 50 或其他整数常量的东西,而无需程序员部分的显式计算。

PS:如果我不清楚,请发表评论。

4

1 回答 1

3

为了清楚起见,您似乎在寻求一种在不知道原始大小的情况下将固定值添加到列大小的方法(因此询问如何添加 50 并不允许将其直接设置为 75,这需要知道它开始时是 25 岁)。

大多数数据库提供系统表或视图,为您提供有关各种对象的元数据。例如,DB2/z 有sysibm.syscolumns,Oracle 有all_tab_columns,如这个链接所示。

如果您想在事先不知道大小的情况下将列扩展 50,您可以简单地查阅元数据以获取当前大小,然后添加 50,构造一个语句来为您完成。

换句话说,使用类似的东西:

select char_length from all_tab_columns
    where owner = '<Table_owner>'
    and table_name = '<Table_name>'
    and column_name = '<Column_name>'

然后从记录集中提取该数字,添加 50,并使用来动态构造和执行一条alter table语句,类似于您的问题中假设您已经知道所需长度的语句。

user_tab_columns如果您只关心您自己的表格而不是您能看到的所有表格,您也可以使用该视图。在这种情况下,您无需关注该where owner =子句。


尽管此示例代码特定于 DB2/z 元数据,但将其转换为相应的 Oracle 版本并不需要太多时间:

import java.io.*;
import java.util.*;
import java.sql.*;

class chgcolsz {
    public void chgcolsz() {}

    public static void main (String args[]) {
        Connection conn;
        try {
            Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance();
            conn = DriverManager.getConnection(
                "jdbc:db2://MyBox:9999/MyInstance", "Me", "MyPassword");
            conn.setAutoCommit (true);
        } catch (Exception e) {
            System.out.println ("** Error: DB connect: " + e);
            e.printStackTrace();
            return;
        }

        String cmd =
            "select length from sysibm.syscolumns" +
            " where tbcreator = 'PAX'" +
            " and tbname = 'XYZZY'" +
            " and name = 'COLUMN1'";
        ResultSet rs;
        try {
            Statement sttmnt = conn.createStatement();
            rs = sttmnt.executeQuery (cmd);
        } catch (Exception e) {
            rs = null;
            System.out.println ("** Warning: rowset create: '" +
                cmd + "': " + e);
            e.printStackTrace();
        }

        int sz = -1;
        if (rs != null) {
            try {
                rs.next();
                sz = rs.getInt(1);
                rs.close();
            } catch (Exception e) {
                System.out.println ("** Warning: rowset close: " + e);
                e.printStackTrace();
            };
        }
        if (sz != -1) {
            System.out.println ("Current size is " + sz);
            cmd = "alter table pax.xyzzy" +
                " alter column column1" +
                " set data type" +
                " varchar(" + (sz + 50) + ")";
            System.out.println ("Executing: " + cmd);
            try {
                Statement sttmnt = conn.createStatement();
                sttmnt.execute (cmd);
            } catch (Exception e) {
                System.out.println ("** Warning: table alter: '" +
                    cmd + "': " + e);
                e.printStackTrace();
            }
        }

        try {
            conn.close();
        } catch (Exception e) {
            System.out.println ("** Warning: DB close: " + e);
            e.printStackTrace();
        };
    }
}

您可以从该程序的后续运行中看到,它每次将列宽增加 50:

pax> java chgcolsz
Current size is 50
Executing: alter table pax.xyzzy alter column column1 set data type varchar(100)

pax> java chgcolsz
Current size is 100
Executing: alter table pax.xyzzy alter column column1 set data type varchar(150)

pax> java chgcolsz
Current size is 150
Executing: alter table pax.xyzzy alter column column1 set data type varchar(200)
于 2013-09-17T07:11:29.193 回答