DatabaseMetaDataでドコまで取れるか、何が取れないのか
昨日のエントリーで、ちょっと嘘ついちゃいました。
ユーザ定義の詳細は、DatabasetMetaDataの別メソッドを使えば、
もうちょっと取れます。
ということで、
DatabaseMetaDataでどんな情報が取れるか見ていこう。
こんなコードを書いてみる。
public class DmdTest {
private static final String PATH = "j2ee.dicon";
public static void main(String[] args) throws Exception {
S2Container container = S2ContainerFactory.create(PATH);
container.init();
DataSource ds = (DataSource) container.getComponent(DataSource.class);
Connection conn = ds.getConnection();
DatabaseMetaData dmd = ConnectionUtil.getMetaData(conn);
ResultSet rs = dmd.getProcedures(null, "接続ユーザ名", "%");
printResultSet(rs);
}
private static void printResultSet(ResultSet rs) throws SQLException {
ResultSetMetaData rsMetaData = rs.getMetaData();
int columnSize = rs.getMetaData().getColumnCount();
StringBuffer buf = new StringBuffer("|*Column Names");
for (int i = 1; i < columnSize; i++) {
buf.append("|*" + rsMetaData.getColumnName(i));
}
System.out.println(buf.append("|"));
while (rs.next()) {
buf = new StringBuffer("|").append(rs.getRow());
for (int i = 1; i < columnSize; i++) {
buf.append("|" + rs.getObject(i));
}
System.out.println(buf.append("|"));
}
}
}printResultSetは、ResultSetの内容をはてなのテーブル形式で、標準出力に表示するだけのメソッド。
まずは、DatabaseMetaData#getProceduresで取れる値。
ResultSet rs = dmd.getProcedures(null, "接続ユーザ", "%");
| Column Names | PROCEDURE_CAT | PROCEDURE_SCHEM | PROCEDURE_NAME | NULL | NULL | NULL | REMARKS |
|---|---|---|---|---|---|---|---|
| 1 | null | 接続ユーザ名 | NEW_PERSON | null | null | null | Standalone procedure or function |
| 2 | null | 接続ユーザ名 | NEW_PERSON_ARRAY | null | null | null | Standalone procedure or function |
| 3 | null | 接続ユーザ名 | PERSON_NAME | null | null | null | Standalone procedure or function |
| 4 | null | 接続ユーザ名 | PERSON_NAME_MERGE | null | null | null | Standalone procedure or function |
| 5 | null | 接続ユーザ名 | SALES_TAX | null | null | null | Standalone procedure or function |
| 6 | null | 接続ユーザ名 | SALES_TAX2 | null | null | null | Standalone procedure or function |
| 7 | null | 接続ユーザ名 | SALES_TAX3 | null | null | null | Standalone procedure or function |
| 8 | null | 接続ユーザ名 | SALES_TAX4 | null | null | null | Standalone procedure or function |
特に問題ないですね。
続いて、DatabaseMetaData#getColumnsで取れる値。
ResultSet rs = dmd.getProcedureColumns(null, "接続ユーザ名", "%", null);
| Column Names | PROCEDURE_CAT | PROCEDURE_SCHEM | PROCEDURE_NAME | COLUMN_NAME | COLUMN_TYPE | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | RADIX | NULLABLE | REMARKS | SEQUENCE | OVERLOAD |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | null | 接続ユーザ名 | NEW_PERSON | null | 5 | 1111 | 接続ユーザ名.PERSON | null | null | null | 10 | 1 | null | 1 | null |
| 2 | null | 接続ユーザ名 | NEW_PERSON | ID | 1 | 3 | NUMBER | 22 | 22 | null | 10 | 1 | null | 2 | null |
| 3 | null | 接続ユーザ名 | NEW_PERSON | NAME | 1 | 12 | VARCHAR2 | null | null | null | 10 | 1 | null | 3 | null |
| 4 | null | 接続ユーザ名 | NEW_PERSON_ARRAY | null | 5 | 1111 | VARRAY | null | null | null | 10 | 1 | null | 1 | null |
| 5 | null | 接続ユーザ名 | NEW_PERSON_ARRAY | null | 4 | 1111 | 接続ユーザ名.PERSON | null | null | null | 10 | 1 | null | 2 | null |
| 6 | null | 接続ユーザ名 | NEW_PERSON_ARRAY | ID1 | 1 | 3 | NUMBER | 22 | 22 | null | 10 | 1 | null | 3 | null |
| 7 | null | 接続ユーザ名 | NEW_PERSON_ARRAY | NAME1 | 1 | 12 | VARCHAR2 | null | null | null | 10 | 1 | null | 4 | null |
| 8 | null | 接続ユーザ名 | NEW_PERSON_ARRAY | ID2 | 1 | 3 | NUMBER | 22 | 22 | null | 10 | 1 | null | 5 | null |
| 9 | null | 接続ユーザ名 | NEW_PERSON_ARRAY | NAME2 | 1 | 12 | VARCHAR2 | null | null | null | 10 | 1 | null | 6 | null |
| 10 | null | 接続ユーザ名 | PERSON_NAME | null | 5 | 12 | VARCHAR2 | null | null | null | 10 | 1 | null | 1 | null |
| 11 | null | 接続ユーザ名 | PERSON_NAME | USER | 1 | 1111 | 接続ユーザ名.PERSON | null | null | null | 10 | 1 | null | 2 | null |
| 12 | null | 接続ユーザ名 | PERSON_NAME_MERGE | null | 5 | 12 | VARCHAR2 | null | null | null | 10 | 1 | null | 1 | null |
| 13 | null | 接続ユーザ名 | PERSON_NAME_MERGE | USERS | 1 | 1111 | VARRAY | null | null | null | 10 | 1 | null | 2 | null |
| 14 | null | 接続ユーザ名 | PERSON_NAME_MERGE | null | 1 | 1111 | 接続ユーザ名.PERSON | null | null | null | 10 | 1 | null | 3 | null |
| 15 | null | 接続ユーザ名 | SALES_TAX | SALES | 1 | 3 | NUMBER | 22 | 22 | null | 10 | 1 | null | 1 | null |
| 16 | null | 接続ユーザ名 | SALES_TAX | TAX | 4 | 3 | NUMBER | 22 | 22 | null | 10 | 1 | null | 2 | null |
| 17 | null | 接続ユーザ名 | SALES_TAX2 | null | 5 | 3 | NUMBER | 22 | 22 | null | 10 | 1 | null | 1 | null |
| 18 | null | 接続ユーザ名 | SALES_TAX2 | SALES | 1 | 3 | NUMBER | 22 | 22 | null | 10 | 1 | null | 2 | null |
| 19 | null | 接続ユーザ名 | SALES_TAX3 | SALES | 2 | 3 | NUMBER | 22 | 22 | null | 10 | 1 | null | 1 | null |
| 20 | null | 接続ユーザ名 | SALES_TAX4 | SALES | 1 | 3 | NUMBER | 22 | 22 | null | 10 | 1 | null | 1 | null |
| 21 | null | 接続ユーザ名 | SALES_TAX4 | TAX | 4 | 3 | NUMBER | 22 | 22 | null | 10 | 1 | null | 2 | null |
| 22 | null | 接続ユーザ名 | SALES_TAX4 | TOTAL | 4 | 3 | NUMBER | 22 | 22 | null | 10 | 1 | null | 3 | null |
型がユーザ定義型 (STRUCT) の所は、TYPE_NAMEが「接続ユーザ名.PERSON」と問題なく取れてるけど、
配列 (VARRAY) はTYPE_NAMEが全部「VARRAY」となってて、期待する「接続ユーザ名.PERSON_ARRAY」が取れない。
うーん。。。
一応、DatabaseMetaData#getUDTsで詳細も見てみる。
ResultSet rs = dmd.getUDTs("%", "接続ユーザ名", "%", null);
| Column Names | TYPE_CAT | TYPE_SCHEM | TYPE_NAME | CLASS_NAME | DATA_TYPE |
|---|---|---|---|---|---|
| 1 | null | 接続ユーザ名 | PERSON | null | STRUCT |
DATA_TYPEもちゃんと取れて問題なし。