【问题标题】:PowerBuilder 12.5 sql cursors transaction size errorPowerBuilder 12.5 sql 游标事务大小错误
【发布时间】:2016-11-21 15:02:58
【问题描述】:

我遇到了一个大问题并试图找到解决方法。我在 PB12.5 中有一个适用于 sql 和 oracle dbs 的应用程序..(有很多数据)

我在某个点使用 CURSOR,但应用程序仅在 sql 中崩溃。在 PB 中使用调试我发现由于巨大的事务大小,sql 连接返回 -1。但我想逐行获取我的数据.. 是否有任何解决方法来获取分页等数据?我的意思是让我们先获取前 1000 行,然后再获取其他 1000 行,依此类推.. 我希望你理解我想要实现的目标(打破获取过程,尽可能减少事务大小),这是我的代码

DECLARE trans_Curs CURSOR FOR 
 SELECT associate_trans.trans_code  
 FROM associate_trans  
WHERE associate_trans.usage_code = :ggs_vars.usage  ORDER BY associate_trans.trans_code ;

  OPEN trans_Curs;
  FETCH  trans_Curs INTO :ll_transId;

  DO WHILE sqlca.sqlcode = 0
  ll_index += 1
        hpb_1.Position = ll_index
        if not guo_associates.of_asstrans_updatemaster( ll_transId, ls_error) then
        ROLLBACK;
        CLOSE trans_Curs;
      SetPointer(Arrow!)
      MessageBox("Update Process", "Problem with the update process on~r~n" + sqlca.sqlerrtext)
    cb_2.Enabled = TRUE
    return
 end if
 FETCH trans_Curs INTO :ll_transId;
 LOOP
 CLOSE trans_Curs; 

【问题讨论】:

  • 您可以使用两个值,开始和结束条件为查询添加限制(例如,开始条件将是当前时间戳 - 它相关,否则任何其他相关条件;结束条件将是行数。在第一个结果之后,获取时间戳(或选择的值)作为起始条件,并重新发出相同行数的选择。等等......
  • 感谢 FDavidov 的帖子,你能给我一个关于我发布的示例的例子吗?
  • 评论太长了,我会在几分钟后把它作为答案。
  • Unrleated,但是:“sql and oracle dbs”没有意义。 Oracle 一个“SQL 数据库”,因为它使用 SQL。每个关系数据库都是一个“SQL 数据库”
  • 对此很抱歉,但我认为开发人员马上就能理解其中的区别,好吧,我的错,,它既有 MS Sql 也有 oracle dbs

标签: sql cursor powerbuilder


【解决方案1】:

由于您的源表的结构没有完全呈现,我将在这里做一些假设。

假设记录包含一个可以用作参考的唯一字段(可以是计数器或时间戳)。我在这里假设该字段是时间戳。

我们还假设 PB 接受带参数的游标(并非所有解决方案都这样做;如果不是,则有简单的解决方法)。

您可以将光标修改为:

[注意:我还假设此处介绍的语法对您的环境有效;如果没有,适应很简单]

DECLARE TopTime TIMESTAMP ;
DECLARE trans_Curs CURSOR FOR 
         SELECT ots.associate_trans.trans_code  
           FROM ots.associate_trans  
          WHERE ots.associate_trans.usage_code = :ggs_vars.usage
            AND ots.associate_trans.Timestamp  < TopTime
          ORDER BY ots.associate_trans.trans_code 
          LIMIT 1000 ;
:
:
IF (p_Start_Timestamp IS NULL) THEN
    TopTime = CURRENT_TIMESTAMP() ;
ELSE
    TopTime = p_Start_Timestamp  ;
END IF ;

OPEN trans_Curs;
FETCH  trans_Curs INTO :ll_transId;
:
:

在上面:

  1. p_Start_Timestamp 是接收到的时间戳参数,最初为空,然后将包含在上一次调用中获取的 OLDEST 时间戳,

  2. CURRENT_TIMESTAMP() 是您的环境返回当前时间戳的函数。

此解决方案仅适用于您需要朝一个方向前进(即从现在到过去)并且您将所有获取的记录累积到内部缓冲区中以防您需要向上滚动再次。

希望这能让事情更清楚。

【讨论】:

  • 感谢 FDavidov 的帖子。但是这里有一点,我的表 ots.associate_trans 除了 trans_code 之外没有唯一的字段。所以不存在计数器或时间戳字段。如果它们存在,一切都会更容易。所以不幸的是,这个答案不适用。
  • 我尝试了使用 row_number 而不是 cursor 的解决方法,但这仅适用于 sql,在 oracle 中不起作用,而且似乎我的 cursors 事务大小问题仅在 sql 中发生。
  • 你没有提到它是甲骨文。您使用的是哪个版本的 Oracle?
【解决方案2】:

首先感谢 FDavidov 的努力,所以我设法使用动态数据存储而不是游标来做到这一点,所以这是我的解决方案,以防其他人需要。

    String ls_sql, ls_syntax, ls_err
    Long ll_row
    DataStore lds_info      

    ls_sql = "SELECT associate_trans.trans_code  "  &
                + " FROM associate_trans " &
                + "  WHERE  associate_trans.usage_code = '" + ggs_vars.usage +"' "&
                + " ORDER BY associate_trans.trans_code"
    ls_syntax = SQLCA.SyntaxFromSQL( ls_sql, "", ls_err )

    IF ls_err <> '' THEN
    MessageBox( 'Error...', ls_err )
    RETURN
    END IF

    lds_info = CREATE DataStore
    lds_info.Create( ls_syntax, ls_err )
    lds_info.SetTransObject( SQLCA )
    lds_info.Retrieve( )        

        DO WHILE sqlca.sqlcode = 0 and ll_row <= ll_count               
                FOR ll_row = 1 TO ll_count
                    ll_transId = lds_info.GetItemNumber( ll_row, 'trans_code' )                         
                        ll_index += 1
                        hpb_1.Position = ll_index
                        do while yield(); loop
                        if not guo_associates.of_asstrans_updatemaster( ll_transId, ls_error) then
                            ROLLBACK;
                            DESTROY lds_info
                            SetPointer(Arrow!)
                            MessageBox("Update Process", "Problem with the update process on~r~n" + sqlca.sqlerrtext)
                            cb_2.Enabled = TRUE
                            return
                        end if              
                    NEXT
                    DESTROY lds_info                    
        LOOP        

【讨论】:

  • 它与我最初的问题不同,但到目前为止是光标问题的最佳解决方案!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多