微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 通过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()方法.

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

解决方法:

没有标准的方法可以做到这一点.据我所知,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的方法,或者驱动程序实现将解析并为每组接收的参数重新创建语句,以便它可以声明文字DEFAULT.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐