泛微JSP调用存储过程及获取返回值

我用的是泛微E9,从前台E9代码块,用ajax调用后台jsp文件,进行数据库的查询交互;
jsp文件中,调用oracle存储过程,可以执行成功,但是无法获取存储过程中的出参!求帮忙

代码如下:

img

看一下rs这个对象有没有获取结果的方法

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/742465
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:使用jsp进行简单的网页登录(数据库为Oracle)
  • 以下回答由chatgpt基于相关博客总结生成:

    我可以帮你解决这个问题。

    在泛微E9中使用JSP调用存储过程并获取返回值的步骤如下:

    1. 首先,在JSP文件中添加连接数据库的代码。你可以使用JDBC来连接Oracle数据库。确保你正确配置了数据库连接信息,包括驱动程序、数据库URL、用户名和密码。

    2. 创建一个CallableStatement对象来调用存储过程。使用该对象的prepareCall方法,并传入存储过程的调用语句。例如,如果你的存储过程名字是myProcedure,并且它有一个输出参数,你可以这样调用它:CallableStatement cstmt = conn.prepareCall("{call myProcedure(?)}");。这里的conn是你之前创建的数据库连接对象。

    3. 设置存储过程的参数。如果存储过程有输入参数,你可以使用setXXX方法来设置参数的值。例如,如果有一个名为param1的输入参数,你可以这样设置它的值:cstmt.setString(1, param1Value);。这里的param1Value是你输入的值。

    4. 注册输出参数。如果存储过程有输出参数,你需要使用registerOutParameter方法来注册输出参数的类型。例如,如果有一个名为outputParam的输出参数,你可以这样注册它的类型:cstmt.registerOutParameter(1, Types.XXX);。这里的Types.XXX是输出参数的数据类型。

    5. 执行存储过程。使用executeexecuteUpdate方法来执行存储过程。如果你只是执行存储过程而不需要返回结果集,可以使用executeUpdate。例如,cstmt.executeUpdate();

    6. 获取输出参数的值。使用getXXX方法来获取输出参数的值。例如,如果outputParam是一个整型输出参数,你可以使用int value = cstmt.getInt(1);来获取它的值。

    以下是一个示例代码,展示如何在泛微E9中使用JSP调用存储过程并获取返回值:

    <%
        Connection conn = null;
        CallableStatement cstmt = null;
        try {
            // 连接数据库
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "username", "password");
    
            // 调用存储过程
            cstmt = conn.prepareCall("{call myProcedure(?, ?)}");
            cstmt.setString(1, param1Value);  // 设置输入参数的值
            cstmt.registerOutParameter(2, Types.INTEGER);  // 注册输出参数的类型
    
            // 执行存储过程
            cstmt.executeUpdate();
    
            // 获取输出参数的值
            int outputValue = cstmt.getInt(2);
    
            // 输出结果
            out.println("Output Value: " + outputValue);
    
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (cstmt != null) {
                    cstmt.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    %>
    

    请注意,你需要根据实际情况修改代码中的数据库连接信息、存储过程的调用语句、输入参数和输出参数的类型等。此外,你可能还需要处理异常和关闭数据库连接的操作。这个示例代码仅是一个基本框架,你需要根据自己的需求进行适当的修改和扩展。

    希望这个解决方案能够帮到你。如果你有任何疑问,请随时询问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

JSP中调用存储过程
可以参考下


JDBC调用存储过程_jdbc调用存储过程返回值_samir_liu的博客-CSDN博客 http://www.cnblogs.com/gaopeng527/p/4447583.htmlhttp://blog.csdn.net/yerenyuan_pku/article/details/52304479在JDBC API中提供了调用存储过程的方法,通过CallableStatement对象进行操作。CallableStatement对象位于Java.sql包中,它继承于St_jdbc调用存储过程返回值 https://blog.csdn.net/m0_37683758/article/details/71713850

@有着吃下一头牛的心
直接类似这样
rs.next();
String name = rs.getString("name");

以下是我今天翻源码碰到的也是存储过程,你自己dbug调试一下就知道了,如果没有值那应该就是你的存储过程写的有问题了。多dbug:

img

看看返回的数据是什么样

检查JSP代码中是否存在错误的处理逻辑,例如未正确获取输出参数或未将其转换为预期的数据类型。

检查一下代码有没有错误

参考gpt

<%@ page import="java.sql.*" %>

<%
// 连接数据库
Connection conn = null;
CallableStatement cstmt = null;
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String username = "your_username";
String password = "your_password";
try {
    Class.forName("oracle.jdbc.driver.OracleDriver");
    conn = DriverManager.getConnection(url, username, password);

    // 调用存储过程
    String sql = "{call your_procedure(?, ?)}";
    cstmt = conn.prepareCall(sql);
    cstmt.registerOutParameter(2, Types.VARCHAR); // 注册输出参数
    cstmt.setInt(1, your_input_value); // 设置输入参数
    cstmt.execute();

    // 获取输出参数的值
    String outputValue = cstmt.getString(2);
    out.println("Output value: " + outputValue);
} catch (Exception e) {
    e.printStackTrace();
} finally {
    // 关闭连接
    if (cstmt != null) {
        cstmt.close();
    }
    if (conn != null) {
        conn.close();
    }
}
%>

参考gpt:
结合自己分析给你如下建议:
您可能需要使用OUT参数来获取存储过程中的出参。OUT参数是由存储过程写入的参数,您可以在调用存储过程时为其指定变量,并在执行后获取变量的值。
例如,如果您的存储过程是这样的:

create or replace procedure p_getSdept(NAME IN varchar2,DEPT OUT varchar2) is
  temp varchar(20);
begin
  select s.SDEPT into temp from student s where s.SNAME=NAME;
  DEPT := temp;
end p_getSdept;

那么您可以在JSP文件中这样调用它:

//创建CallableStatement对象
CallableStatement cs = conn.prepareCall("{call p_getSdept(?,?)}");
//设置输入参数
cs.setString(1, "张三");
//注册输出参数
cs.registerOutParameter(2, Types.VARCHAR);
//执行存储过程
cs.execute();
//获取输出参数的值
String dept = cs.getString(2);
//打印输出参数的值
System.out.println(dept);

在泛微OA系统中,JSP页面可以通过调用存储过程来实现一些业务逻辑。本篇文章将详细介绍如何使用JSP调用存储过程,并获取返回值内容。

  1. 准备工作

在开始编写JSP代码之前,我们需要先准备好以下内容:

  • 数据库连接池:在泛微系统中,我们可以使用tomcat提供的JNDI数据源,也可以使用泛微提供的泛型数据源。
  • 存储过程:我们需要先在数据库中编写好存储过程,以供JSP调用。
  • JSP页面:我们需要编写JSP页面,以调用存储过程,并获取返回值内容。
  1. JSP调用存储过程

在JSP页面中,我们可以使用java.sql包提供的CallableStatement类,来调用存储过程。

下面是一个简单的示例,演示了如何调用一个没有参数的存储过程:

<%@ page language="java" %>
<%@ page import="java.sql.*" %>

<%
    Connection conn = null;
    CallableStatement stmt = null;
    ResultSet rs = null;

    try {
        // 获取连接
        Context ctx = new InitialContext();
        DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/oasys");
        conn = ds.getConnection();

        // 调用存储过程
        String sql = "{call my_proc()}";
        stmt = conn.prepareCall(sql);
        stmt.execute();

        // 处理结果集
        rs = stmt.getResultSet();
        while (rs.next()) {
            out.println(rs.getString("name"));
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (rs != null) rs.close();
        if (stmt != null) stmt.close();
        if (conn != null) conn.close();
    }
%>

在上面的示例中,我们首先获取了数据库连接,然后调用存储过程,最后处理结果集。

如果存储过程带有参数,我们可以使用setXXX()方法来设置参数的值,例如:

String sql = "{call my_proc(?)}";
stmt = conn.prepareCall(sql);
stmt.setString(1, "hello");
stmt.execute();
  1. 获取存储过程返回值

有些存储过程会返回一个或多个值,我们需要使用CallableStatement类提供的getXXX()方法,来获取这些返回值。

下面是一个示例,演示了如何获取存储过程的返回值:

<%@ page language="java" %>
<%@ page import="java.sql.*" %>

<%
    Connection conn = null;
    CallableStatement stmt = null;
    try {
        // 获取连接
        Context ctx = new InitialContext();
        DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/oasys");
        conn = ds.getConnection();

        // 调用存储过程
        String sql = "{? = call my_proc()}";
        stmt = conn.prepareCall(sql);
        stmt.registerOutParameter(1, Types.INTEGER);
        stmt.execute();

        // 获取返回值
        int ret = stmt.getInt(1);
        out.println("返回值:" + ret);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (stmt != null) stmt.close();
        if (conn != null) conn.close();
    }
%>

在上面的示例中,我们首先注册了一个返回值参数,并在调用存储过程后,使用getInt()方法获取返回值。

  1. 结语

在泛微OA系统中,使用JSP调用存储过程是一种常见的业务场景。通过本文的介绍,相信读者已经了解了如何在JSP页面中调用存储过程,并获取返回值内容。

泛微JSP是一种Java Server Pages的开源框架,可以用于Web应用程序的开发。在使用泛微JSP进行开发时,我们通常需要与数据库进行交互,使用存储过程是一种高效的方式。

使用JSP调用存储过程

要使用JSP调用存储过程,我们首先需要创建一个JDBC连接。在泛微JSP中,可以使用JNDI来维护数据库连接。

在进行数据库操作时,我们通常采用Statement或PreparedStatement对象。下面是一个使用PreparedStatement调用存储过程的示例:

<%!
    public int callStoredProcedure() {
        int result = 0;

        Connection conn = null;
        PreparedStatement pstmt = null;

        try {
            Context ctx = new InitialContext();
            DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MyDataSource");

            conn = ds.getConnection();

            String sql = "{call my_stored_proc(?, ?)}";
            pstmt = conn.prepareCall(sql);

            pstmt.setInt(1, 123);
            pstmt.setString(2, "test");

            ResultSet rs = pstmt.executeQuery();

            if (rs.next()) {
                result = rs.getInt(1);
            }

            rs.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (pstmt != null) pstmt.close();
                if (conn != null) conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return result;
    }
%>

在这个示例中,我们使用JNDI从应用服务器中查找数据源,并使用数据源创建一个数据库连接。然后,我们创建一个PreparedStatement对象,并用它来调用存储过程。调用存储过程时,我们需要指定参数的类型和值。在这个例子中,我们使用setInt和setString方法来设置参数。

当存储过程执行完毕后,我们可以从ResultSet对象中获取结果。在这个示例中,我们使用getInt方法来获取结果。

获取存储过程返回值

有些存储过程会返回一个值,我们需要获取这个返回值。在使用泛微JSP调用存储过程时,我们可以使用CallableStatement对象来获取返回值。

下面是一个使用CallableStatement调用存储过程并获取返回值的示例:

<%!
    public int callStoredProcedure() {
        int result = 0;

        Connection conn = null;
        CallableStatement cstmt = null;

        try {
            Context ctx = new InitialContext();
            DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MyDataSource");

            conn = ds.getConnection();

            String sql = "{? = call my_stored_proc(?, ?)}";
            cstmt = conn.prepareCall(sql);

            cstmt.registerOutParameter(1, Types.INTEGER);

            cstmt.setInt(2, 123);
            cstmt.setString(3, "test");

            cstmt.execute();

            result = cstmt.getInt(1);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (cstmt != null) cstmt.close();
                if (conn != null) conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return result;
    }
%>

和前面的示例一样,我们首先获取一个数据库连接。然后,我们创建一个CallableStatement对象,并用它来调用存储过程。调用存储过程时,我们需要注册一个输出参数来获取返回值。在这个示例中,我们使用registerOutParameter方法来注册一个整数类型的输出参数。

当存储过程执行完毕后,我们可以使用getInt方法来获取输出参数的值。在这个示例中,我们将返回值赋值给result变量。

总结

使用泛微JSP调用存储过程是一种高效的方式,可以大大提高数据库的访问效率。在进行数据库操作时,我们需要使用JNDI维护数据库连接,并使用Statement或PreparedStatement对象进行数据库操作。在获取存储过程返回值时,我们可以使用CallableStatement对象来注册输出参数并获取返回值。