2014-09-11 2 views
3

Можно ли через JDBC отправить почтовый ящик DEFAULT явно, как в INSERT INTO sometables VALUES (blah, DEFAULT)? (Я почти уверен, что ответ «нет», но я ищу подтверждение JDBC-эксперта).Отправка заполнителя 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 это особый экземпляр заполнителя, поскольку, кажется, не быть setDefault() методом PreparedStatement.

Поддерживает ли какой-либо существующий драйвер?

+0

Если у вас мало мест, где требуется значение по умолчанию, вы можете просто иметь две копии: 'insert into mytable (ab) values ​​(?,?)' И 'insert into mytable (ab) values ​​(?,?)' , – 9000

ответ

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 через параметры, или что реализация драйвера будет разобрать и заново заявление для каждого набора полученных параметров, чтобы он мог объявить литерал DEFAULT.

Я не знаю, есть ли драйвер, который в настоящее время поддерживает такое обходное решение.

1

default не является литеральным значением - это псевдоколонка (или, по крайней мере, я надеюсь, что это то, что они называются в postgres). Поскольку это не значение, а часть синтаксиса insert, оно не может быть привязано к заполнителю, как и имя таблицы.

+0

'DEFAULT' - это не только PostgreSQL. См .: http://sqlfiddle.com/#!2/d9dca, http://sqlfiddle.com/#!4/d9dca, http://sqlfiddle.com/#!6/d9dca. (MySQL, Oracle и MS-SQL). Кстати, это единственный раз, когда я смог просто запустить * точно такой же код * для каждого. Я бы назвал это ключевое слово placeholder. –

+0

@CraigRinger вы узнаете что-то новое каждый день, спасибо! Не ожидал найти его на других РСУБ. Не совсем уверен, что это нужно назвать, но IIUC, этот факт не меняет сути моего ответа - это элемент синтаксиса, а не значение, поэтому он не может быть связан. – Mureinik

+0

JDBC имеет 'PreparedStatement.setNull', а' NULL' - это, возможно, тоже «значение». Я надеялся, что есть стандартный, но неясный способ обработки 'DEFAULT', но он выглядит как« нет ». –

Смежные вопросы