DB2使用存储过程运行SQL语句时务必要escape

Categories: Database; Tagged with: ; @ October 5th, 2010 16:12

譬如: 我Alert一个Column的Nullable后, 需要运行如下语句:

CALL SYSPROC.ALTOBJ ( ‘APPLY_CONTINUE_ON_ERROR’, ‘CREATE TABLE ADMINISTRATOR.TB6 (
ID BIGINT  NOT NULL  WITH DEFAULT 26 ,
NAME VARCHAR (128)  NOT NULL WITH DEFAULT ‘TOM’) IN USERSPACE1 COMPRESS YES ‘, -1, ? );

注意看, NAME中名字都将默认叫做TOM, 但不论通过JDBC还是DB2Control Center运行, 都会出现错误:

SQL0104N  An unexpected token "TOM" was found following "NULL WITH DEFAULT ‘"….

User response:
Examine and correct the statement in the area of the specified token.

sqlcode: –104 
sqlstate: 42601

这不是让我费解的问题, 平日里咱最擅长的就是制造一大堆问题. 但DB2CC很贱, 生成出来的SQL语句就是这样, 但它死活就是有错误.

解决方法:

对普通的SQL来说, 无需转义, 可直接运行; 但作为存储过程的参数, 所以必须先转义(不论运行在DB2CC还是通过JDBC)

否则这句代码就紊乱了, 引号之间就被TOM搞乱套了.

正解:(注意看引号 ‘TOM’ => ”TOM”)

CALL SYSPROC.ALTOBJ ( ‘APPLY_CONTINUE_ON_ERROR’, ‘CREATE TABLE ADMINISTRATOR.TB6 (
ID BIGINT  NOT NULL  WITH DEFAULT 26 ,
NAME VARCHAR (128)  NOT NULL WITH DEFAULT ”TOM”) IN USERSPACE1 COMPRESS YES ‘, -1, ? );

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: TRUNCATE TABLE 清空表内容 SQL语句

Categories: Database; Tagged with: ; @ October 3rd, 2010 22:58

SQL: TRUNCATE TABLE  tableName  IMMEDIATE

See:

1. DB2 TRUNCATE TABLE API

2. Joachim Selke: TRUNCATE TABLE in DB2 LUW

在SQL中使用ADMIN_CMD运行DB2的AdminCommand (Like JDBC Run ReOrg)

Categories: Database; Tagged with: ; @ October 3rd, 2010 22:36

在使用JDBC时, 除了运行SQL语句之外, 可通过存储过程ADMIN_CMD运行Administrator Command.

(more…)

Newer Posts <-> Older Posts



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