java.sql.sqlexpcetion :ORA-00917:missing comma

标签 java sql oracle

很抱歉,我问了一个非常愚蠢的问题,但我找不到代码中错过逗号的地方..

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'),?, ?, ?, ?,?, ?, ?,
 ?,?, ?, ?)

但是控制台显示无效列索引错误 感谢您的帮助

最佳答案

我怀疑你的问题实际上并不是缺少逗号的情况(根据我的经验,ORA 错误因告诉你错误的事情而臭名昭著)。我怀疑您真正的问题是在 TO_CHAR 调用中使用 " 围绕格式字符串。要进行演示,请尝试以下操作:

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

如果我运行上面的代码,我会收到 ORA-00904: "dd/MM/YY": invalididentifier 错误。如果我将引号改为撇号:

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

我得到14/16/04。双引号用于标识符,而不是字符串:

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 错误:

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 define the syntax for INSERT statements :

This is how Oracle defines the syntax for INSERT statements

请注意,中间部分仅显示 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();

关于java.sql.sqlexpcetion :ORA-00917:missing comma,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23106911/

相关文章:

java - java中如何将ArrayList中的元素复制到int数组

java - 如何在裸存储库中使用 JGit 暂存文件?

sql - 我如何允许sql中的重复值?

c# - 为什么SqlParameter总是设置参数为null?

java - 如何调试 java.sql.SQLException : could not resolve the connect identifier

oracle - 我如何编写 Oracle Wallet 更改脚本?

java - 同时获取所有通知

java - 如何使用多个同名的 JSON 字段

sql - 在 SQL Server 中查找重复的县名

mysql - rsqlite_send_query(conn@ptr, statement) 错误 : near "(": syntax error_____