通过 JDBC 发送 DEFAULT 占位符?

Cra*_*ger 9 java sql jdbc

有什么方法可以通过 JDBCDEFAULT显式发送占位符,例如 in INSERT INTO sometables VALUES (blah, DEFAULT)?(我几乎可以肯定答案是“否”,但我正在寻找 JDBC 专家的确认)。

假设你有一个PreparedStatement赞:

INSERT INTO mytable(a, b) VALUES (?, ?)
Run Code Online (Sandbox Code Playgroud)

对于表:

CREATE TABLE mytable (
    a integer,
    b integer default some_function()
);
Run Code Online (Sandbox Code Playgroud)

并且您想在批处理中的某些执行中使用数据库集DEFAULTmytable.b而不是其他。

在常规 SQL 中,你会写:

INSERT INTO mytable(a, b) VALUES (1, 42)
INSERT INTO mytable(a, b) VALUES (2, DEFAULT);
...
Run Code Online (Sandbox Code Playgroud)

或者当然:

INSERT INTO mytable(a, b) VALUES (1, 42)
INSERT INTO mytable(a) VALUES (2);
Run Code Online (Sandbox Code Playgroud)

...但您不能通过 JDBC 执行此操作。setString("DEFAULT")当然不会发送DEFAULT关键字,只会发送字符串文字'DEFAULT'

有没有办法设置一个占位符参数,这意味着DEFAULT在任何广泛使用的驱动程序中?

我没有看到使用标准 API 和规范来做到这一点的方法。

我在想象这样的事情:

pstmt.setObject(2, Postgresql.DEFAULT, Types.OTHER);
Run Code Online (Sandbox Code Playgroud)

这里Postgresql.DEFAULT是一个特殊的占位符实例,因为似乎没有成为一个setDefault()对方法PreparedStatement

有没有现有的驱动程序支持这个?

Mar*_*eel 3

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

您当前拥有的唯一方法是在 JDBC 驱动程序中创建特定于供应商的方法,例如您在问题本身中指定的方法,但您也可以想到类似的方法:

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

使用setNull(int, int)

setNull(idx, PostgresTypes.DEFAULT_VALUE)
Run Code Online (Sandbox Code Playgroud)

或使用setNull(int, int, String)

setNull(idx, Types.<correct-field-type>, Postgres.DEFAULT_VALUE_MARKER)
Run Code Online (Sandbox Code Playgroud)

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

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