【问题标题】:How to SELECT using Stored Procedure如何使用存储过程进行选择
【发布时间】:2016-07-03 06:52:51
【问题描述】:

在通过 Callable Statement 使用此存储过程时,如何使用存储过程检索(选择)我的所有数据?我创建了一个示例项目,我需要在其中 SELECT 表中的所有数据。首先,我使用了准备好的语句,因此我可以将数据插入到以下文本字段中。顺便说一句,我正在使用德比。

表格

CREATE TABLE SAMPLEONLY
(
FULLNAME VARCHAR(50),
ADDRESS VARCHAR(50)
)

图形界面

插入代码

    private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {                                          
    String addFullname = fullnameTf.getText();
    String addAddress = addressTf.getText();


    String insert = "INSERT INTO SAMPLEONLY (FULLNAME,ADDRESS) VALUES (?,?)";
    try (Connection myConn = DriverManager.getConnection(url, user, pass);
        PreparedStatement myPs = myConn.prepareStatement(insert);){

        myPs.setString(1, addFullname);
        myPs.setString(2, addAddress);

        myPs.executeUpdate();


    } catch (SQLException e) {
        e.printStackTrace();
    }
}

插入以下文本字段后。我需要使用存储过程检索我的所有数据。我根据我在 Derby Reference Manual 上阅读的内容创建了一个存储过程。如何在我的存储过程中插入 SELECT * FROM SAMPLEONLY?

存储过程

CREATE PROCEDURE show_data(IN FULLNAME VARCHAR(50), IN ADDRESS VARCHAR(50))
PARAMETER STYLE JAVA
LANGUAGE JAVA
READS SQL DATA
EXTERNAL NAME 'Frame.searchButton'
//HOW CAN I INSERT HERE?

如何在此处插入 SELECT * FROM SAMPLEONLY?创建这个存储过程我有点困惑,因为这是我第一次使用它。我将我的班级命名为 Frame

选择代码

private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
    String seeachStoredProc = "{call show_data(?,?)}";

    try (Connection myConn = DriverManager.getConnection(url, user, pass);
         CallableStatement myCs = myConn.prepareCall(seeachStoredProc);)
        {

                //what goes here?

        } 
    catch (SQLException e) 
    {
        e.printStackTrace();
    }
}

任何帮助将不胜感激!如果我的代码有问题,请指导我。欢迎发表评论。

【问题讨论】:

    标签: java stored-procedures jdbc derby


    【解决方案1】:

    请使用下面的代码

    存储过程

    CREATE PROCEDURE show_data(IN FULLNAME VARCHAR(50), IN ADDRESS VARCHAR(50))
    PARAMETER STYLE JAVA
    LANGUAGE JAVA
    READS SQL DATA
    EXTERNAL NAME 'Frame.searchButton'
    BEGIN
    
    INSERT INTO SAMPLEONLY("FULLNAME", "ADDRESS") 
      VALUES (FULLNAME , ADDRESS);  
    
      COMMIT;
    
    END;
    

    选择代码

    private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
    String seeachStoredProc = "{call show_data(?,?)}";
    
    try (Connection myConn = DriverManager.getConnection(url, user, pass);
         CallableStatement myCs = myConn.prepareCall(seeachStoredProc);)
        {
    
            String addFullname = fullnameTf.getText();
                String addAddress = addressTf.getText();
            myCs .setInt(1, addFullname 
            myCs .setString(2, addAddress );            
    
            // execute store procedure
            myCs .executeUpdate();   
    
        } 
    catch (SQLException e) 
    {
        e.printStackTrace();
    }
    }
    

    【讨论】:

    • 您可以尝试很好地格式化您的代码 sivakumar
    • 这是 Oracle 语法。我在第 1 行遇到错误 Encountered "END"。
    【解决方案2】:

    你可以使用类似下面的东西:

    CREATE PROCEDURE show_data(IN FULLNAME VARCHAR(50), IN ADDRESS VARCHAR(50))
    PARAMETER STYLE JAVA
    LANGUAGE JAVA
    READS SQL DATA
    DYNAMIC RESULT SETS 1
    EXTERNAL NAME 'SomeClass.showData'
    

    在 SomeClass 类(或表单类)中添加一个名为 showData 的静态方法,该方法有两个字符串参数

    public class SomeClass{
      public static void showData(String fullname, String address, ResultSet[] data){
        Connection conn = ... //somehow create a connection to database
        PreparedStatement ps = conn.prepareStatement("SELECT * FROM SAMPLEONLY");
        data[0] = ps.executeQuery();
        conn.close();
      }
    }
    

    在你的按钮里面

    CallableStatement cs = conn.prepareCall("{ call showData(?, ?)}");
    cs.setString(1, p1);
    cs.setString(2, p2);
    boolean hasResults = cs.execute();
    if (hasResults) {
      ResultSet rs = cs.getResultSet();
      while (rs.next()) {
          // do stuff with selected data
      }
    }
    

    编辑 我注意到当你访问存储过程中的连接时,你必须使用连接字符串 jdbc:default:connection 所以在上面的代码中更改连接线

    public class SomeClass{
      public static void showData(String fullname, String address, ResultSet[] data){
        Connection conn = DriverManager.getConnection("jdbc:default:connection");
        PreparedStatement ps = conn.prepareStatement("SELECT * FROM SAMPLEONLY");
        data[0] = ps.executeQuery();
        conn.close();
      }
    

    在 derby 存储过程中,您总是以另一个方法参数的形式返回结果(在本例中为 ResultSet 数组)。 您遇到的 NullException 可能在其他地方 }

    【讨论】:

    • 它不起作用兄弟我遇到了一个错误 NullException。我认为数组数据[0]?我怎样才能消除这个?谢谢。
    猜你喜欢
    • 2011-10-11
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多