【问题标题】:Fetching value from a SQLServer procedure using java program使用 java 程序从 SQLServer 过程中获取值
【发布时间】:2013-06-10 18:35:35
【问题描述】:

我有一个程序

USE [ER]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[PKG_ER_SEL$sp_ERGetOrgDetails]  
   @v_OrgId int = NULL,
   @v_Email varchar(max) = NULL,


   @cv_1 varchar(8000)  OUTPUT
AS 
     BEGIN
      BEGIN TRY
         SET @cv_1 = NULL
         SELECT 
            o.ORGID, 
            o.NAME, 
            o.PHONE, 
            o.URL, 
            o.CURRENCY, 
            o.MEASUREMENT, 
            o.ISACTIVE, 
            u.FIRSTNAME, 
            u.LEVELID, 
            u.APPROVALLIMIT, 
            u.USERID, 
            u.MANAGERID
         FROM 
            dbo.ER_ORGANIZATIONS  AS o 
               JOIN dbo.ER_USERS  AS u 
               ON o.ORGID = u.ORGID
         WHERE 
            o.ORGID = @v_OrgId AND 
            u.EMAIL = @v_Email AND 
            u.ISACTIVE = 1
         ORDER BY u.LEVELID

      END TRY

      BEGIN CATCH
         BEGIN
            PRINT 'System Error: Unhandled error occured during execution of sp_ERGetOrgDetails procedure, Please contact your administrator'
         END
      END CATCH
   END

================================================ ======================

我正在尝试从这个返回 4 条记录的过程中获取值。

我的 java prog 是 -

public static void getOrgDetails1(int orgId, String email){
            Connection con =null;

            try{
                CallableStatement cs=null;
                con = SqlConnectionManager.getConnection();
                cs = con.prepareCall("{call PKG_ER_SEL$sp_ERGetOrgDetails(?,?,?)}");
                cs.setInt(1,orgId);
                cs.setString(2, email);
                cs.registerOutParameter(3, java.sql.Types.VARCHAR); //cv_1
                cs.execute();
                String resultSet=cs.getString(3);
                System.out.println(resultSet);


            }catch(Exception e){
                e.printStackTrace();
            }finally{
                SqlConnectionManager.releaseConnection(con);
            }

}  

当我运行这个 java prog 时,我得到的输出为 null,因为我期望 4 条记录,因此字符串中有一些值。

任何人都可以帮助我如何从 SQL Server 过程中获取值。

【问题讨论】:

  • 在连接到引擎之前,您是否尝试在 sql-server 中运行您的程序
  • @MohammedFalha:SqlConnectionManager 连接到 SQLServer。连接很好。我可以单独从数据库中的简单查询中获取值。

标签: java sql sql-server stored-procedures jdbc


【解决方案1】:

尝试将String resultSet=cs.getString(3); 更改为ResultSet resultSet = cs.getResultSet();

然后您必须遍历结果集以获取四行中的每一行。

【讨论】:

  • 此外,尚不清楚为什么要声明/使用 outParameter。我没有看到它实际上已被填充。
  • @Rob 我已经试过了,ResultSet resultSet = (ResultSet) cs.getObject(3); System.out.println(resultSet);这给了我 null 本身,当结果集返回 null 时,我没有迭代。
  • @BrettOkken 我想阅读 outParameter。我的目标是使用 java 从过程输出中获取数据。该过程在运行时返回 4 条记录,我在 java 中也需要。
  • @Rob 谢谢,那行得通。我错过了尝试。对于返回记录的查询 ResultSet resultSet = (ResultSet) cs.getResultSet();为我工作。谢谢大家。
  • 很高兴您解决了问题。 JDBC 读/写/调试很痛苦。这就是为什么大多数项目使用更高级别的抽象(例如,JPA、hibernate 等)。
【解决方案2】:

如果您期望 4 个值作为输出,那么您的过程不正确,您的 Java 代码也是如此。如果您希望输出一个 ResultSet/或多个值,请从您的 SQL 过程中返回一个游标或增加编号。 out 参数的数量为 4。您必须将输出变量的值设置为过程的一部分。您编写 Java 类的方式,您只能期望 1 个值,即您在过程中声明为 OUT 参数的 varchar(8000) 参数。您甚至没有为变量 @cv_1 分配任何值,因此您在 Java 端得到 null 。 从过程中返回一个游标并使用 registerOutParameter(3, OracleTypes.CURSOR) 代替 registerOutParameter(3, Types.String) 和 (ResultSet)getObject(3) 而不是 getString(3)。

【讨论】:

  • 在 oracle 中它按你说的那样工作。我确实做到了这一点。但是在 SQL 中,OracleTypes.CURSOR 不起作用,因为它在 Oracle 和 SQL 中都有效,CURSOR 在那里吗?我故意用 varchar 替换,因为我无法使用 OracleTypes.CURSOR 或 java.sql.Types.REF .. 请建议。
  • 要编写返回游标的过程,请参阅此链接 - msdn.microsoft.com/en-us/library/ms175498(v=sql.105).aspx。在 Java 端尝试使用 registerOutParameter(3, Types.OTHER) 和 (Resultset)getObject(3)。
猜你喜欢
  • 2015-07-03
  • 2018-05-17
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多