java.sql.SQLSyntaxErrorException: ORA-01747

Posted

技术标签:

【中文标题】java.sql.SQLSyntaxErrorException: ORA-01747【英文标题】: 【发布时间】:2011-10-10 12:39:33 【问题描述】:

搜索了整个网站,但没有任何帮助,所以我决定开辟一个新主题。这是我的问题:我正在用 java 开发一个简单的 GUI,它在背后使用 JDBC。以下是一些头条新闻: - 我建立了成功的数据库连接, - 我可以运行 SELECT 语句并在我的代码中获取数据。 但问题是,当我使用 INSERT 语句时,它给出了下面的错误,其描述如下:“ invalid username.tablename.columnname or tablename.columnname etc...” 我在网上挖掘了 2 天,但我无法找到满足我需求的解决方案。以上是我的代码,展示了我是如何实现 INSERT 的:

String query = "INSERT INTO DQMP.DQ_USER("
                                + " USER_ID,"
                                + " USER_SHORTNAME,"
                                + " USER_NAME,"
                                + " GSM1,"
                                + " E_MAIL,"
                                + " DEPARTMENT_ID,"
                                + ") VALUES(?, ?, ?, ?, ?, ?)";                             

                PreparedStatement st = conn.prepareStatement(query);

                      st.setString(1, "user_id_seq.nextval");
                      st.setString(2, str1);
                      st.setString(3, str2);
                      st.setLong(4, lng);
                      st.setString(5, str4);
                      st.setInt(6, 1);

                      st.executeUpdate();
                      System.out.println("Insertion successful");
                      st.close();           

这是我的 DESC DQ_USER:

TABLE DQ_USER
 Name                                      Null?    Type                        
 ----------------------------------------- -------- ----------------------------
 USER_ID                                   NOT NULL NUMBER                      
 USER_SHORTNAME                                     VARCHAR2(30)                
 USER_NAME                                          VARCHAR2(128)               
 GSM1                                               VARCHAR2(30)                
 E_MAIL                                             VARCHAR2(512)               
 DEPARTMENT_ID                             NOT NULL NUMBER

任何帮助将不胜感激。

这是我最新更改的代码:

Statement st = conn.createStatement();
                    String query = "SELECT USER_ID_SEQ.NEXTVAL FROM DUAL;";
                    ResultSet rs = st.executeQuery(query);
                    int seq = 0;
                    while(rs.next())
                         seq = rs.getInt("USER_ID_SEQ");
                         System.out.println(seq);
                    

                    CallableStatement stmt = conn.prepareCall("call PKDQ_CONTROL_MNG.ADD_USER (?, ?, ?, ?, ?, ?)");

                    stmt.setInt(1, seq);
                    stmt.setString(2, str1);
                    stmt.setString(3, str2);
                    stmt.setInt(4, int1);
                    stmt.setString(5, str4);
                    stmt.setString(6, "1");

                    stmt.executeUpdate();
                    stmt.close();

【问题讨论】:

请DESC DQ_USER参考。 【参考方案1】:

您的插入语句中有一个尾随逗号。删除它。

+ " DEPARTMENT_ID," // <-- Here is the trailing comma
+ ") VALUES(?, ?, ?, ?, ?, ?)";

另外,我猜 USER_ID 的类型是 NUMBER,而您尝试将字符串“user_id_seq.nextval”存储在此列中。

如果你想插入一个序列的下一个值,你必须首先发出一个选择序列下一个值的SQL查询,提取这个查询返回的数字,然后在你的插入语句中使用setInteger或@设置它987654323@.

或者您可以使用以下查询:

"INSERT INTO DQMP.DQ_USER(user_id_seq.nextval, 
+ " USER_SHORTNAME,"
+ ...
+ ") VALUES(?, ?, ?, ?, ?)"; // only 5 parameters

【讨论】:

很好,我不知道我怎么错过了,谢谢!但是现在抛出“ORA-01722: invalid number”,可能是我用的LONG类型? LONG 是一种 Oracle 数据类型,用于存储最长 2 GB 的可变长度字符数据。它不等同于 Java 长数字。使用 NUMBER 存储 Java longs。 好吧,我使用 int 是因为找不到解析实际 NUMBER 格式的方法,现在我得到以下信息:线程“AWT-EventQueue-0”java.lang 中的异常。 NumberFormatException:对于输入字符串:“04552100000” 这是另一个问题。用您用来解析数字的代码提出另一个问题。 好吧,我想不出什么新东西,你能帮我吗?【参考方案2】:

我不知道是不是这样,但你的 INSERT 声明最终会看起来像 INSERT INTO ... DEPARTMENT_ID,) VALUES(...

DEPARTMENT_ID 之后你有一个流浪的,

【讨论】:

谢谢,帮了大忙。但现在我得到“ORA-01722:无效号码”。也许是 LONG 类型?

以上是关于java.sql.SQLSyntaxErrorException: ORA-01747的主要内容,如果未能解决你的问题,请参考以下文章