DBIx-BulkUtil
view release on metacpan or search on metacpan
lib/DBIx/BulkUtil.pm view on Meta::CPAN
join(",", @fields),
join(",", map {
$col_map{$_} ? $stg_has{$col_map{$_}} ? "s.$col_map{$_}" : $col_map{$_}
: $stg_has{$_} ? "s.$_" : "NULL"
} @fields),
);
# No update if no update columns
$merge_sql =~ s/^WHEN MATCHED.*\n//m unless @upd_cols;
print("Executing: $merge_sql\n");
return 1 if $args{NoExec};
$dbh->do("ALTER SESSION ENABLE PARALLEL DML") if $args{Parallel};
my $rows = $dbh->do($merge_sql) + 0;
print("$rows rows updated/inserted\n\n");
return $rows;
}
}
# #!!!UNFINISHED!!!
# Static block for mk_ext_table
{
my $sql = <<SQL;
CREATE TABLE %s (
%s
)
ORGANIZATION EXTERNAL (
TYPE oracle_loader
DEFAULT DIRECTORY %s
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE
LOGFILE 'TEST.log'
FIELDS TERMINATED BY '%s'
)
LOCATION ('%s')
)
SQL
sub mk_ext_table {
my $self = shift;
my %args = @_;
my $table = $args{Table} or confess "Need table prototype for external table";
my $ext_table = $args{Name} || "ext_${table}$$";
my $dir = $args{Dir} or confess "Need directory for external table $table";
my $file = $args{File} or confess "Need file for external table $table";
my $cols = $self->column_info($table);
my $cmap = $cols->{MAP};
my @col_list;
for my $col (@{$cols->{LIST}}) {
my $col_str = $col;
my $cdata = $cmap->{$col};
my $type = $cdata->{TYPE_NAME};
my $dec = $cdata->{DECIMAL_DIGITS};
$col_str .= " $type";
my $size = $cdata->{COLUMN_SIZE};
for ($type) {
$col_str .=
/CHAR/ ? "($size)"
: /NUMBER/ ? (defined $dec) ? "($size,$dec)" : ''
: '';
}
#$col_str .= " DEFAULT $cdata->{COLUMN_DEF}" if defined $cdata->{COLUMN_DEF};
#$col_str =~ s/\s+$//;
#$col_str .= " NOT NULL" unless $cdata->{NULLABLE};
push @col_list, $col_str;
}
my $create_sql = sprintf($sql,
$ext_table,
join(",\n", @col_list ),
$dir,
#$args{RowDelimiter} || "\\n",
$args{Delimiter} || "|",
$file,
);
$self->{DBH}->do($create_sql);
return $ext_table;
}
}
package DBIx::BulkUtil::Release;
sub new {
my ($class, $f) = @_;
bless $f, $class;
}
sub DESTROY { $_[0]->() }
1;
__END__
=head1 NAME
DBIx::BulkUtil - Sybase/SybaseIQ/Oracle bulk load and other utilities
=head1 SYNOPSIS
use DBIx::BulkUtil;
# Return just the regular DBI handle
my $dbh = DBIx::BulkUtil->connect(%options, \%dbi_options);
# Or return a DBI handle and a 'Utility' object.
# syb_connect,ora_connect, and iq_connect methods are also provided
# to directly specify database type
my ($dbh, $db_util) = DBIx::BulkUtil->connect(%options, \%dbi_options);
# Wrappers for Sybase bcp, Oracle sqlldr, IQ 'load table'
$db_util->bcp_in($table, [$file], [\%options]);
$db_util->bcp_out($table, [$file], [\%options]);
$column_info = $db_util->column_info($table);
$insert_sth = $db_util->prepare(%options);
$cnt = $db_util->merge(%options);
$blk_sth = $db_util->blk_prepare($table, %options);
( run in 1.596 second using v1.01-cache-2.11-cpan-5a3173703d6 )