【问题标题】:How to call stored procedure from Java如何从Java调用存储过程
【发布时间】:2015-08-24 14:51:25
【问题描述】:

我在 SQL Server 数据库中有一个存储过程。此存储过程将所有记录返回到临时表中。

这是我的存储过程的最后一部分:

SELECT 
    CONVERT(varchar, [Calcolato_TimespanInizio], 103) as DataAccesso,
    CAST(DATEPART(HOUR, [Calcolato_TimespanInizio]) AS NVARCHAR(100))+':'+CAST(DATEPART(MINUTE, [Calcolato_TimespanInizio]) AS NVARCHAR(100)) as OraInizio,
    CAST(DATEPART(HOUR, [Calcolato_TimespanFine]) AS NVARCHAR(100))+':'+CAST(DATEPART(MINUTE, [Calcolato_TimespanFine]) AS NVARCHAR(100)) as OraFine,
    T.IDNostro as CodiceCategoriaOperatore,
    1 as numQta,
    '' as descrizioniNote,
    DATEPART(weekday,[Calcolato_TimespanInizio]) as flagFestivoPrefestivo,
    '' as CodiceErogatore,
    COALESCE(Dichiarati_KmPercorsi, Calcolati_KmPercorsi) as numKmPercorsi,
    CodiceVoucher as identificativoPianoAssistenziale,
    ID as identificativoIntervento,
    '' as incaricoAmbulatoriale,
    '' as incaricoContinuitaAssistenziale,
    @ID_PRESTAZIONE AS ElencoPrestazioni
FROM 
    AA_V_Accessi A
JOIN 
    AA_V_Operatori O ON A.CodiceOperatore = O.CODICE
JOIN 
    AA_V_T_EXP_T_TipologieOperatori T ON T.IDNostro = O.IDTipologiaOperatore
                                      AND T.ASL = 'br'

RETURN 1

现在我想从客户端 java 调用这个存储过程。

这是代码:

            String query = "{call [dbo].[_WS_ElencoAccessi]}";

            CallableStatement stmt = db.prepareCall(query);
            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.registerOutParameter(5, java.sql.Types.INTEGER);
            stmt.registerOutParameter(6, java.sql.Types.VARCHAR);
            stmt.registerOutParameter(7, java.sql.Types.VARCHAR);
            stmt.registerOutParameter(8, java.sql.Types.VARCHAR);
            stmt.registerOutParameter(9, java.sql.Types.VARCHAR);
            stmt.registerOutParameter(10, java.sql.Types.VARCHAR);
            stmt.registerOutParameter(11, java.sql.Types.VARCHAR);
            stmt.registerOutParameter(12, java.sql.Types.VARCHAR);
            stmt.registerOutParameter(13, java.sql.Types.VARCHAR);
            stmt.registerOutParameter(14, java.sql.Types.VARCHAR);

            ResultSet rs = stmt.executeQuery();   // Ottengo il ResultSet dell'esecuzione della query
            while(rs.next()) {   
                Accessi accesso = new Accessi();
                accesso.setDataAccesso(rs.getString(1));

                lista.add(accesso);
            }

但我得到一个 SQLServerException

(com.microsoft.sqlserver.jdbc.SQLServerException) com.microsoft.sqlserver.jdbc.SQLServerException : L ' 索引 1 超出允许范围。

【问题讨论】:

  • 例外在哪里?与我们分享
  • 在这个版本中没有,但现在我想知道如何调用这个存储过程
  • 直接在SQL Server上运行存储过程是否正确执行?如果不是,那么问题仅出在过程本身,而您从 Java 调用它的事实是无关紧要的。如果它在服务器上调用时有效,那么它纯粹是一个 Java 语言问题。无论哪种方式,我认为可以简化问题并删除一个或其他标签。

标签: java sql-server tsql stored-procedures


【解决方案1】:

在存储过程名称后添加一个括号,并带有相同数量的问号以匹配您希望填写的参数数量。

例如。

{call MyProc(?,?,?)}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2011-04-04
    • 2012-01-27
    • 1970-01-01
    相关资源
    最近更新 更多