环境:oracle 11g
java :sdk 1.5表 t_sys_user  nm_sid int,st_name varchar2(10),nm_status numeric
其中nm_status 有设置默认值为1
sql=insert into t_sys_user (nm_sid,st_name,nm_status) values(seq.nextval,?,?);
因为考虑是做批量插入,所以sql不想变化,就用这个sql
然后取集合里
preparedStatement.setString(1,'值')
preparedStatement.setInt(2,'值')
因为值可能会空,所以当空值时
setNull(2,Types.varchar)或setNull(2,Types.Numeric);//因为取字段的类型还有些麻烦就先简单这样放
当nm_status是空值时,插入的数据库里该字段也是空
有没有简单点方法处理,不要又像取主键一样还要先查表

解决方案 »

  1.   

    也就是不用去preparedStatement.setInt(2,'值')
      

  2.   

    数据库不是已经定义了nm_status numeric是数字类型了吗
    那就直接按集合里的值是否为空做判断,如果空就调用setNull(2,Types.Numeric),非空就setObject就好了
      

  3.   

    不设的话,不是参数不够会报错的么?
    insert into t_sys_user (nm_sid,st_name) values(seq.nextval,?);
    这样写我知道是会自动赋值的。
    但我考虑是要批量操作,preparedStatement就按字段最多的sql生成一个,
    要不然就是几个preparedStatement,所以sql是固定的
      

  4.   

    没办法的,因为你插入了该值,就算该值为null也不会使用默认值的,所以可以在程序自己判断
    sql=insert into t_sys_user (nm_sid,st_name,nm_status) values(seq.nextval,?,?);
    preparedStatement.setString(1,'值')
    preparedStatement.setInt(2,('值'==null)? '1' : '值'); //null时设置成缺省值
      

  5.   

    因为事实上那个字段是默认值我是不知道的。
    能不能像找主键一样conn.getMetaData().getPrimaryKeys(catalog, schema, table);
    我好像没找到这样的方法。
    真不行我就在oracle里查user_tab_columns里找默认值
      

  6.   

    我现在也太懒了,以前开发都是查api文档,现在都是网上直接找,找不到就没办法了。
    DatabaseMetaData当时调用的时候,看到一大段字段名,也想不到去查api的,其实getColumns()里都有描述。
    COLUMN_DEF String => 默认值(可为 null)。
    不过日期型会返回(getdate()),还要再判断一下,唉。
    谢谢大家,结贴了
      

  7.   

    数据库字段的设置不能为空
    not null