2015-12-07 4 views
0
try(Connection dbConnection = DBConnectionManager.getIntakeConnection(); 
PreparedStatement preparedStmtSetMaxStrikeId = dbConnection.prepareStatement(
    "SELECT MAX(strike_id) FROM strike WHERE 'SELECT p.party_type_id," 
    + "p.csa_score,p.party_tn,p.rec_create_date," 
    + "s.strike_id, s.strike_date, s.strike_level, s.strike_status, 
     s.appealable,s.appeal_status,s.rec_change_date,s.event_id, 
     s.is_email_processed,s.policy_id" 
    + "FROM strike s " 
    + "INNER JOIN parties p" 
    + "ON p.party_id = s.party_id" 
    + "WHERE p.account ='"+appealStatus.getSubscriberId() 
    +"'AND strike_status = '"+OCIRISConstants.STRIKE_STATUS_ACTIVE+"' ");) 

Ошибка приведена ниже.
Целыми числами ошибки являются идентификаторы подписчиков.Синтаксическая ошибка SQL при конкатенации строки запроса

У вас возникла ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии сервера MySQL для правильного синтаксиса, чтобы использовать вблизи «0957936101205'AND strike_status =„ACTIVE“» в строке 1

+0

«а» + «б» + «с» = азбука, а не б с. Возьми? – Strawberry

+0

Что означает 'WHERE 'SELECT'? – Andreas

ответ

0

сообщение об ошибке говорит:

вблизи «0957936101205'AND strike_status = 'ACTIVE'» в строке 1

Это на самом деле идентификации 0 после ', который заканчивается текст буквальный начал в первой строке, потому что это Плохой SQL:

SELECT MAX(strike_id) FROM strike WHERE '...'0957936101205'AND strike_status = 'ACTIVE' 
--           ^^ BAD 

Это код с аннотациями с комментариями:

try(Connection dbConnection = DBConnectionManager.getIntakeConnection(); 
PreparedStatement preparedStmtSetMaxStrikeId = dbConnection.prepareStatement(
     "SELECT MAX(strike_id) FROM strike WHERE 'SELECT p.party_type_id," 
//           ^What is this? Even without ' it makes no sense 
//           ^But it STARTS A TEXT LITERAL 
    + "p.csa_score,p.party_tn,p.rec_create_date," 
    + "s.strike_id, s.strike_date, s.strike_level, s.strike_status, s.appealable,s.appeal_status,s.rec_change_date,s.event_id,s.is_email_processed,s.policy_id" 
    + "FROM strike s " 
// ^Missing space, but it's in a text literal so doesn't matter 
    + "INNER JOIN parties p" 
    + "ON p.party_id = s.party_id" 
// ^Missing space, but it's in a text literal so doesn't matter 
    + "WHERE p.account ='"+appealStatus.getSubscriberId() 
// ^Missing space, but it's in a text literal so doesn't matter 
//     ^END TEXT LITERAL from first line 
//      ^error complains about inserted value 0957936101205 
    +"'AND strike_status = '"+OCIRISConstants.STRIKE_STATUS_ACTIVE+"' ");) 
// ^Starts a new text literal 
// ^Missing space, but it's in a text literal so doesn't matter 
//      ^end text literal 
//       ^would complain about inserted value ACTIVE 
//                ^Dangling ' 

Кроме того, вы не должны использовать конкатенацию для построения SQL, так как это будет вызывать ошибки синтаксиса и оставить вас восприимчивым к SQL Injection атак, позволяя хакерам украсть ваши данные и удалить ваши таблицы.

Предполагая начальное SELECT MAX(... WHERE ' по ошибке, здесь очищена версия, отформатирован для ясности:

String sql = "SELECT p.party_type_id, p.csa_score, p.party_tn, p.rec_create_date" + 
        ", s.strike_id, s.strike_date, s.strike_level, s.strike_status" + 
        ", s.appealable, s.appeal_status, s.rec_change_date, s.event_id" + 
        ", s.is_email_processed, s.policy_id" + 
       " FROM strike s" + 
      " INNER JOIN parties p ON p.party_id = s.party_id" + 
      " WHERE p.account = ?" + 
       " AND strike_status = ?"; 
try (Connection conn = DBConnectionManager.getIntakeConnection(); 
    PreparedStatement stmt = conn.prepareStatement(sql)) { 
    stmt.setString(1, appealStatus.getSubscriberId()); 
    stmt.setString(2, OCIRISConstants.STRIKE_STATUS_ACTIVE); 
+0

Спасибо за разъяснение. – Shramik

+0

Я хочу выбрать максимальный удаленный идентификатор из таблицы забастовки, сохраняя идентификатор подписчика, который доступен в таблице сторон, в связи с чем я использовал вложенный запрос @Andreas – Shramik

0

Специфическая ошибка синтаксиса есть, говоря, что там должен быть пробел перед AND на последней строке запроса:

+"' AND strike_status // ... etc 
^Insert a space here 

Однако, у вас есть несколько других проблем, там, например, у вас нет пробелов вокруг разрывов строк, например.

+ "INNER JOIN parties p" 
+ "ON p.party_id = s.party_id" 

станет

+ "INNER JOIN parties pON p.party_id = s.party_id" 

Вы должны вставить больше пространства надлежащим образом, либо в начале или в конце каждой строки.

Существуют и другие синтаксические ошибки, такие как WHERE 'SELECT. Вы должны тщательно проверить весь свой синтаксис.

Также: объединение значений в подготовленные заявления несколько поражает точку подготовленных утверждений. См. Javadoc для примеров того, как их правильно использовать.

+0

Проблема действительно находится в первой строке со странной конструкцией 'WHERE 'SELECT'. – Andreas

+0

@Andreas уверен, это еще одна проблема. Я отредактировал, чтобы сказать, что OP должен проверить его синтаксис, потому что есть ошибки среди других. Я думаю, что этот ответ охватывает конкретную ошибку, о которой спрашивают, а затем и некоторые. –

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