如何在Java中使用PrepareStatement将选择插入

如何在Java中使用PrepareStatement将选择插入,java,oracle,jdbc,prepared-statement,Java,Oracle,Jdbc,Prepared Statement,我正试图通过从2个表中选择列中的特定数据来执行INSERT INTO SELECT操作,该操作将插入到1个表中。问题是,它还将涉及来自JTextField的用户输入。我已经寻找了很多解决方案,但仍然有一个错误,我只是不知道该怎么办。我使用Java作为PL,使用Oracle作为DB。到目前为止,我得到的是: Class.forName("oracle.jdbc.driver.OracleDriver"); con = DriverManager.getConnection("jdbc:oracle

我正试图通过从2个表中选择列中的特定数据来执行INSERT INTO SELECT操作,该操作将插入到1个表中。问题是,它还将涉及来自JTextField的用户输入。我已经寻找了很多解决方案,但仍然有一个错误,我只是不知道该怎么办。我使用Java作为PL,使用Oracle作为DB。到目前为止,我得到的是:

Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","ghost","slayer");

stmt = con.createStatement();

String sbjC = sbjCode.getText(); //textfield for subjectCode
String sbjN = sbjName.getText(); //textfield for subjectName
String matricsno = textstudentid.getText(); //textfield for matrics number
String sbjG = sbjGrade.getText(); //textfield for subjectGrade (not gonna be use in db, just for comparison)

String sql1 = "INSERT INTO transferred (subjectCode,subjectName,credit,prequisite,matricsNo) "
    + "SELECT b.subjectCode,b.subjectName,b.credit,b.prequisite,s.matricsNo "
    + "FROM bitm b, student s "
    + "WHERE b.subjectCode = '"+sbjC+"' AND b.subjectName = '"+sbjN+"' AND s.matricsNo = '"+matricsno+"'";

/* table Transferred has 5 column which are subjectCode,subjectName,credit,prequisite,matricsNo [matricsno as FK]
 * table bitm has 5 column [subjectCode as PK]
 * table student has 6 column [matricsno as PK]
 */

ps = con.prepareStatement(sql1);

ps.setString(1, sbjC);
ps.setString(2, sbjN);
ps.setString(3, "SELECT credit FROM bitm WHERE subjectCode = '"+sbjC+"' AND subjectName = '"+sbjN+"'");
ps.setString(4, "SELECT prequisite FROM bitm WHERE subjectCode = '"+sbjC+"' AND subjectName = '"+sbjN+"'");
ps.setString(5, "SELECT matricsno FROM student WHERE matricsno = '"+matricsno+"'");

ps.executeUpdate(sql1);
在执行并将所需的所有数据插入JTextField后,我遇到的唯一错误是java.sql.SQLException:Invalid column index

SQL语句已在SQL Developer中测试并成功。只是我对如何在Java上实现有点困惑。 感谢您的回复和时间。
我是Java新手。

不幸的是,您完全误解了preparedStatemet的功能。 你必须写作吗-,并且PreparedStatement将以键入方式替换它:

 String sql1 = "INSERT INTO transferred (subjectCode,subjectName,credit,prequisite,matricsNo) "
                    + "SELECT b.subjectCode,b.subjectName,b.credit,b.prequisite,s.matricsNo "
                    + "FROM bitm b, student s "
                    + "WHERE b.subjectCode = ? AND b.subjectName = ? AND s.matricsNo = ?";

            ps = con.prepareStatement(sql1);
            ps.setString(1, sbjC);
            ps.setString(2, sbjN);
            ps.setString(3, matNo);
            ps.executeUpdate();

对于PreparedStatement,您需要编码吗?然后将其替换为值

String sql1 = "INSERT INTO transferred (subjectCode,subjectName,credit,prequisite,matricsNo) "
                    + "SELECT b.subjectCode,b.subjectName,b.credit,b.prequisite,s.matricsNo "
                    + "FROM bitm b, student s "
                    + "WHERE b.subjectCode = ?  AND b.subjectName = ? AND s.matricsNo = ? ";


            ps = con.prepareStatement(sql1);

            ps.setString(1, sbjC);
            ps.setString(2, sbjN);
            ps.setString(3,matricsno);

ps.executeUpdate ();
这应该可以做到


您的错误源于未匹配就给出参数(setString…)。

为了回答我自己的问题,我将对我对代码所做的更改发表评论,并使其生效:

Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","aza","jaiza");

stmt = con.createStatement();

String sbjC = sbjCode.getText();
String sbjN = sbjName.getText();
String matricsno = textstudentid.getText();
String sbjG = sbjGrade.getText();

String sql1 = "INSERT INTO transferred (subjectCode,subjectName,credit,prequisite,matricsNo) "
        + "SELECT b.subjectCode,b.subjectName,b.credit,b.prequisite,s.matricsNo "
        + "FROM bitm b, student s "
        + "WHERE b.subjectCode = ? AND b.subjectName = ? AND s.matricsNo = ?"; // from textfield to ?

ps = con.prepareStatement(sql1);

ps.setString(1, sbjC);
ps.setString(2, sbjN);
ps.setString(3, matricsno);

//from all the SELECT statement to just 3 user-input-from-textfield column

ps.executeUpdate(); // remove the sql1 in ps.executeUpdate(sql1);

哪一行造成了这个错误?
.setString
中的一个?使用这些行动态设置的相应的
在哪里?查看您的参数是否完全关闭。您正在尝试将
选择
查询设置为参数?我认为您需要后退一步,学习准备语句如何工作的基础知识。您的查询没有参数。您需要将
放入SQL字符串中,而不是实际参数中。您也不能将
select
语句用作参数字符串。
ps.setString(1,sbjC);ps.setString(2,sbjN);ps.setString(3,“从bitm中选择贷方,其中subjectCode=”“+sbjC+”,subjectName=”“+sbjN+””);ps.setString(4,“从bitm中选择prequisite,其中subjectCode=”“+sbjC+”,subjectName=”“+sbjN+””);ps.setString(5,“从学生中选择matricsno,其中matricsno=”“+matricsno+””)weirdI是否尝试用替换它?我得到的错误是java.sql.SQLException:ORA-01008:并非所有变量都有边界。尝试添加整个查询作为替换是错误的:ps.setString(5,“从学生中选择matricsno,其中matricsno=”“+matricsno+”);谢谢你的回复。我已经替换了它,它生成了错误:java.sql.SQLException:ORA-01008:不是所有的变量,您能用当前代码更新这个问题吗?三个问号和参数索引1到3应该有效。谢谢您的回答。我已经更新了代码,也更新了错误。检查最后一行!!不是executeUpdate(sql1),而是仅executeUpdate();谢谢你的回答。它起作用了!非常感谢你。数据已成功插入数据库:D