我在我的java程序中使用下面的函数将临时表中的列复制到主表中。PLSQL循环提交更新
FUNCTION TEST(TBL_NAME VARCHAR2, TMP_TBL_NAME VARCHAR2, ID_COL VARCHAR2, REQ_COL VARCHAR2, BATCH_SIZE NUMBER) RETURN NUMBER AS
BEGIN
EXECUTE IMMEDIATE 'SELECT COUNT(1) FROM ' || TMP_TBL_NAME INTO TOTAL_RECORDS;
OFFSET := 0;
WHILE OFFSET < TOTAL_RECORDS
LOOP
MAX_RESULTS := OFFSET + BATCH_SIZE;
EXECUTE IMMEDIATE 'SELECT ' || ID_COL || ', ' || REQ_COL || ' FROM ' || TMP_TBL_NAME || ' WHERE SEQ_NBR BETWEEN :OFFSET AND :MAX_RESULTS' BULK COLLECT INTO SEQ_IDS, REQ_COL_VALUESS USING OFFSET, MAX_RESULTS;
FORALL IND IN SEQ_IDS.FIRST .. SEQ_IDS.LAST
EXECUTE IMMEDIATE 'UPDATE ' || TBL_NAME || ' SET ' || REQ_COL || ' = :REQ_COL_VAL WHERE ' || ID_COL || ' = :ID_COL_VAL' USING REQ_COL_VALUESS(IND), SEQ_IDS(IND);
OFFSET := MAX_RESULTS;
COMMIT;
END LOOP;
RETURN 0;
EXCEPTION
WHEN OTHERS THEN
RAISE CUST_EXCEPTION;
END;
预期的结果是,当我与100000运行的batch_size,对于每个提交100000个记录有作为id_col我用上面是主键进行更新。在运行java程序之后,在我检查主表中的更新的时候,我能够看到类似正在更新的批次6469或80148的记录。
临时表中大约有1000万条记录。如果我删除了所有更新语句,我正在以适当的批处理大小遍历数据。
可以在任何澄清我对为什么发生这种情况
我试过光标也。我遇到的问题不是迭代,而是更新。对于临时表中的所有记录,主表中有一条记录。当我检查更新的记录数仍然不等于我的batch_size的倍数。 –
例如BATCH_SIZE = 10 迭代1 offset = 0,max_result = 10; 迭代2 offset = 10,max_result = 20; select seg(从级别<1000的双连接中选择级别seg),其中seg在0和10之间; select seg(从级别<1000的双连接中选择级别seg),其中seg在10和20之间; 检查结果。 –