java - 从 PLSQL 过程获取值列表

标签 java oracle plsql

我是 Java 和 PLSQL 新手。我已经在 PLSQL 中构建了这个过程:

    PROCEDURE getLogs (
    p_idcontract            IN          NUMBER,
    p_iduser                IN          NUMBER,
    o_logs                  OUT         VARCHAR2
  )
  IS   
  BEGIN
      SELECT logData INTO o_logs
      FROM SERVICELOG 
      WHERE IDCONTRACT= p_idcontract 
      AND IDUSER= p_iduser;

  END getLogs;

如果脚本检测到多行,则向启动它的 Java 类返回此消息:

ORA-01422: exact fetch returns more than requested number of rows

请问,我如何返回一个 HashMap 或类似的,准备好输出到Java?谢谢。

最佳答案

我将使用引用光标作为输出参数,然后在java程序中构建 map 。 https://oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets 您还可以在 Oracle 中定义类似于 Java Array 的用户类型。

    PROCEDURE getLogs (
    p_idcontract            IN          NUMBER,
    p_iduser                IN          NUMBER,
    p_recordset OUT SYS_REFCURSOR
  )
  IS   
  BEGIN
 OPEN p_recordset FOR
      SELECT logData 
      FROM SERVICELOG 
      WHERE IDCONTRACT= p_idcontract 
      AND IDUSER= p_iduser;

  END getLogs;

Java代码:

CallableStatement stmt = conn.prepareCall("BEGIN getLogs(?, ?, ?); END;");
      stmt.setInt(1, 0);
      stmt.setInt(2, 0);
      stmt.registerOutParameter(3, OracleTypes.CURSOR);
      stmt.execute();
      ResultSet rs = ((OracleCallableStatement)stmt).getCursor(3);
      while (rs.next()) {
        ;
       //here build your Map, list or whatever you want
      }

关于java - 从 PLSQL 过程获取值列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40020954/

相关文章:

oracle - 没有更多的数据要从套接字读取

sql - 如何在 ORACLE 中使用 ROWNUM 进行最大排序和另一个最小排序?

Oracle - 如何使用动态绑定(bind)参数定义动态 SQL?

java - URLConnection.getInputStream() : Connection timed out

node.js - 无法使用npm安装oracle包

mysql - 计入 SELECT DISTINCT 查询?

sql - 过滤 SQL 列中仅包含数字数据的行

java - Watson 语音转文本未经授权的请求错误401

java - java中如何缓存表数据

java - 我的 System.out.println();继续打印 null 而不是它应该打印的文本