Java中是如何调用存储过程的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中是如何调用存储过程的?相关的知识,希望对你有一定的参考价值。

参考技术A //存储过程create or replace Procedure countBySal(\\x0d\\x0a p_sal emp.sal%type,\\x0d\\x0a p_count OUT number\\x0d\\x0a)as \\x0d\\x0abegin\\x0d\\x0a select count(*) into p_count from emp where sal >= p_sql;\\x0d\\x0aend countBySal; //调用步奏import java.sql.CallableStatement; //带哦用存储过程所必须的语句借口\\x0d\\x0aimport java.sql.Connection;\\x0d\\x0aimport java.sql.DriverManager;\\x0d\\x0aimport java.sql.Types;public class EmpUtil \\x0d\\x0a \\x0d\\x0a public static int countBySal(double sal) throws Exception\\x0d\\x0a Class.forName("oracle.jdbc.driver.OracleDriver");\\x0d\\x0a String url="jdbc:oracle:thin:@localhost:1521:test";\\x0d\\x0a Connection cn=DriverManager.getConnection(url, "scott", "tiger");\\x0d\\x0a String sql="call countBySal(?,?)";//调用存储过程的语句,call后面的就是存储过程名和需要传入的参数\\x0d\\x0a CallableStatement cst=cn.prepareCall(sql);\\x0d\\x0a cst.setDouble(1, sal);//设置in参数的值\\x0d\\x0a cst.registerOutParameter(2, Types.INTEGER);//注册out参数的类型\\x0d\\x0a cst.execute();\\x0d\\x0a int result = cst.getInt(2);\\x0d\\x0a cst.close();\\x0d\\x0a cn.close();\\x0d\\x0a return result;\\x0d\\x0a \\x0d\\x0a \\x0d\\x0a public static void main(String[] args) \\x0d\\x0a int count;\\x0d\\x0a try \\x0d\\x0a count = EmpUtil.countBySal(3000);\\x0d\\x0a System.out.println("工资在3000元以上的人数为:"+count);\\x0d\\x0a catch (Exception e) \\x0d\\x0a e.printStackTrace();\\x0d\\x0a \\x0d\\x0a \\x0d\\x0a \\x0d\\x0a \\x0d\\x0a

如何从 java 调用 MSSQL 存储过程

【中文标题】如何从 java 调用 MSSQL 存储过程【英文标题】:How to call a MSSQL stored procedure from java 【发布时间】:2019-02-05 14:20:22 【问题描述】:

我正在尝试从 java 调用存储过程,但在正确调用调用时遇到了一些问题。我查找了许多示例,但它们与我尝试调用的存储过程的语法不匹配。

    STORED PROCEDURE CODE
    ------------------------
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[getMgr]
    @UserID as varchar(5),
    @ModeType as char(1)
    AS
    BEGIN
    SELECT usermgrid from AllEmployees WHERE (ModeType = @ModeType AND UserID = 
    @UserID)
    END
JAVA CODE
----------------------------
    connection = getConnection();
    cs = connection.prepareCall("call lvhsp_GetManager(?, ?) ");
    cs.setString(0, someUserID);
    cs.setString(1, "0");
    ResultSet resultSet = cs.executeQuery();

我尝试了多种不同的方式调用存储过程,但仍然出现错误。

当我这样称呼它时,我得到一个:

com.microsoft.sqlserver.jdbc.SQLServerException: 索引 0 超出范围。

我认为这是因为这不是传递参数的正确方法。

我也试过用参数名称(UserID、ModeType)调用它,带和不带@,但这不起作用。

我错过了什么?

【问题讨论】:

索引从 1 开始 谢谢,我也尝试从 1 开始 - com.microsoft.sqlserver.jdbc.SQLServerException: The index 0 is out of range. 如果你从 1 开始,则没有 index 0 这样的东西 How do I execute a MS SQL Server stored procedure in java/jsp, returning table data?的可能重复 【参考方案1】:

改用以下方法:

cs.setString(1, someUserID);
cs.setString(2, "0");

【讨论】:

我之前确实尝试过。我得到同样的错误 - com.microsoft.sqlserver.jdbc.SQLServerException: The index 0 is out of range. 然后在这里查看一些推荐:***.com/questions/6113674/… 我要补充一点:确保您实际编译并部署了更改后的代码。分析在哪一行抛出了异常 - 如果它在第一行 cs.setString 中,那么您可能在部署的代码和源代码之间存在不匹配。

以上是关于Java中是如何调用存储过程的?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle如何创建存储过程和如何调用存储过程

如何通过 FromSqlRaw 在 EF Core 3.0 中调用存储过程

如何从 java 调用 MSSQL 存储过程

如何从 Java 调用 MSSQL 加密的存储过程?

如何在ORACLE存储过程中调用WEBSERVICE函数

C# 如何调用此存储过程