遇到一个奇怪的SQL问题:insert into A(a,b,c) values(?,?,(select d from B where e =?));这条语句,在单条插入时无问题,但在批量插入时,出现A表中的c值都为第一条记录中B表的d值。求解!!

解决方案 »

  1.   


    --select d from B where e =?  你的e=?这个是变量还是写死了?
    --如果是变量的话应该是没问题的
    --下面的测试
    scott@YPCOST> insert into dept values(&deptno,'&dname',(select ename from emp where empno=&empno));
    输入 deptno 的值:  22
    输入 dname 的值:  dfsd
    输入 empno 的值:  7788
    原值    1: insert into dept values(&deptno,'&dname',(select ename from emp where empno=&empno))
    新值    1: insert into dept values(22,'dfsd',(select ename from emp where empno=7788))已创建 1 行。scott@YPCOST> commit;提交完成。
    scott@YPCOST> insert into dept values(&deptno,'&dname',(select ename from emp where empno=&empno));
    输入 deptno 的值:  32
    输入 dname 的值:  tom
    输入 empno 的值:  7369
    原值    1: insert into dept values(&deptno,'&dname',(select ename from emp where empno=&empno))
    新值    1: insert into dept values(32,'tom',(select ename from emp where empno=7369))已创建 1 行。scott@YPCOST> commit;提交完成。
    scott@YPCOST> select * from dept;    DEPTNO DNAME          LOC
    ---------- -------------- -------------
            90 dfd            dfd
            60 suzhou         we
            70 suzhou
            50 NANCHANG
            10 ACCOUNTING     NEW YORK
            22 dfsd           SCOTT
            32 tom            SMITH
            20 RESEARCH       DALLAS
            30 SALES          CHICAGO
            40 OPERATIONS     BOSTON已选择10行。--这两个就是测试结果
      22 dfsd           SCOTT
      32 tom            SMITH
      

  2.   

    where e =? 是否传人参数总是一个值
      

  3.   

    select d from B where e =?  你的e=?这个是变量还是写死了?
    ---这个是变量。没看出你举例中有含批量操作的
      

  4.   

    补充说明:我是在PreparedStatement中使用addBatch()和executeBatch()方法
      

  5.   

    --你的全部代码 贴上来
    --这样
    insert into A(a,b,c) select 参数1,参数2,d from B where e =参数
      

  6.   


    package test;import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.Properties;public class BatchInsertTest
    {
       protected Connection test()
       {
          try
          {
             Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();         String url = "jdbc:oracle:thin:@XXX";
             Properties sysProps = System.getProperties();
             sysProps.put("user", "XXX");
             sysProps.put("password", "XXX");         String sql = "INSERT INTO TMP_TABLE_A_201012 VALUES('Ax','Bx',(SELECT T.D FROM TMP_TABLE_B_201012 T WHERE T.E = ?))";
             Connection con = DriverManager.getConnection(url, sysProps);
             PreparedStatement ps = con.prepareStatement(sql);
             int rowCount = 0;
             do
             {
                rowCount++;
                ps.setString(1, "E" + rowCount);
                System.out.println("E" + rowCount);
                ps.addBatch();            if (rowCount > 0 && rowCount % 4 == 0)
                {
                   ps.executeBatch();
                }
             } while (rowCount < 4);         ps.executeBatch();
             return null;      }
          catch (ClassNotFoundException e)
          {
             e.printStackTrace();
          }
          catch (SQLException e)
          {
             e.printStackTrace();
          }
          catch (InstantiationException e)
          {
             e.printStackTrace();
          }
          catch (IllegalAccessException e)
          {
             e.printStackTrace();
          }
          return null;
       }   public static void main(String[] args)
       {
          new BatchInsertTest().test();
       }
    }
      

  7.   


    create table TMP_TABLE_A_201012
    (
      A         VARCHAR2(32),
      B         VARCHAR2(32),
      C         VARCHAR2(32)
    );create table TMP_TABLE_B_201012
    (
      D         VARCHAR2(32),
      E         VARCHAR2(32)
    );INSERT INTO TMP_TABLE_B_201012 VALUES('D1','E1');
    INSERT INTO TMP_TABLE_B_201012 VALUES('D2','E2');
    INSERT INTO TMP_TABLE_B_201012 VALUES('D3','E3');INSERT INTO TMP_TABLE_A_201012 VALUES('A1','B1',(SELECT T.D FROM TMP_TABLE_B_201012 T WHERE T.E = 'E1'));
      

  8.   

    select d from B where e =? 你的e=?这个是变量还是写死了?
    ---这个是变量。没看出你举例中有含批量操作的