我遇到了一个重大问题,并试图寻找解决方法。我在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;
答案 0 :(得分:0)
由于源表的结构没有完全呈现,我将在这里做一些假设。
我们假设记录包含一个可用作参考的唯一字段(可以是计数器或时间戳)。我在这里假设该字段是时间戳。
我们还假设PB接受带参数的游标(并非所有解决方案都可以;如果没有,则有简单的解决方法)。
您可以将光标修改为:
[注意:我还假设此处提供的语法对您的环境有效;如果没有,改编很简单]
p_Start_Timestamp
在上面:
CURRENT_TIMESTAMP()
是一个收到的时间戳参数,该参数最初为空,然后将包含在上一次调用中获取的OLDEST时间戳,
<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>
是您的环境返回当前时间戳的函数。
此解决方案仅在您需要向一个方向(即从当前到过去)前进时才会起作用,并且您正在内部缓冲区中累积所有已获取的记录,以防您需要滚动向上试。
希望这会让事情更加清晰。
答案 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