IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    perl dbi programming - data copy

    lazydba发表于 2010-04-25 20:38:38
    love 0
    插入到mysql数据库时,可以用insert t(a,b,c,d) values(x,x,x,x), (x,x,x,x),...形式的批量语句提高速度。

    字符串可以用 DBI 的 quote函数处理一下,处理转义字符。

    sub do_it {
    ?? my $str_sql_from_oracle =
    ?????? "select /*+ parallel(t,4) */ a,b,c,d from tab t";

    ?? my $ora_conn = &get;_oracle_connection("ora", "user", "password");
    ?? my $mysql_conn = &get;_mysql_connection("ip", port, "user", "password");

    ?? #get result set from oracle
    ?? my $rs = &get;_result_set($ora_conn, $str_sql_from_oracle);

    ?? #use batch fetch to get 100 recrods per time.
    ?? while ( my $rows = $rs->fetchall_arrayref(undef, 100)) {
    ? ?? ? #construct the batch insert statement
    ?????? my $str_ins_batch = "insert into tab(a, b, c, d) values ";

    ??? ?? my $i = 0;

    ?????? for my $r (@$rows) {
    ?????????? #quote string
    ?????????? my $str_q = $mysql_conn->quote($r->[0]);

    ?????????? if ($i == 0 ) {
    ????????????? $str_ins_batch = $str_ins_batch . "(" . $str_q . "," . $r->[1] . "," . $r->[2] . ",'" . $r->[3] . "')";
    ??????????? } else {
    ?????????????? $str_ins_batch = $str_ins_batch. ",(" . $str_q . "," . $r->[1] . "," . $r->[2] . ",'" . $r->[3] . "')";
    ??????????? }
    ???????????? $i = $i + 1;
    ???????? }
    ?????? my $stmt_batch = $mysql_conn->prepare($str_ins_batch);
    ?????? $stmt_batch->execute();
    ?????? $mysql_conn->commit();
    ?? }
    ?? $mysql_conn->disconnect();
    ?? $ora_conn->disconnect();
    }


沪ICP备19023445号-2号
友情链接