有没有办法通过JDBCDEFAULT显式发送占位符,如in INSERT INTO sometables VALUES (blah, DEFAULT)?(我几乎可以肯定答案是“否”,但是我正在寻找JDBC专家确认)。
DEFAULT
INSERT INTO sometables VALUES (blah, DEFAULT)
假设您有一个PreparedStatement赞:
PreparedStatement
INSERT INTO mytable(a, b) VALUES (?, ?)
对于表:
CREATE TABLE mytable ( a integer, b integer default some_function() );
并且您想在一批执行中使用数据库集DEFAULT,而mytable.b在其他执行中则不使用。
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关键字,而只会发送string- literal 'DEFAULT'。
setString("DEFAULT")
'DEFAULT'
有没有一种方法可以设置占位符参数,这DEFAULT在任何广泛使用的驱动程序中都意味着?
我看不到使用标准API和规范执行此操作的方法。
我在想像这样的东西:
pstmt.setObject(2, Postgresql.DEFAULT, Types.OTHER);
其中Postgresql.DEFAULT是一个特殊的占位符实例,因为似乎没有用于的setDefault()方法PreparedStatement。
Postgresql.DEFAULT
setDefault()
现有的驱动程序是否支持此功能?
没有标准的方法可以做到这一点。据我所知,SQL标准不支持声明使用DEFAULT直通参数的机制。SQL标准似乎假定每个对象INSERT都是为特定目的而设计的。因此,声明DEFAULT只能在insert语句本身中进行,而不能作为参数的值进行。在这些决策中,JDBC规范通常遵循SQL标准。
INSERT
当前唯一的方法是在JDBC驱动程序中创建特定于供应商的方法,例如您在问题本身中指定的方法,但是您还可以想到以下内容:
需要澄清的是:下面是一个驱动程序实现如何解决它的示例,它实际上并不是这样工作的。
使用 setNull(int, int)
setNull(int, int)
setNull(idx, PostgresTypes.DEFAULT_VALUE)
或使用 setNull(int, int, String)
setNull(int, int, String)
setNull(idx, Types.<correct-field-type>, Postgres.DEFAULT_VALUE_MARKER)
但是,这是假设PostgreSQL实际上有一种DEFAULT通过参数指定的方法,或者驱动程序实现将为每个接收到的参数集解析并重新创建语句,以便它可以声明文字DEFAULT。
我不知道当前是否有任何驱动程序支持这种解决方法。