繁体   English   中英

如何使用存储过程进行选择

[英]How to SELECT using Stored Procedure

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

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参考手册》上的内容创建了一个存储过程。 如何在我的存储过程中插入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();
    }
}

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

请使用下面的代码

存储过程

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

您可以使用如下所示的内容:

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类(或Forms类)内部,添加一个名为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可能在其他地方}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM