使用并行运行的perl脚本的Oracle DBD插入和更新表

时间:2018-11-01 16:28:31

标签: oracle perl parallel-processing dbi

我有一个并行运行的perl脚本。

ls -lrt INCOMING | grep .out | head -${PARALLEL_COUNT} |  awk '{print $9}' | parallel "./new_control.pl" {}

处理csv文件的脚本,用于响应服务器数据。 当脚本并行运行时,我有异常

Uncaught exception from user code:
DBD::Oracle::st execute failed: ORA-00001: unique constraint (PRE.SYS_C006373) violated (DBD ERROR: OCIStmtExecute) [for Statement "INSERT INTO DISK
(
    ID,
    RECORD_ID,
    MOUNT_POINT,
    TOTAL_SIZE,
    USED,
    AVALIABLE,
    CAPACITY,
)
VALUES ((SELECT NVL(MAX(ID)+1, 1) FROM DISK), ?, ?, ?, ?, ?, ?, ?, ?, ?)

我想问题是ID列正在插入增量值。

(SELECT NVL(MAX(ID)+1, 1)

,并且另一个脚本实例已经在插入相同的ID。

我尝试更改AutoCommit,但没有任何积极结果

our $dbh = DBI->connect("dbi:Oracle:host=$host;sid=$sid;port=$port", $username, $password,
{
    RaiseError => 1,
    AutoCommit => 1 # this will need to call commit manually (if value is 0) after changes in DB.
});

当脚本不是并行运行时,一切都可以。我不想在并行运行脚本之前生成这些ID。

1 个答案:

答案 0 :(得分:0)

假设您要在此处进行的操作是为了加快数据加载速度,那么最好使用sqlldr工具(Oracle批量加载工具)。

几乎可以肯定,这是不受IO约束的,将插入语句放在多个内核中不会使它变得更快,并且会产生新的问题,如您上面提到的那样。