【问题标题】:Insert statement with subquery and extra column插入带有子查询和额外列的语句
【发布时间】:2016-04-14 10:44:20
【问题描述】:

我想使用插入语句和从另一个表中选择子查询。就我而言,我想将PRESENTATION 表中的一行添加到AVAILABILITY 表中。

AVAILABILITY表结构:

availableID        (number, generated using sequence)
availableDay       (varchar)
availableStart     (varchar)
availableEnd       (varchar)
lecturerID(FK)     (varchar)
presentationID(FK) (number, generated using sequence)

PRESENTATION表结构:

presentationID         (number, generated using sequence)
presentationDay        (varchar)
presentationStart      (varchar)
presentationEnd        (varchar)

我尝试像这样在 DAO 中构造查询:

        String lecturerID = Abean.getLecturerID();
        String availableDay = Abean.getAvailableDay();
        String availableStart = Abean.getAvailableStart();
        String availableEnd = Abean.getAvailableEnd();
        Date availableDate = Abean.getAvailableDate();
        String presentationID = Abean.getPresentationID();

    try{  

            currentCon = JavaConnectionDB.getConnection();

            PreparedStatement ps=currentCon.prepareStatement("
            insert into availability (availableID,
                                      lecturerID,
                                      availableDay,
                                      availableStart,
                                      availableEnd,
                                      presentationid) 
           select(availabilityseq.nextval,
                  ?,
                  presentationDay,
                  presentationStart,
                  presentationEnd,
                  presentationid) 
                  from presentation where presentationid=?

            ");  
            ps.setString(1,Abean.getLecturerID());  
            ps.setString(2,Abean.getAvailableDay());  
            ps.setString(3,Abean.getAvailableStart()); 
            ps.setString(4,Abean.getAvailableEnd());  
            ps.setString(5,Abean.getPresentationID()); 
           // ps.setString(6,Abean.getAvailableID());
            ps.executeUpdate();  

            }
    catch(Exception e){
      System.out.println("add availability 2 failed: An Exception has occurred! " + e);
    }  

正如预期的那样,它返回错误

错误:java.sql.SQLException: Invalid column index

那么,如何使用带有额外列的子查询进行插入?

更新:我的 DAO 代码

【问题讨论】:

  • 你是否指定了两次绑定变量?
  • 注意,在子查询中,where子句是presentation id=?应该是presentationid=?
  • 我的错.. 但是在我改变它之后,同样的错误发生了。也许我应该展示我的 DAO 的其余部分?
  • 也许你确实应该
  • 您的查询只有 2 个问号,但您提供了 5 个绑定变量??

标签: java mysql sql-server sql-insert dao


【解决方案1】:

您需要将绑定变量值的设置与 SQL 文本中的绑定变量规范相匹配:

编辑 4 月 18 日:从选择子查询中删除括号

PreparedStatement ps=currentCon.prepareStatement("
            insert into availability (availableID,
                                      lecturerID,
                                      availableDay,
                                      availableStart,
                                      availableEnd,
                                      presentationid) 
           select availabilityseq.nextval,
                  ?,
                  presentationDay,
                  presentationStart,
                  presentationEnd,
                  presentationid
                  from presentation where presentationid=?
            ");  
            ps.setString(1,Abean.getLecturerID());  // match first "?"
            ps.setString(2,Abean.getPresentationID());    // match 2nd "?"

【讨论】:

  • 我收到了NullPointerException,但它检索到了正确的presentationIDlecturerID。我使用 S.O.P 检查了 availabilityDay,availabilityStartavailabilityEnd 为空
  • 你从哪里得到的?
  • 对于指定的Abean.getPresentationID(),presentationDay/Start/End 包含什么
  • 对不起.. 你什么意思?你能举个例子吗?
  • 什么例子?我要求您调试/打印 Abean.getPresentationID() 的值并查看演示表中该行的值是什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多