簡體   English   中英

如何使用 PrepareStatement 在 Java 中執行 INSERT SELECT INTO

[英]How to do INSERT SELECT INTO in Java using PrepareStatement

我正在嘗試通過從 2 個表的列中選擇特定數據來執行插入到 1 個表中的 INSERT INTO SELECT。 問題是,它也將涉及來自 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 的新手。

對於 PreparedStatement,您需要編寫代碼 ? 進入sql,然后用值替換它。

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...) 沒有匹配?

不幸的是,您完全誤解了 PreparedStatemet 的作用。 你要寫嗎? -s 到查詢中,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();

為了回答我自己的問題,我將對我對代碼所做的更改發表評論並使其工作:

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM