java.sql.sqlexpcetion: ORA-00917: пропущенная запятая

1

Мне жаль, что я задаю очень глупый вопрос, но я не могу найти место, где я пропущу запятую в коде.

sqlStr.append("INSERT INTO DS_GOAL ");
sqlStr.append("(DS_SITE_CODE, DS_FINANCIAL_YEAR, DS_DEPARTMENT_CODE, DS_PLAN_ID, DS_GOAL_ID, ");
sqlStr.append("DS_DESC, TO_CHAR(DS_PLAN_END_DATE, \"dd/MM/YY\"),");
sqlStr.append("DS_CORP_OBJECTIVE, DS_CORP_OBJECTIVE_OTHER, DS_FOCUS, DS_FOCUS_OTHER, ");
sqlStr.append("DS_TOTAL, DS_EQUIPMENT, DS_RECRUIT, DS_FTE, ");
sqlStr.append("DS_CREATED_USER, DS_MODIFIED_USER, DS_GOAL_ORDER ) ");
sqlStr.append("VALUES ");
sqlStr.append("(?, ?, ?, ?, ?,");
sqlStr.append("?, ?,");
sqlStr.append("?, ?, ?, ?,");
sqlStr.append("?, ?, ?, ?,");
sqlStr.append("?, ?, ?)");
sqlStr_insertGoal = sqlStr.toString();

После sqlStr.toString()

консоль показывает

 INSERT INTO DS_GOAL (DS_SITE_CODE, DS_FINANCIAL_YEAR, DS_DEPARTMENT_CODE, DS_PLAN_ID,
 DS_GOAL_ID, 
 DS_DESC, TO_CHAR(DS_PLAN_END_DATE, 'dd/MM/YYYY'), 
 DS_CORP_OBJECTIVE, DS_CORP_OBJECTIVE_OTHER, DS_FOCUS, DS_FOCUS_OTHER, 
 DS_TOTAL, DS_EQUIPMENT, DS_RECRUIT,
 DS_FTE, DS_CREATED_USER, DS_MODIFIED_USER, DS_GOAL_ORDER)
 VALUES (?, ?, ?, ?, ?,?, ?,?, ?, ?, ?,?, ?, ?, ?,?, ?, ?)

После редактирования кода, который показывает консоль

INSERT INTO DS_GOAL (DS_SITE_CODE, DS_FINANCIAL_YEAR, DS_DEPARTMENT_CODE, DS_PLAN_ID,
 DS_GOAL_ID, 
 DS_DESC, DS_PLAN_END_DATE, 
 DS_CORP_OBJECTIVE, DS_CORP_OBJECTIVE_OTHER, DS_FOCUS, DS_FOCUS_OTHER, 
 DS_TOTAL, DS_EQUIPMENT, DS_RECRUIT,
 DS_FTE, DS_CREATED_USER, DS_MODIFIED_USER, DS_GOAL_ORDER)
 VALUES (?, ?, ?, ?, ?,?, TO_CHAR(DS_PLAN_END_DATE, 'dd/MM/YYYY'),?, ?, ?, ?,?, ?, ?,
 ?,?, ?, ?)

Но консоли показывают неверную ошибку индекса столбца. Спасибо за помощь.

  • 0
    сначала отформатируйте код, он не читается
Теги:

1 ответ

1
Лучший ответ

Я подозреваю, что ваша проблема на самом деле не является случаем недостающей запятой (по моему опыту ошибки ORA печально известны вам, что вы ошибаетесь). Мое подозрение заключается в том, что вашей реальной проблемой является использование " вокруг строки формата в вашем TO_CHAR вызове". Чтобы продемонстрировать, попробуйте следующее:

SELECT TO_CHAR(SYSDATE, "dd/MM/YY")
  FROM DUAL;

Если я запустил выше, я получаю ORA-00904: "dd/MM/YY": invalid identifier ошибка ORA-00904: "dd/MM/YY": invalid identifier. Если вместо кавычек вместо апострофов я заменю:

SELECT TO_CHAR(SYSDATE, 'dd/MM/YY')
  FROM DUAL;

Я получаю 16/04/14. Двойные кавычки предназначены для идентификаторов, а не строк:

SELECT TO_CHAR(SYSDATE, 'dd/MM/YY') AS "The Date"
  FROM DUAL;                        // ^ This is an identifier

печатает:

The Date
--------
16/04/14

РЕДАКТИРОВАТЬ:

Извините, я должен был заметить это раньше! Вы используете TO_CHAR в списке столбцов, который вы не можете сделать. В приведенном ниже примере хорошо получается ORA-00917: missing comma ошибка ORA-00917: missing comma:

CREATE TABLE JON_TEST (COL1 VARCHAR2(20));

COMMIT;

INSERT INTO JON_TEST (TO_CHAR(COL1, 'DD/MM/YYYY'))
VALUES (SYSDATE);

В то время как это работает:

INSERT INTO JON_TEST (COL1)
VALUES (TO_CHAR(SYSDATE, 'dd/MM/YYYY'));

Поэтому вам нужно исправить три вещи:

  • Вам необходимо изменить TO_CHAR на TO_DATE и
  • Вам необходимо переместить вызов TO_DATE в свой пункт VALUES и
  • Вам нужно убедиться, что вы используете ' вместо " с строкой формата.

Именно так Oracle определяет синтаксис для операторов INSERT:

Изображение 174551

Обратите внимание, что в средней части он говорит только column_name а не sql_expression.

Попробуйте изменить свой запрос на следующее:

sqlStr.append("INSERT INTO DS_GOAL ")
    .append("(DS_SITE_CODE, DS_FINANCIAL_YEAR, DS_DEPARTMENT_CODE, DS_PLAN_ID, DS_GOAL_ID, ")
    .append("DS_DESC, DS_PLAN_END_DATE, ")
    .append("DS_CORP_OBJECTIVE, DS_CORP_OBJECTIVE_OTHER, DS_FOCUS, DS_FOCUS_OTHER, ")
    .append("DS_TOTAL, DS_EQUIPMENT, DS_RECRUIT, DS_FTE, ")
    .append("DS_CREATED_USER, DS_MODIFIED_USER, DS_GOAL_ORDER ) ")
    .append("VALUES ")
    .append("(?, ?, ?, ?, ?,")
    .append("?, TO_DATE(?, 'dd/MM/YY'),")
    .append("?, ?, ?, ?,")
    .append("?, ?, ?, ?,")
    .append("?, ?, ?)");
    sqlStr_insertGoal = sqlStr.toString();
  • 0
    немного грустно, но ошибка все еще существует ...
  • 0
    @ user3340095 Если бы вы могли распечатать sqlStr.toString(); в консоль и добавьте это к вопросу, это может помочь.
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню