Компонент apache camel sql ORA-00947: недостаточно значений
Это мой маршрут Java DSL:
from("seda:singlePersonChannel")
.log(LoggingLevel.INFO, "Person bean: ${body}")
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
Person person = exchange.getIn().getBody(Person.class);
exchange.getOut().setBody(person.toSqlMap());
}
})
.log(LoggingLevel.INFO, "Inserting into PERSON values: ${body}")
.to("sql:INSERT INTO person (given_name, family_name) VALUES " +
":#givenName, :#familyName");
Консоль показывает правильно отформатированный DML:
Sql = INSERT INTO person (given_name, family_name) VALUES :1 , :2 , OriginalSql = INSERT INTO person (given_name, family_name) VALUES ?, ?, Error Msg = ORA-00947: not enough values
Обе переменные связывания имеют значения, так что это не проблема с нулями:
15:20:58.622 INFO [Camel (camel-1) thread #1 - seda://singlePersonChannel][route2] Person bean: Person{givenName=Given Name -593520961, familyName=Family Name 1883898232}
15:20:58.622 INFO [Camel (camel-1) thread #1 - seda://singlePersonChannel][route2] Inserting into PERSON values: {givenName=Given Name -593520961, familyName=Family Name 1883898232}
И все же Oracle возвращается:
ORA-00947: not enough values
Для полноты картины мой конфиг:
<!-- the JDBC data source -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@DB-SVR-1:1521:DEV112A" />
<property name="username" value="integration" />
<property name="password" value="integration" />
</bean>
<bean id="sql" class="org.apache.camel.component.sql.SqlComponent">
<property name="dataSource" ref="dataSource" />
</bean>
Исходное утверждение имело 15 столбцов и значений и давало ту же ошибку. Кстати, все столбцы таблицы обнуляются.
1 ответ
Это из-за синтаксиса VALUES
, значения должны быть заключены в скобки ()
VALUES ?, ?
Так и должно быть
.log(LoggingLevel.INFO, "Inserting into PERSON values: ${body}")
.to("sql:INSERT INTO person (given_name, family_name) VALUES(" +
":#givenName, :#familyName)");