Hi Jeffrey,
Here is the calling code:
Source database is Oracle using Oracle driver while the destination
database is Netezza using ODBC driver. When all fields are populated,
the same code appears to work.
($s_stmtType, $s_sqlString) = sub_readSQLFile($s_SQL);
$s_sth = sub_prepare($s_dbh, qq{$s_sqlString});
$s_sth = sub_execute($s_dbh, $s_sth);
$s_arrayref = sub_fetchall_arrayref($s_dbh, $s_sth);
$d_sqlString = sub_getTblCols($d_dbh, $d_dbDriver, d_tblName, "
");
$d_sth = sub_prepare($d_dbh, qq{$d_sqlString});
$d_sth = sub_execute($d_dbh, $d_sth);
$d_arrayref = sub_fetchall_arrayref($d_dbh, $d_sth);
$d_sqlString = sub_insert($d_tblName, $d_arrayref);
$d_sth = sub_prepare($d_dbh, qq{$d_sqlString});
foreach $arrayref (@{$s_arrayref}) {
if ($count >= $commitPoint) {
$d_dbh->commit || die "$DBI::errstr\n";
$count = 0;
}
$d_sth = sub_executeBind($d_dbh, $d_sth, $arrayref);
$count++;
}
}
sub_disconnect($s_dbh);
sub_disconnect($d_dbh);
The sub-routines that the above code call are:
sub sub_connect($$$$) {
my ($dbDriver, $dbName, $dbUser, $dbPass) = @_;
my $dbh = DBI->connect("dbi:$dbDriver:$dbName", "$dbUser",
"$dbPass",
{ PrintError => 1, RaiseError => 1 }
) || die "$DBI::errstr\n";
return($dbh);
}
sub sub_disconnect($) {
my ($dbh) = @_;
$dbh->disconnect || die "$dbh::errstr\n";
}
sub sub_execute($$) {
my ($dbh, $sth) = @_;
$sth->execute() || die "$dbh::errstr";
return($sth);
}
sub sub_prepare($$) {
my ($dbh, $sqlString) = @_;
print "sqlString is: $sqlString\n";
my $sth = $dbh->prepare(qq{$sqlString}) || die "$dbh::errstr\n";
return($sth);
}
sub sub_readSqlFile($) {
my ($sqlFile) = @_;
my $stmtType = "";
my $sqlString = "";
open(FH, "$sqlFile") || die "$!\n";
while (<FH>) {
chomp;
s/--.*$//;
next if /^\//;
next if /^(\s)*[Ss][Pp][Oo][Oo][Ll]/;
next if /^(\s)*--/;
next if /^(\s)*$/;
next if /^(\s)*[Ss][Ee][Tt]/;
next if /^(\s)*[Ee][Xx][Ii][Tt]/;
next if /^(\s)*[Qq][Uu][Ii][Tt]/;
print "$_\n";
$sqlString = "$sqlString" . "$_";
}
close(FH);
$stmtType = "insert" if $sqlString =~
/^(\s)+[Ii][Nn][Ss][Ee][Rr][Tt]/;
$stmtType = "select" if $sqlString =~
/^(\s)+[Ss][Ee][Ll][Ee][Cc][Tt]/;
$stmtType = "delete" if $sqlString =~
/^(\s)+[Dd][Ee][Ll][Ee][Tt][Ee]/;
$stmtType = "update" if $sqlString =~
/^(\s)+[Uu][Pp][Dd][Aa][Tt][Ee]/;
$stmtType = "plsql" if $sqlString =~ /^(\s)+[Bb][Ee][Gg][Ii][Nn]/;
$sqlString =~ s/(\s)*;(\s)*$//;
return($stmtType, qq{$sqlString});
}
sub sub_getTblCols($$$$) {
my ($dbh, $dbDriver, $tblName, $owner) = @_;
my ($sqlString);
if (ucfirst($dbDriver) eq "Oracle") {
$sqlString = "SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE";
$sqlString = "$sqlString" . " TABLE_NAME = UPPER(\'$tblName\')";
$sqlString = "$sqlString" . " AND OWNER = UPPER(\'$owner\')";
$sqlString = "$sqlString" . " ORDER BY COLUMN_ID";
}
elsif (uc($dbDriver) eq "ODBC") {
$sqlString = "select column_name from all_tab_columns where";
$sqlString = "$sqlString" . " table_name = lower(\'$tblName\')";
$sqlString = "$sqlString" . " order by column_sequence_nbr";
}
else {
print "This database driver $dbDriver is not supported at this
time.\n";
exit(666);
}
return($sqlString);
}
sub sub_insert($$) {
local ($tblName, $columns) = @_;
my ($sqlString, $delimCols, $bindVars);
$delimCols = join(', ', @{$columns});
$bindVars = join ', ', ('?') x $#{$columns};
$sqlString = "insert into " . $tblName . " (" . $delimCols . ")
values" . " (" . $bindVars . ")";
return($sqlString);
}
sub sub_fetchallrows($$) {
my ($dbh, $sth) = @_;
my ($arrayref);
$arrayref = $sth->fetchall_arrayref() || die "$dbh::errstr\n";
return($arrayref);
}
sub sub_executeBind($$$) {
local ($dbh, $sth, $bindVar) = @_;
$sth->execute(@$bindVar) || die "$dbh::errstr";
return($sth);
}
--- Jeffrey Seger <[EMAIL PROTECTED]> wrote:
> In order to figure out what's going awry, I'd need to see some code.
> Preferably the minimum amount necessary to replicate the error.
>
> Also, do you have multiple statement handles attached to this dbh?
> Try
> printing $sth->{Statement} rather than $dbh->{Statement}. Are you
> checking
> for errors at the prepare?
>
>
>
> On 4/1/06, Peter Loo <[EMAIL PROTECTED]> wrote:
> >
> > Hi Martin,
> >
> > The value for $dbh->{Statemet} is as follows:
> >
> > insert into p_dlvrb_study_attributes (dlvrb_gid, study_gid,
> client_gid,
> > slsfc_gid, mkt_def_gid, mkt_def_desc, store_panl_gid,
> > study_anlys_typ_cde, extnd_lkbck_strt_dte, cohrt_strt_dte,
> > cohrt_end_dte, study_end_dte, lkbck_prd_days_nbr,
> study_prd_days_nbr,
> > dlvry_freq_typ_cde, dlvrb_error_flg_desc, std_err_thrhld_nbr,
> > std_err_ind, actl_dlvry_dte, dlvry_frmt_typ_desc, study_nam,
> > study_anlys_desc, slsfc_nam, client_long_nam, std_err_rsn_desc,
> > sob_clsfy_row_cnt, sob_prctr_demo_row_cnt, sob_pay_typ_row_cnt,
> > sob_sw_dtl_row_cnt, sob_prctr_row_cnt, sob_unq_ptnt_row_cnt,
> > pc_clsfy_row_cnt, pc_ptnt_demo_row_cnt, pc_prctr_row_cnt,
> > mkt_cnfgr_gid, itime_prjct_id, client_cntct_nam, dlvrb_nbr) values
> (?,
> > ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
> ?, ?,
> > ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
> >
> > Thanks.
> >
> > Peter
> >
> >
> > --- "Martin J. Evans" <[EMAIL PROTECTED]> wrote:
> >
> > > Peter Loo wrote:
> > >
> > > >Hi,
> > > >
> > > >I am trying to pass an array reference to $sth->execute and I am
> > > >getting the following error:
> > > >
> > > >DBD::ODBC::st execute failed: called with 38 bind variables when
> 0
> > > are
> > > >needed at /usr/local/apps/common/devl/bin/GlobalRoutines.pm line
> 42.
> > > >
> > > >The code I am using is as follows:
> > > >
> > > > sub sub_executeBind($$$) {
> > > > local ($dbh, $sth, $bindVar) = @_;
> > > > $sth->execute(@$bindVar) || die "$dbh::errstr";
> > > > return($sth);
> > > > }
> > > >
> > > >Will someone please help me understand this error message?
> > > >
> > > >Thanks in advance.
> > > >
> > > >Peter
> > > >
> > > >Peter Loo
> > > >Worldwide Consulting, Inc.
> > > >Phoenix, Arizona
> > > >U.S.A.
> > > >
> > > >
> > > >
> > > >
> > > >
> > > This would suggest there are no parameters in the SQL (i.e. no ?
> as
> > > in "insert into table values (?)").
> > >
> > > What does $dbh->{Statement}return - it should be the SQL you
> > > are executuing.
> > >
> > > Martin
> > >
> > >
> > >
> >
> >
> > Peter Loo
> > Worldwide Consulting, Inc.
> > Phoenix, Arizona
> > U.S.A.
> >
>
>
>
> --
>
--------------------------------------------------------------------------------------------------------------
> The darkest places in hell are reserved for those who maintain their
> neutrality in times of moral crisis.
> Dante Alighieri (1265 - 1321)
>
> They who would give up an essential liberty for temporary security,
> deserve
> neither liberty or security.
> Benjamin Franklin
>
--------------------------------------------------------------------------------------------------------------
>
Peter Loo
Worldwide Consulting, Inc.
Phoenix, Arizona
U.S.A.