在plsql工具中执行
insert into userinfo values(1,2,3);
insert into userinfo values(2,2,3);
insert into userinfo values(3,2,3);上面三句话一起选中执行但是在Java中用jdbc拼接出这样的字符串再执行就报字符无效我感觉是换行符的问题期待高手给予解答jdbc的批量执行pstmt.executeBatch() 我知道 不要给这样的建议什么的 我只想知道为什么在plsql工具里可以一起选中执行而在Java中却不行

解决方案 »

  1.   

    你把换行去掉试试呗plsql说不定也是把换行去掉后才交给数据库执行的呢?
      

  2.   

    Java拼接得到的字符串
    "insert into userinfo values(1,2,3);insert into userinfo values(2,2,3);"这个字符串是没有换行符的吧 可能是要加上换行符Oracle的换行符说是什么chr(10)在Java的字符串中如何添加Oracle的换行符?
      

  3.   

    在PLSQL里面也是把那语句先进行处理拆成三条SQL,执行三次的。你当一条SQL执行是肯定不行的。
      

  4.   


     哦,其实我想说  addBatch()的
      

  5.   

    这是我曾写过的一个处理文件中SQL的方法。这个和你在PLSQL写入语句执行原理应该是一样的。/**
     * 从SQL文件中取得SQL语句的列表
     * @return
     * @throws IOException 
     */
    public List<String> getSQL() throws IOException{
    List<String> sqlList = new LinkedList<String>();

    if (instream == null) {
    return null;
    }
    BufferedReader reader = new BufferedReader(new InputStreamReader(instream));
    // 创建StringBuffer存储语句信息
    StringBuffer sqlBuffer = new StringBuffer("");
    // 存储一行数据
    String content = null;
    // 用以计数单引号的个数
    int count = 0;
    //多行注释标识
    boolean flag = false;
    // 读取一行数据
    while ((content = reader.readLine()) != null) {
    char [] chs = content.toCharArray();
    int length = chs.length;
    for (int index = 0; index < length; index++) {
    // 去掉单行注释
    if ((count & 1) == 0 && index < length - 1 && chs[index] == '-'
    && chs[index + 1] == '-') {
    sqlBuffer.append(' ');
    break;
    }
    // 多行注释开始,将标识设为 true
    if ((count & 1) == 0 && index < length - 1 && chs[index] == '/'
    && chs[index + 1] == '*') {
    flag = true;
    index++;
    }
    // 多行注释结束,将标识设为false
    if ((count & 1) == 0 && index < length - 1 && chs[index] == '*'
    && chs[index + 1] == '/') {
    flag = false;
    index++;
    sqlBuffer.append(' ');
    continue;
    }
    // 如果flag为true,说明该字符处于多行注释内部,不存
    if (flag) {
    continue;
    }
    // 记数单引号的个数
    if (chs[index] == '\'') {
    count++;
    }
    // 一条SQL语句结束
    if ((count & 1) == 0 && chs[index] == ';') {
    while (sqlBuffer.charAt(0) == ' ') {
    sqlBuffer.deleteCharAt(0);
    }
    count = 0;
    sqlList.add(sqlBuffer.toString());
    sqlBuffer = new StringBuffer("");
    } else {
    sqlBuffer.append(chs[index]);
    }
    }
    }

    if (reader != null) {
    reader.close();
    }

    return sqlList;
    }
      

  6.   


    如果是这样  我想plsql是通过分号(;)来拆分sql语句plsql里执行
    insert into userinfo values(1,2,3);insert into userinfo values(2,2,3);
    就一样报出字符无效证明plsql不是用分号(;)拆分的在plsql里换成如下写法
    insert into userinfo values(1,2,3);
    insert into userinfo values(2,2,3);
    就可以执行虽然不能证明你说的是错误的 但至少是不确定的
      

  7.   


    呵呵,那只能说明PLSQL的处理有问题。你拿到SQLDeveloper中试试去吧。
      

  8.   


    这个大概看了一下就是在文件中找出有效sql语句这跟我说的貌似没关系吧 或者说我愚蠢?没看出来
      

  9.   


    我没试 但就算可以成功执行也没有明确数据证明SQLDeveloper是把字符串拆分成多条语句执行