在oracle中增加Varchar2()的大小

时间:2013-09-17 06:56:48

标签: sql oracle oracle10g

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

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

相反,我对于在没有程序员部分的显式计算的情况下将大小增加50或其他整数常量的事情好奇。

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

1 个答案:

答案 0 :(得分:3)

为了清楚起见,您似乎想要一种方法来为列大小添加固定值而不知道原始大小是什么(因此询问如何添加50并禁止将其直接设置为75,这将是要求知道它是25开始。)

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

如果您想在不事先知道大小的情况下将列扩展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)