【问题标题】:How to return Cursor as OUT parameter in DB2 for z/OS如何在 DB2 for z/OS 中将 Cursor 作为 OUT 参数返回
【发布时间】:2020-08-10 10:47:37
【问题描述】:

我使用 DB2 for z/OS 作为我的数据库。我在 DB2 中编写了一个存储过程,它将返回一些结果集。目前我已经声明了一个游标并在存储过程结束时调用 OPEN Cur。我正在从 Java 调用我的程序,我正在使用 ResultSet resultSet = callableStatement.getResultSet();My SP 获取数百条记录的结果集。但是当表包含数百万个数据时会失败:

原因:com.ibm.db2.jcc.am.SqlException:DB2 SQL 错误: SQLCODE=-904, SQLSTATE=57011, SQLERRMC=00C90084;00000100;DB2-MANAGED 没有二次分配或 US 的空间,DRIVER=4.24.92

我想知道

  1. 是否可以在我的 SP 中将 Cursor 作为 OUT 参数返回?
  2. 使用OPEN curs way和CURSOR作为OUT参数取数据有什么区别?
  3. 数据量大时如何解决问题?
  4. CURSOR 作为 OUT 参数能解决问题吗?

已编辑(SP 详细信息):

DYNAMIC RESULT SET 1
P1: BEGIN

    -- Declare cursor
    DECLARE cursor1 CURSOR WITH RETURN FOR
     
    select a.TABLE_A_ID as TABLE_A_ID,
           b.TABLE_B_ID as TABLE_B_ID
    from TABLE_A a 
    left join TABLE_C c on 
    a.TABLE_A_ID = c.TABLE_A_ID
    inner join TABLE_B b on
    b.CONTXT_ID = a.CONTXT_ID 
    AND b.CONTXT_POINT_ID = a.CONTXT_POINT_ID 
    AND b.CONTXT_ART_ID = a.CONTXT_ART_ID 
    where c.TABLE_A_ID is null ;

    OPEN cursor1;

【问题讨论】:

  • 请编辑您的问题以准确指定“失败”的含义,显示确切的错误代码和错误消息。
  • 添加错误详情

标签: stored-procedures db2 database-cursor


【解决方案1】:

请参阅文档here 以获取处理此特定情况的建议。考虑每个建议。

与您的 DBA for Z/OS 交谈,并根据您的具体情况决定最佳行动方案。

由于我们看不到您的存储过程源代码,因此可能存在多个选项,尤其是存储过程中的查询未优化时。

虽然通常在 Db2 服务器端为相关表空间分配更多临时空间更容易,但这可能只是暂时掩盖问题而不是修复它。但如果存储过程设计不佳或查询未优化,请先修复它。

SQL PL 过程可以返回 CURSOR 作为输出参数,但调用 SQL PL 代码可以使用该游标。 Java 可能无法使用它。

您问“当数据巨大时如何解决问题”,尽管您没有用数字定义巨大的含义。这是一个相对术语。正确编码您的 SQL 过程,正确索引该过程中的每个查询并仔细验证访问计划。返回结果集中尽可能少的行数和列数。

【讨论】:

  • 我已经添加了我的 SP 基本上在做什么。如果我在 SP 本身内部执行此操作(通过迭代游标),我可以将我的 SP 中的 SELECT 的结果集插入到第三个表中,而不会出现任何资源超出问题。我不能在从 SP 返回的游标的帮助下在 Java 中使用相同的迭代(这样我就不会遇到资源问题?)。对不起,如果我问一个愚蠢的疑问
  • 如答案中所述,获取过程中使用的静态查询的访问计划,并使用您站点上可用的任何工具来优化查询_(尽可能只访问索引),同时尊重您站点上强加的任何 WLM 边界。
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
相关资源
最近更新 更多