Hi Jeffrey,

I have found the culprit.  It is in the calling program.  Instead of
using $d_sth like the original program, someone made a change and
didn't tell me.  I was looking at the copy instead of the one that was
having the problem.

$d_dbh = sub_prepare($d_dbh, $sqlString);

I have made some changes to the programs as you wonderful folks had
suggested.

Thanks everyone for your help.

Sincerely,

Peter


--- Jeffrey Seger <[EMAIL PROTECTED]> wrote:

> I'm posting this back to the list in case anyone else wants to see
> it.
> 
> First thing I see is that the number of ? placeholders doesn't appear
> to be
> right.  I whittled it down to a 2 column table and used your
> sub_insert to
> build an insert statement:
> 
> sub sub_insert($$) {
>    my ($tblName, $columns) = @_;
>    my ($sqlString, $delimCols, $bindVars);
>    $delimCols = join(', ', @{$columns});
>    $bindVars = join ', ', ('?') x $#{$columns};
>    $sqlString = "insert into " . $tblName . " (" . $delimCols .
> ")values" .
> " (" . $bindVars . ")";
>    return($sqlString);
>    }
> 
> yielded:
> insert into table1 (COLUMN1, COLUMN2)values (?)
> 
> This change fixed that:
> 
>    $bindVars = join ', ', ('?') x scalar(@$columns);
>    #$bindVars = join ', ', ('?') x $#{$columns};
> 
> However, this would not have explained why you got "38 found when 0
> expected".
> So I suspect that either Netezza doesn't support unnamed bind params,
> or the
> ODBC driver that you are using doesn't I have no way of knowing
> which.
> 
> So I suggest that you build your insert statement with named bind
> variables
> instead:
> 
> sub sub_insert2($$) {
>    my ($tblName, $columns) = @_;
>    my ($sqlString, $delimCols, $bindVars);
>    $delimCols = join(', ', @{$columns});
>    my @bindlist = ();
>    foreach my $col(@$columns){
>      push @bindlist, ':' . $col;
>    }
>    $bindVars = join ', ',  @bindlist;
>    $sqlString = "insert into " . $tblName . " (" . $delimCols .
> ")values" .
> " (" . $bindVars . ")";
>    return($sqlString);
>    }
> 
> which yielded this:
> 
> insert into table1 (COLUMN1, COLUMN2)values (:COLUMN1, :COLUMN2)
> 
> Then you need to actually bind the values:
> 
> while (my @row = $sth_select->fetchrow_array){
>   for (0..$#row){
>     $sth_insert->bind_param(':' . $cols[$_], $row[$_]);
>   }
>   $sth_insert->execute;
> }
> 
> 
> 
> A couple of other suggestions:
> 
> 1) when someone offers help and asks you to send the minimum amount
> of code
> to replicate the issue, please whittle it down as much as you can. 
> It makes
> people more inclined to help and you learn more (and possibly solve
> the
> problem on your own).
> 
> 2) read a book on regexes.
>  $stmtType = "insert" if $sqlString =~
> /^(\s)+[Ii][Nn][Ss][Ee][Rr][Tt]/;
> would be better written and more readable as:
> $stmtType = "insert" if $sqlString =~ /^\s+insert/i;
> 
> 
> On 4/2/06, Peter Loo <[EMAIL PROTECTED]> wrote:
> >
> > Hi Jeffrey,
> >
> > It is a simple SELECT statement with the following columns from one
> > table in Oracle then I am using Perl DBI ODBC driver to do an
> INSERT
> > into the same table in Netezza.  Netezza is a SQL server runs on
> Linux
> > and support 100% SQL standard.  What I a trying to do is using
> > all_tab_columns view in Netezza to dynamically create a list of
> columns
> > for the INSERT statement.  I have verified that it is in fact the
> > correct list of columns.
> >
> > dlvrb_gid, study_gid, client_gid, slsfc_gid, mkt_def_gid,
> kt_def_desc,
> > store_panl_gid, study_anlys_typ_cde, extnd_lkbck_strt_dte,
> > ohrt_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
> >
> > --- Jeffrey Seger <[EMAIL PROTECTED]> wrote:
> >
> > > And what are the contents of the sql file?
> > >
> > > Also, I know very little about Netezza....I'm going to assume
> that it
> > > supports placeholders, but does the ODBC Driver for it?
> > >
> > > On 4/2/06, Peter Loo <[EMAIL PROTECTED]> wrote:
> > > >
> > > >
> > > > 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.
> > > >
> > >
> > >
> > >
> > > --
> > >
> >
> >
>
--------------------------------------------------------------------------------------------------------------
> > > 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.
> >
> 
> 
> 
> --
>
--------------------------------------------------------------------------------------------------------------
> 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.

Reply via email to