通过JDBC使用DB2 ALTOBJ存储过程Alter Column

Categories: Database; Tagged with: ; @ October 5th, 2010 17:04

本文将简述通过JDBC呼叫DB2的ALTOBJ存储过程, 以进行Column的Alter操作.
API: http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0011934.htm

ALTOBJ procedure Alter column 须知:

1. 对于Alter Column的操作, 如: 重命名, 修改数据类型, 修改nullable, 扩大数据范围等操作, 不可通过单纯的SQL语句执行. 需要呼叫ALTOBJ存储过程进行修改.

2. 如果使用ATLOBJ 修改Column, Column的数据,  原有PrimaryKey, 相关的Index, 都不会改变.

3. 特别的, 对于重命名列:

– 如果为PrimaryKey, DB2在重新创建Table时会使用新的名称创建主键.

-  但对于有关的Index – 在重建时, DB2使用旧的名称创建Index, 会出现错误, 解决方法是在呼叫存储过程前, 先Drop被重命名的Column对应的Index, 在存储过程呼叫完毕(Table已重建)后, 再次Create Index即可.

4. 对于修改Default/AutoIncrement, 可通过单纯的SQL Alert语句执行就可完成.

使用ALTOBJ存储过程AlertColumn举例:

以下重命名一个Column (由db2 Control Center show sql生成):

CALL SYSPROC.ALTOBJ ( ‘APPLY_CONTINUE_ON_ERROR’, ‘CREATE TABLE TB6 (
  ID INTEGER NOT NULL  GENERATED ALWAYS AS IDENTITY (START WITH 0, INCREMENT BY 1),
  NAME3 INTEGER  DEFAULT 96 ) IN USERSPACE1 COMPRESS YES ‘, -1, ? )

注意: 该语句只能在DB2工具中使用, 还不能直接在JDBC中.

在JDBC中使用ALTOBJ Alert Column:

按照API中ALTOBJ procedure的说明: 第一个参数(上面语句-1处), 为INOUT类型, 既作为输入参数又作为输出参数(INOUT参数介绍), 因此在JDBC使用时会要求注册out parameter, 在JDBC中则需要使用:

String sql = "CALL SYSPROC.ALTOBJ ( 'APPLY_CONTINUE_ON_ERROR', 'CREATE TABLE TB6 (
  ID INTEGER NOT NULL  GENERATED ALWAYS AS IDENTITY (START WITH 0, INCREMENT BY 1),
  NAME3 INTEGER  DEFAULT 96 ) IN USERSPACE1 COMPRESS YES ', ?, ? ))"; 
	// 第一个参数为INOUT参数, 第二个为OUT 

        CallableStatement proc = connection.prepareCall(sql);
        proc.setInt(1, -1); // 作为IN时, 提供Value
        proc.registerOutParameter(1, Types.INTEGER);  // 作为OUT时 注册输出参数

        proc.registerOutParameter(2, Types.VARCHAR); // 第二个参数为OUT参数, 仅注册.

proc.executeUpdate();

DB2 SQL0469N SQLCode-469 SQLSTATE:42886 错误解决

Categories: Database; Tagged with: ; @ October 5th, 2010 0:58

今天在使用JDBC呼叫DB2存储过程时, 出现如题错误.

因为SQL代码在DB2 Editor中运行无误, 但使用JDBC屡屡出错, 最终原因在于在JDBC中INOUT参数只IN未OUT.

DB2CC中自动生成的SQL中直接设定了IN的Value, 但实际要求为INOUT参数, 在JDBC中使用时便会报错.

解决方法为: 查看对应存储过程的API, 修改SQL语句(注意: db2cc自动生成的SQL可能并不适用于JDBC, 还应以API为准).

(more…)

JDBC CallableStatement INOUT Parameter 参数使用

Categories: Java; Tagged with: ; @ October 5th, 2010 0:48

INOUT参数既作输入又做输出用.  除了需要使用setDataType(value)之外, 还需要registerOutParameter. 例如:

String sql = "CALL ALTOBJ ( SOMETHING, ?, ?)"; // 第一个参数为INOUT参数, 第二个为OUT 

        CallableStatement proc = connection.prepareCall(sql);
        proc.setInt(1, -1); // 作为IN时, 提供Value
        proc.registerOutParameter(1, Types.INTEGER);  // 作为OUT时 注册输出参数

        proc.registerOutParameter(2, Types.VARCHAR); // 第二个参数为OUT参数, 仅注册.

proc.executeUpdate();

See:

JDBC基础教程之CallableStatement http://www.java-cn.com/club/html/42/n-4942.html

DB2获得表内主键 Get PrimaryKeys

Categories: Database; Tagged with: ; @ October 3rd, 2010 14:50

SQL:

SELECT * FROM SYSIBM.SYSCOLUMNS WHERE TBCREATOR NOT LIKE ‘SYS%’ AND TBNAME = ‘TABLENAME‘ AND KEYSEQ > 0 ORDER BY KEYSEQ ASC;

(more…)

使用JDBC获取DB2的所有表(getTables)

Categories: Database; Tagged with: ; @ October 2nd, 2010 23:15

直接使用metadata.getTables似乎不能获取DB2中指定Database下的所有Table, 但可使用如下语句获取:

"SELECT CREATOR,NAME FROM SYSIBM.SYSTABLES WHERE CREATOR NOT LIKE ‘SYS%’";

参考链接:

View Tables of DB2 Database using JDBC http://bytes.com/topic/db2/answers/704725-view-tables-db2-database-using-jdbc

Newer Posts <-> Older Posts



// Proudly powered by Apache, PHP, MySQL, WordPress, Bootstrap, etc,.