PowerBuilder 12.5 sql游标事务大小错误

时间:2016-11-15 10:44:24

标签: sql cursor powerbuilder

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

我在一点上使用CURSOR,但是aplications只在sql中崩溃了。在PB中使用debu,我发现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; 

2 个答案:

答案 0 :(得分:0)

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

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

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

您可以将光标修改为:

[注意:我还假设此处提供的语法对您的环境有效;如果没有,改编很简单]

p_Start_Timestamp

在上面:

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

  2. <script src="https://www.gstatic.com/firebasejs/3.6.1/firebase.js"> </script> <script> // Initialize Firebase   var config = {   apiKey: "AIzaYUIYUkokngctrIbR9krB6Do", authDomain: "HelloWorld.firebaseapp.com", databaseURL: "https://HelloWorld.firebaseio.com/", storageBucket: "HelloWorld.appspot.com", messagingSenderId: "8298539696"  };  //This was the first was we tried to do it firebase.initializeApp(config); //var rootRef = firebase.database().ref(); //var dist = rootRef.child("dalemccaugh"); var ref = firebase.database().ref(); ref.once("value") .then(function(snapshot) { var test = snapshot.child("dalemccaugh").val(); console.log(test); }); //The was the second way we tried function printData() { //console.log(dist) dist.on("value", function(snapshot) { console.log(snapshot.val()); }, function(errorObject) { console.log("The read failed: " +errorObject.code); }); } </script> 是您的环境返回当前时间戳的函数。

  3. 此解决方案仅在您需要向一个方向(即从当前到过去)前进时才会起作用,并且您正在内部缓冲区中累积所有已获取的记录,以防您需要滚动向上试。

    希望这会让事情更加清晰。

答案 1 :(得分:0)

首先,谢谢你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