通过JDBC发送DEFAULT占位符?
有没有办法,通过JDBC,显式发送DEFAULT
占位符,就像INSERT INTO sometables VALUES (blah, DEFAULT)
? (我几乎可以肯定答案是“不”,但我正在寻找JDBC专家的确认)。
假设您有一个PreparedStatement
如:
INSERT INTO mytable(a, b) VALUES (?, ?)
对于表:
CREATE TABLE mytable ( a integer, b integer default some_function() );
并且您希望在批处理中的某些执行中使用数据库集DEFAULT
for mytable.b
,而不是其他执行。
在常规SQL中你会写:
INSERT INTO mytable(a, b) VALUES (1, 42) INSERT INTO mytable(a, b) VALUES (2, DEFAULT); ...
当然还是:
INSERT INTO mytable(a, b) VALUES (1, 42) INSERT INTO mytable(a) VALUES (2);
…但你不能通过JDBC做到这一点。 setString("DEFAULT")
当然不会发送DEFAULT
关键字,只是字符串文字'DEFAULT'
。
有没有办法在任何广泛使用的驱动程序中设置占位符参数,这意味着DEFAULT
?
我没有看到使用标准API和规范的方法。
我想象的是:
pstmt.setObject(2, Postgresql.DEFAULT, Types.OTHER);
其中Postgresql.DEFAULT
是一个特殊的占位符实例,因为似乎没有PreparedStatement
的setDefault()
方法。
现有的驱动程序是否支持此function
没有标准的方法可以做到这一点。 据我所知,SQL标准不支持声明通过参数声明使用DEFAULT
的机制。 SQL标准似乎假设每个INSERT
都是为其特定目的而精心设计的。 因此,声明DEFAULT
只能在insert语句本身中完成,而不能作为参数的值。 在这些决策中,JDBC规范通常遵循SQL标准。
您目前唯一的方法是在JDBC驱动程序中创建特定于供应商的方法,例如您在问题本身中指定的方法,但您也可以考虑以下内容:
为了澄清:下面是一个驱动程序实现如何解决它的示例,它实际上并不像这样工作。
使用setNull(int, int)
setNull(idx, PostgresTypes.DEFAULT_VALUE)
或者使用setNull(int, int, String)
setNull(idx, Types., Postgres.DEFAULT_VALUE_MARKER)
但是,这假设PostgreSQL实际上有一个通过参数指定DEFAULT
的方法,或者驱动程序实现将解析并重新创建每组接收参数的语句,以便它可以声明文字DEFAULT
。
我不知道目前是否有任何驱动程序支持这种解决方法。
default
值不是值文字 – 它是一个伪列(或者至少我希望它们是postgres中所称的)。 因为它不是值而是insert
语法的一部分,所以它不能绑定到占位符,就像表名不能一样。