java - sql命令未正确结束(我的错误在哪里)

标签 java jdbc insert oracle-xe ora-00933

希望这次能收到我的答复

我写了下面的代码,但不知道我的错误在哪里 我认为似乎是正确的

此代码应将超过一百万条记录插入到 oracle xe 中 我在执行PreparedStatement时通过一条插入语句来编写它 但它运行了6个小时!!!! 因为我被迫使用 thread.sleep()

    package tokenizing;
import java.sql.*;
import java.util.StringTokenizer;

public class TokenExtraction2 {


    public static void main(String[] args) throws Exception {
        String myText[]=new String[2276];
        Jdbc db=new Jdbc();
        String st1=null;
        int i=0;
        int j=0;
        String tokens[][]=new String [3000000][2];
        st1="select ntext from NEWSTEXT ";
        ResultSet result=db.select(st1);
        while(result.next())
        {
            myText[i]=result.getString("ntext");
            ++i;
        }
        db.closedb();
        i=0;
        StringBuilder st= new StringBuilder("insert into tokens5(token,tokenlength) values");
        while(i<2276)
        {

            StringTokenizer s=new StringTokenizer(myText[i]," 0123456789*./»«،~!@#$%^&()_-\"+=:;|<>?“؟”’{}[]‘,\\\t\n\r\fabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ...—`—ـ؛–…_");
            while(s.hasMoreTokens()){
                String key=s.nextToken();
                tokens[j][0]=key;
                tokens[j][1]=(key.length())+"";
                st.append("(?,?)");
                if( i<2276 && s.hasMoreTokens())
                st.append(", ");
                else
                st.append(";");
                //db.insert(st, key, key.length());
                //db.closedb();
                System.out.println(key+"\t");



                   j++;
            }
            System.out.println("num of news is: "+i);
            System.out.println("*****************************************************************************************");
            System.out.println("num of tokens is: "+j);
            System.out.println("next news"+"\t");
            //j=0;

            i++;
        }

        System.out.println(st);
        int k=0;

         Class.forName("oracle.jdbc.driver.OracleDriver") ;
        Connection  con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","ALBALOO","myjava123");
        PreparedStatement ps=con.prepareStatement(st.toString());
    //  con.setAutoCommit(false);
        //j=1;
        i=0;
        //j=j-286;
        while(k<j)
        {

            i=i+1;

                ps.setString(i, tokens[k][0]);

            System.out.println(i);
                i=i+1;
                ps.setInt(i,Integer.parseInt(tokens[k][1]));

                System.out.println(k+2);

                k++;


        }

        ps.executeUpdate();
    //con.commit();
}









}

最佳答案

您似乎尝试通过传递多组值来使用单个 insert 语句插入多行; st 似乎最终为:

insert into tokens5(token,tokenlength) values (?,?), (?,?);(?,?), ...;`

具有数千个值对占位符。您不能像这样传递多组值。 Oracle 不希望在第一个 (?,?) 之后出现逗号,因此会出现 ORA-00933 错误。您还可以在其中添加多个分号,因为每次在 i while 循环中都放置一个分号。正如 Mark Rotteveel 指出的那样,您不应该有任何语句,因为 Oracle JDBC 不允许多个语句。

您可能最好将字符串标记生成器实现为数据库上的函数,然后执行单个insert ... select from newstext,而不是拉出所有数据,转换为并推送回来了。不过,您至少应该批量更新。例如,您可以将 token 作为数组参数传递给存储过程。

我很难理解你真正在做什么,因为看起来你在几乎任何字符上分割字符串,这并没有为实际的键留下太多,不是吗?但很难跟上...

关于java - sql命令未正确结束(我的错误在哪里),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17818536/

相关文章:

java - map 与类属性建议

Java Monopoly 玩家选择验证

java - 如何设置 Netbeans 11 以在分发 jar 文件中包含 jdbc 驱动程序?

sql - 用于填充记录集和返回 ID 的 Postgres 函数

php - 为什么我的 $_GET 表单不能将数据(使用 PHP)插入到 MySql 数据库或表中?

java - 如何访问无状态 session Bean 中的 SFSB

java - PrintWriter 未写入文件(Java)

hibernate - 第一个 hibernate 程序出错

java - JDBC准备好的语句/引用另一个准备好的语句中的准备好的语句

MySQL - 另一个表中不存在的记录 - 显示不正确的结果