当前位置: 首页 > 知识库问答 >
问题:

使用游标调用Springboot java oracle过程

谷梁子昂
2023-03-14

我是Spring世界里的一个新人。我有一个问题,从oracle包调用过程并将游标返回到Spring的更好的方法是什么?

我可以像在经典java中那样使用“可调用语句”,但我认为还有更好、更干净的方法,如何做到这一点?

姓名:尼奥,玛丽姓:安德森,史密斯性别:M,W年龄:20,25卷:测试,测试

b)同时,我们有一个包含过程的包HOME_TEST_PKG

过程show_people_data(VARCHAR2中的i_name,o_resp_set OT SYS_REFCURSOR)

dbms_output.put_line('Hello 1');

打开o_resp_set以选择姓名、姓氏、性别、年龄、从name=I_NAME人中滚动;

dbms_output.put_line('Hello 2');

dbms_output.put_line('Hello  3');

OPEN o_resp_set FOR SELECT 'something wrong' as error from dual;
@RequestMapping(value = "/DBtest")
@ResponseBody
public Map DBtest() throws SQLException {

private String PROCEDURE_NAME = "{call test.home_test_pkg.show_people_data(?,?)}";

    JSONObject answer = new JSONObject();
    CallableStatement stmt = null;
    Connection conn = null;
    ResultSet rset = null;
    String testNameNeo="NEO"; --simple check input for procedure
    try {
        conn = DriverManager.getConnection(
                "jdbc:oracle:thin:@localhost:1521:XE", "testname", "testpass");
        stmt = conn.prepareCall(PROCEDURE_NAME);
        stmt.setString(1, testNameNeo);
        stmt.registerOutParameter(2, OracleTypes.CURSOR);
        stmt.execute();
        rset = (ResultSet) stmt.getObject(2);

        while (rset.next()) {
            String name = rset.getString(1);
            log.info(name);
            answer.put("name",rset.getObject(1).toString());
            answer.put("surname",rset.getObject(2).toString());
        }
    }catch (Exception a){
        log.error("Exception "+a);
    }finally {
        rset.close();
        stmt.close();
        conn.close();
    }
    return Collections.singletonMap("response", answer);
}

共有1个答案

西门奇希
2023-03-14

我认为最简单的解决方案是像下面的示例那样使用@Procedure注释创建一个存储库接口。

@Repository
public interface MyRepository extends CrudRepository<MyEntity, Long> {

  @Procedure(name = "test.home_test_pkg.show_people_data")
  List<MyEntity> getPeopleData(@Param("my_param_in") String myParamIn);
}
 类似资料:
  • 场景:我有一个存储过程,它基于两个输入从表中获取数据:一个日期和一个字符串(这是一个列名)。第一个过程是从另一个过程调用的,该过程使用光标循环表中的行,并将每一行传递给第一个过程的字符串(要检查的列名)。我对第二个过程(即直接调用的过程)的输入是日期。 问题:当我单独调用它时,我的第一个过程运行良好。我的第二个过程是抛出一些我不知道如何修复的语法错误。 Obs:我已经在这里检查了关于这个主题的一些

  • 我有一个微调器,我用数据库sqlite列中的光标填充它,它工作正常,但并不理想。我添加了另一个微调器来选择列并在微调器中显示,但这是我在构建适配器时遇到的问题。这是我的代码: 我从数据库中正确地获取列,但是如果我从其他列传递光标,应用程序无法构建适配器。我尝试只传递String[]中的name列,但也失败了。 谢了。

  • 我想使用Java流使用数据库游标。我希望Java流能够根据需要获取和处理行,并避免先在内存中加载所有500万行,然后再进行处理。 是否可以在不将整个表加载到RAM中的情况下使用它? 到目前为止,我的代码如下所示: 它确实工作得很好,但是有点麻烦,我想利用流应用编程接口。

  • 本文向大家介绍MySql游标的使用实例,包括了MySql游标的使用实例的使用技巧和注意事项,需要的朋友参考一下 mysql游标使用的整个过程为: 1.创建游标 2.打开游标 3.使用游标 4.关闭游标 实例代码如下所示:

  • 问题内容: 由于某些奇怪的原因,我无法从Python测试应用程序中的callproc调用中获得结果。MqSQL 5.2.47中的存储过程如下所示: 现在,在Python 3.3中使用PyCharm时,在调用此存储过程时似乎什么也找不到。这段代码为我提供了预期的结果: 但是这段代码带有cursor.fetchall()或cursor.fetchone()… …返回“ mysql.connector.

  • 我有一个在包中定义的存储过程。该过程接受两个参数,一个是游标: 我是这样调用这个过程的: 它将返回以下错误: 你好,阿尼尔班。