Java 返回Null的存储过程
这个问题类似于:,遗憾的是,他们的解决方案对我不起作用 我有一个数据库,其中填充了关于谁使用了我的程序以及何时使用我的程序的数据,我正试图在MySql中创建一个存储过程来检索所有数据并将其发送到我的Javaservlet,在那里它将被处理 这是我当前为存储过程准备的内容:Java 返回Null的存储过程,java,mysql,stored-procedures,jdbc,resultset,Java,Mysql,Stored Procedures,Jdbc,Resultset,这个问题类似于:,遗憾的是,他们的解决方案对我不起作用 我有一个数据库,其中填充了关于谁使用了我的程序以及何时使用我的程序的数据,我正试图在MySql中创建一个存储过程来检索所有数据并将其发送到我的Javaservlet,在那里它将被处理 这是我当前为存储过程准备的内容: CREATE DEFINER=`root`@`localhost` PROCEDURE `getTableData`(OUT time VARCHAR(45), OUT fName VARCHAR(45),
CREATE DEFINER=`root`@`localhost`
PROCEDURE `getTableData`(OUT time VARCHAR(45), OUT fName VARCHAR(45),
OUT lName VARCHAR(45), OUT rVar INT)
BEGIN
SELECT rqTime, name, lastName, requestVar FROM pdata.userlist;
END
以下是我如何在Java中调用查询:
CallableStatement stmt = null;
ResultSet rs = null;
String sqlQuery = "{call getTableData (?, ?, ?, ?)}";
stmt = conn.prepareCall(sqlQuery);
stmt.registerOutParameter(1, java.sql.Types.VARCHAR);
stmt.registerOutParameter(2, java.sql.Types.VARCHAR);
stmt.registerOutParameter(3, java.sql.Types.VARCHAR);
stmt.registerOutParameter(4, java.sql.Types.INTEGER);
stmt.execute();
当我尝试用Java调用这个存储过程时,我尝试使用结果集和普通的getString等,所有值都返回null
我的桌子设计大致如下:
Request Time (millis), name, lastName, requestID
1402341252155, John, Doe, 11
任何帮助都将不胜感激。我觉得问题似乎在于存储过程本身,特别是如何从表中选择变量并将它们分配给out参数
谢谢 问题在于,您从未在过程中设置out参数的值。修复您的查询: 选择 rqTime、name、lastName、requestVar 进入 时间,fName,lName,rVar 来自pdata.userlist; -可能需要一个WHERE或其他语句来确保只检索1行作为结果 -否则,此存储过程将失败
另外,在Java端,您应该注册out参数并直接从CallableStatement检索结果,而不是从ResultSet检索结果。您是否尝试过执行prepareQuery而不是prepareCall,并将其作为查询执行,然后处理返回的ResultSet?我一直都这样做,效果很好。@Tim您应该使用prepareCall来执行存储过程。因为它们没有参数,所以您应该使用stmt.getXxxindex来检索数据,不要使用ResultSet。谢谢,这很有效!考虑到我需要一个where语句,有没有什么方法可以得到整张桌子。还有,我有没有办法从resultSet中检索它们?如果可以,请使用PreparedStatement并直接执行SELECT语句。如果必须使用存储过程,则直接在过程中执行SELECT语句,并从CallableStatement检索结果集;在execute语句之后,但它给了我一个SQL异常,表示结果由多行组成。另外,出于安全目的,我必须使用存储过程。@jFram我不知道使用存储过程如何提高应用程序对PreparedStatement的安全性。无论如何,如果您发布另一个问题,展示您的存储过程以及如何尝试从Java调用它以及异常,这会更好。
public static List<MonhthyBranchWiseSalesPurchesesDTO> getMonBranWiseDetails(Connection con){
List<MonhthyBranchWiseSalesPurchesesDTO> monhthyBranchWiseSalesPurchesesDTOList = null;
ResultSet rset=null;
CallableStatement proc_stmt = null;
CachedRowSet cRowSet = null;
try{
MonhthyBranchWiseSalesPurchesesDTO objTarget = new MonhthyBranchWiseSalesPurchesesDTO();
System.out.println("okkkkhhhh");
proc_stmt = con.prepareCall("xremit.dbo.p_getBHDMBReport");
//p_getBHDMBReport
//proc_stmt = con.prepareCall("uaeexdw.dbo.DBA.p_getBHDMBReport");
rset = proc_stmt.executeQuery();
System.out.println("after ------");
cRowSet = new CachedRowSetImpl();
cRowSet.populate(rset);
System.out.println("lll");
monhthyBranchWiseSalesPurchesesDTOList = (List) ResultSetUtils.getCollection(objTarget, cRowSet);
}