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 に答える