通过JDBC发送DEFAULT占位符?

时间:2014-09-11 05:21:10

标签: java sql jdbc

有没有办法通过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 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()方法。

现有的驱动程序是否支持此功能?

2 个答案:

答案 0 :(得分:3)

没有标准的方法可以做到这一点。据我所知,SQL标准不支持声明使用DEFAULT通过参数的机制。 SQL标准似乎假设每个INSERT都是为了特定目的而精心设计的。因此,声明DEFAULT只能在insert语句本身中完成,而不能作为参数的值。在这些决策中,JDBC规范通常遵循SQL标准。

您目前唯一的方法是在JDBC驱动程序中创建特定于供应商的方法,例如您在问题本身中指定的方法,但您也可以考虑以下内容:

澄清一下:下面是一个驱动程序实现如何解决它的示例,它实际上并不像这样。

使用setNull(int, int)

setNull(idx, PostgresTypes.DEFAULT_VALUE)

或使用setNull(int, int, String)

setNull(idx, Types.<correct-field-type>, Postgres.DEFAULT_VALUE_MARKER)

然而,这假设PostgreSQL实际上有一个通过参数指定DEFAULT的方法,或者驱动程序实现将解析并为每组接收的参数重新创建语句,以便它可以声明文字{{1} }。

我不知道目前是否有任何驱动程序支持这种解决方法。

答案 1 :(得分:1)

default不是一个价值字面 - 它是一个伪列(或者至少我希望它们是在postgres中调用的)。由于它不是一个值,而是insert语法的一部分,因此它不能绑定到占位符,就像表名不能一样。