SQLSyntaxErrorException при создании таблицы с использованием Apache Derby

У меня есть следующая строка кода в моем проекте, который использует Apache Derby:

 stmt.executeUpdate("CREATE table "+productName+" (Time FLOAT NOT NULL PRIMARY KEY, AcidNo FLOAT, Viscosity FLOAT, Temperature FLOAT)");

Когда переменная productName начинается с буквы (т.е. "RedProduct"), все работает нормально. Когда productName начинается с цифры (например, "6Green"), таблица создается, но я получаю следующую ошибку:

java.sql.SQLSyntaxErrorException: Syntax error: Encountered "6" at line 1, column 15.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedStatement.executeQuery(Unknown Source)

Любые идеи?? Кстати, заключение имени таблицы в скобки не помогло. Спасибо!


person user1144273    schedule 11.01.2012    source источник


Ответы (1)


Вы пробовали ставить двойные кавычки вокруг странных имен?

stmt.executeUpdate("CREATE table \"" + productName + 
    "\" (Time FLOAT NOT NULL PRIMARY KEY, AcidNo FLOAT, Viscosity FLOAT, Temperature FLOAT)");
person ypercubeᵀᴹ    schedule 11.01.2012
comment
Таким образом, кавычки работали с Create Table. Но теперь у меня есть еще одна строка stmt.executeQuery (выбрать * из \ + productName + \ order by Time). Двойные кавычки не работают с именами таблиц, начинающимися с буквы (хотя это работает с именами продуктов, начинающимися с цифры!). Ошибка java.sql.SQLSyntaxErrorException: таблица/представление «Sample1» не существует. - person user1144273; 12.01.2012
comment
См. Правила для идентификаторов SQL92: с разделителями идентификаторы — это идентификаторы, заключенные в двойные кавычки. - person ypercubeᵀᴹ; 12.01.2012
comment
И этот SQL92Identifier : идентификаторы SQL92 нечувствительны к регистру (если только они не заключены в двойные кавычки) - person ypercubeᵀᴹ; 12.01.2012
comment
Итак, мой лучший совет — по возможности не использовать идентификаторы с разделителями. Возможно, вы можете добавить префикс по умолчанию (скажем, "t_") ко всем таблицам, чтобы избежать ошибки. - person ypercubeᵀᴹ; 12.01.2012
comment
Спасибо за ваше предложение и реферальную ссылку! - person user1144273; 12.01.2012