Perl + Oracle + bind_param_inout()


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Perl + Oracle + bind_param_inout()
# 1  
Old 04-05-2008
Perl + Oracle + bind_param_inout()

Hi. I'm attempting to assign a variable via a field that is using an autoincrement sequence. I'm trying to use the Oracle bind_param_inout() procedure to pass the value by reference. The code goes a bit like this:

*************

my $sql=q(INSERT INTO MESSAGES (message_id, message_text, message_category, start_date, stop_date, admin_comments, time_submitted) VALUES (?,?,?,?,?,?,?) RETURNING message_id INTO ?);
my $sth=$dbh->prepare($sql);
die "Could not prepare query. Check SQL syntax."
unless defined $sql;
my $newMessageID;
$sth->bind_param_inout(8,\$newMessageID, 38);
$sth->execute('messages_id_pkseq.nextval', $messageText, $messageCategory, $startDate, $stopDate, $adminComments, $timeStamp);


****************

By example, bind_param_inout seems to by far the best way to retrieve the value, but the examples I have seen so far all assume no arguments to sth->execute(). In this case I have arguments in my execute statement, and that seems to be where my issues lie. Apache returns:

***
DBD::Oracle::st execute failed: called with 7 bind variables when 8 are needed [for Statement "INSERT INTO MESSAGES (message_id, message_text, message_category, start_date, stop_date, admin_comments, time_submitted) VALUES (?,?,?,?,?,?,?) RETURNING message_id INTO ?" with ParamValues: Smilie5=undef, Smilie6=undef, Smilie3=undef, Smilie7=undef, Smilie1=undef, Smilie8=undef, Smilie4=undef, Smilie2=undef]
***

Wondering if anyone could shed some light as to why the DB is expecting the eight value (the ? after the RETURNING clause); it should be assigned via the bind_param_inout() function by my understanding. Could very well be something I am missng here though. There may be a way to pass it in the execute() statement as well. but just passing $newMessageID as the eight parameter returns an error. Thanks in advance for assistance.
# 2  
Old 04-05-2008
Hello... I think you might have to pass some variable name for the in/out in your execute statement, but I'm not sure. Will follow along with you though as I'm going to need something very similar and I don't know how to do this... Thanks for the good question.
# 3  
Old 04-07-2008
Thanks for the response quine. If you are still following, I slogged through this one and figured it out on my own. Apparently one can't mix and match binding parameters between the bind_param_inout statement and the execute() statement. If you use $sth->bind_param_inout(), you'll want to make sure that you bind all parameters that way, and have no arguments to $sth->execute(). Working great for me that way as of now.

Although, according to the 3k+ "expert" on the Oracle forum, "no one is using PERL for Oracle DB programming." Guess we are wasting our time.Smilie
# 4  
Old 04-08-2008
Hello again...

So let me get this straight... You have to do something like....

$sth -> bind_param_in(1,\$messages_id_pkseq.nextval, 12);
$sth -> bind_param_in(2,\$message_text, 256);
$sth -> bind_param_in(3, ..... );

and like that for each of the parameters, then
$sth -> execute(); without parms?

Interesting..... Thanks...

As for perl for Oracle DB work via the DBI (which is I think what you are speaking of here), I have to admit that except for low-volume inserts/updates like summary records, or updating some status-of-a-job record and things like that, I don't use it much either. Something like what you are doing I would only do if the transaction rate is relatively low. Otherwise, you might consider input via sql+ and get the return value by assigning the result of a qx|| call to an array....

So you have a simple sql+ script that takes the VALUES in as parms and in perl you do something like....

(@IO) = qx|sqlplus -s login\/passwd\@DB scripttoexecute parm1 parm2... |;

The in/out parm should end up as $IO[0], etc.

The -s parm SILENCES sql+ so the normal stuff dumped to stdout doesn't end up in @IO, only what you want...

My syntax might be a little off... I'm writing this off-the-cuff as it were, and I'm a little rusty lately...
# 5  
Old 04-08-2008
Indeed you are correct...a series of sth-> bind_param_inout() statements to bind all variables, and then no args to sth-> execute () and you should be good to go.

Thanks for the SQL+ tip and duly noted. The transaction rate will be very low in this case; this project is a .cgi workaround that assumes our Tomcat server is down and that our normal mechanisms aren't available. I doubt there will be more than a few transactions a week.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Perl Oracle connection error

I've a Centralized Server which can connect to all Oracle Databases. When I was trying the below code it doesn't work, But tnsping was working fine. #!D:/perl5/bin/perl.exe use DBI; my $dbh = DBI->connect('dbi:Oracle:QBDIWCE', 'IDUSER', 'SECRET123#' ) || die( $DBI::errstr . "\n" ) ; ... (1 Reply)
Discussion started by: ilugopal
1 Replies

2. Shell Programming and Scripting

perl- oracle sql query

Hi, I am new to perl.How to query oracle database with perl??? Thanks (1 Reply)
Discussion started by: tdev457
1 Replies

3. Shell Programming and Scripting

PERL and Oracle 11.2 question

Hi, we have PERL 64-bit build with Oracle 10g DBD . PERL database connection are working fine. Database upgraded to 11.2 and in PERL documents it says still use 10g DBD to connect to 11.2. when I try some test connections, I am getting this error . Did anyone see this error before . I set the... (2 Replies)
Discussion started by: talashil
2 Replies

4. Shell Programming and Scripting

Need help in perl script for oracle

Hi, #!/usr/bin/perl my @sid=`cat /etc/oratab|grep -v "^#"|grep -v "*"|grep -v "#"|cut -d: -f1 -s`; my $log; my $body=""; my $oraclesid=""; chomp($hostname); foreach my $oraclesid (@SID){ $body=""; chomp($oraclesid); $dbname=print ($oraclesid); print... (2 Replies)
Discussion started by: rocky1954
2 Replies

5. Shell Programming and Scripting

Perl connect to remote oracle db without local oracle installation

I want to use Perl to connect to a remote Oracle DB I have no oracle installation on my server (and dont plan on installing one) I am using solaris 9 on x86 server. Is this possible? I basically want to run some basic sql queries on the remote oracle db which I have access to using perl on my... (0 Replies)
Discussion started by: frustrated1
0 Replies

6. Shell Programming and Scripting

Oracle using perl

Hello All, I need to now how can I establish connection with oracle database then shutdown abort and then startup, In other words need to implement the following lines to perl script: export ORACLE_SID=<some user> ${ORACLE_HOME}/bin/sqlplus /nolog SQL> connect / as sysdba SQL> shutdown... (2 Replies)
Discussion started by: Alalush
2 Replies

7. Shell Programming and Scripting

How to connect ORACLE using PERL

Hi Friends, I am having Perl 5 and Oracle 9i. I just wanna to connect Oracle DB & to perform some select query statement. Could anyone pls let me know. I've tried below command which i found in some website, But it throws some error.:confused: Executed: perl -e 'use DBI; print... (1 Reply)
Discussion started by: Vijayakumarpc
1 Replies

8. Programming

perl dbi to oracle getting disconnect_all for oracle dbi help

hi i am trying to connect to an oracle database using dbi and i get this :: Driver has not implemented the disconnect_all method. at /opt/perl/lib/site_perl/5.8.0/sun4-solaris/DBI.pm line 575 END failed--call queue aborted. for all i know, the script was working earlier, but has... (1 Reply)
Discussion started by: poggendroff
1 Replies

9. UNIX for Dummies Questions & Answers

PERL - Oracle

Hi friends, I am new to Perl programming. I have a requirement, using perl I need to connect to Oracle DB and get some records ( on unix environment). I googled and found that we need to use DBD (Database Drivers), DBI (DataBase Interface) to connect to oracle. I tried using " sqlplus... (1 Reply)
Discussion started by: satguyz
1 Replies

10. UNIX for Advanced & Expert Users

perl-DBD-Oracle

I am trying to install perl-DBD-Oracle-1.16-1.2.rpm on Suse (SLE 9), like rpm -Uvh perl-DBD-Oracle-1.16-1.2.rpm but I keep getting the following error message error: Failed dependencies: libclntsh.so.10.1 is needed by perl-DBD-Oracle-1.16-1.2.el4 libnnz10.so is needed by... (1 Reply)
Discussion started by: hassan1
1 Replies
Login or Register to Ask a Question