Java 返回Null的存储过程

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

这个问题类似于:,遗憾的是,他们的解决方案对我不起作用

我有一个数据库,其中填充了关于谁使用了我的程序以及何时使用我的程序的数据,我正试图在MySql中创建一个存储过程来检索所有数据并将其发送到我的Javaservlet,在那里它将被处理

这是我当前为存储过程准备的内容:

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


    }