Я создал таблицу в базе данных PostgreSQL с 42 столбцами. Пять из них - тип bigint
, тогда как другие - character varying
типа. Затем я попытался вставить данные в некоторые Java-код и библиотеку jdbc из Spring Framework.
Я столкнулся с некоторой ошибкой, которую мне нужно найти, что сложно, потому что в таблице содержится столько столбцов.
Синтаксис в jdbc для вставки в эту таблицу:
String sql = "insert into t_reconcile_stage values("
+ " ?::bigint," // 1 id
+ "?::bigint," // 2 m_participant_id
+ "?::bigint," // 3 m_status_data_id
+ "?," // 4 reconcile_file
+ "?::date," // 5 reconcile_date
+ "?," // 6 transaction_date
+ "?," // 7 transaction_time
+ "?::bigint," // 8 stan
+ "?," // 9 rrn
+ "?," // 10 merchant_type
+ "?," // 11 terminal_id
+ "?," // 12 pan
+ "?," // 13 debit_account
+ "?," // 14 credit_account
+ "?::bigint," // 15 amount
+ "?," // 16 customer_id
+ "?," // 17 participant_reference
+ "?," // 18 data_key
+ "?," // 19 dealer_code
+ "?," // 20 biller_code
+ "?," // 21 product_code
+ "?," // 22 feature_code
+ "?::bigint," // 23 acquire_fee
+ "?::bigint," // 24 issuer_fee
+ "?::bigint," // 25 biller_fee
+ "?::bigint," // 26 switching_fee
+ "?::bigint," // 27 merchant_fee
+ "?," // 28 transaction_type
+ "?," // 29 trfree
+ "?," // 30 free_data1
+ "?," // 31 free_data2
+ "?," // 32 free_data3
+ "?," // 33 free_data4
+ "?," // 34 free_data5
+ "?," // 35 free_data6
+ "?," // 36 free_data7
+ "?," // 37 free_data8
+ "?," // 38 free_data9
+ "?," // 39 free_data10
+ "?::bigint," // 40 settlement_amount
+ "?::bigint," // 41 charge_amount
+ "?" // 42 status
+ ")"; //
simpleJdbcTemplate.update( sql,
d[0],d[1],d[2],d[3],d4,
d[5],d[6],d[7],d[8],d[9],
d[10],d[11],d[12],d[13],d[14],
d[15],d[16],d[17],d[18],d[19],
d[20],d[21],d[22],d[23],d[24],
d[25],d[26],d[27],
d[28],d[29],d[30],d[31],d[32],d[33],d[34],d[35],d[36],d[37],d[38],
d[39],d[40],d[41]
);
И ошибка, которую я получил:
[2014-08-06 10:48:01,753] [ INFO] - org.springframework.jdbc.support.SQLErrorCodesFactory - SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]
[2014-08-06 10:48:01,769] [ERROR] - dwidasa.reconcile.service.etl.PreReconcileImpl - error in -> etl(6000007777-20140608-gabung.txt) error in inserting data = 101932,0608,00006003110,5136,534110565309,201406,05280698950B312D9FF000,000000078281,00000078281,0000000000,000000000,0020 into tabel t_reconcile_stage
org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [insert into t_reconcile_stage values( ?::bigint,?::bigint,?::bigint,?,?::date,?,?,?::bigint,?,?,?,?,?,?,?::bigint,?,?,?,?,?,?,?,?::bigint,?::bigint,?::bigint,?::bigint,?::bigint,?,?,?,?,?,?,?,?,?,?,?,?,?::bigint,?::bigint,?)]; ERROR: invalid input syntax for integer: ""; nested exception is org.postgresql.util.PSQLException: ERROR: invalid input syntax for integer: ""
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:101)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:602)
at org.springframework.jdbc.core.JdbcTe
Я не знаю, в какой колонке произошла ошибка. Поэтому мне нужно вставить данные в столбец таблицы по столбцу, используя оператор try-catch
в java. Возможно ли сделать запрос INSERT
таким образом в Postgres?
Или любой другой подход к обнаружению этой ошибки? Или что-то я пропустил?
(Я начинаю работать с базой данных.)
INSERT
- операция "все или ничего". Вставляется новая строка, и каждый столбец должен быть назначен либо со значением или NULL, либо с явным вводом, либо с столбцом по умолчанию. Так что нет, то, что вы просите, невозможно.
Ошибка, исходящая от Postgres:
ERROR: недопустимый синтаксис ввода для целого: ""
Корень проблемы состоит в том, что вы пытаетесь продать пустую строку как число bigint
, что невозможно. При преобразовании символьных данных в integer вам нужно преобразовать пустые строки в некоторую допустимую форму. Либо 0
либо NULL
(без кавычек).
Одним из способов обхода этой ошибки является назначение значений по умолчанию для ваших столбцов (но не всегда хорошая практика). Таким образом, если вам не хватает данных в инструкции insert, она должна работать со значением по умолчанию.
Хотя я бы порекомендовал вам разработать пересмотр метода обновления, так как вышеописанный плакат, вся ваша проблема возникает из-за того, что одно из значений в вашем массиве пусто, и это может быть исправлено с правильной проверкой данных.