如何通过可调用语句使用此存储过程时使用存储过程检索(SELECT)所有数据?我创建了一个示例项目,我需要 SELECT 来自我表中的所有数据。首先我使用了Prepared Statement,因此我可以将数据插入到以下文本字段中。顺便说一下,我正在使用德比。
表格
CREATE TABLE SAMPLEONLY
(
FULLNAME VARCHAR(50),
ADDRESS VARCHAR(50)
)
GUI
插入代码
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();
}
}
任何帮助将不胜感激!如果我的代码有问题,请指导我。随意评论。
答案 0 :(得分:2)
请使用以下代码
存储过程
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();
}
}
答案 1 :(得分:0)
您可以使用以下内容:
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可能在其他地方 }