'invoking a stored procedure with input parameter and out cursor in perl script
Trying to execute a procedure in perl script, Proceure ->create or replace
PROCEDURE Getproc
(
v_catg IN CHAR DEFAULT NULL,
v_cursor OUT SYS_REFCURSOR
)
to execute procedure
my $sth = $dbh->prepare( q{ BEGIN Getproc(:category, :curs); END; } );
to bind i/p and cursor
$sth->bind_param(":category", $category1); $sth->bind_param_inout(":curs", \$cursrecords, 0, {ora_type => ORA_RSET}); $sth->execute; $sth->finish;
Fetch records from cursor
while ($hashRef = $cursrecords->fetchrow_hashref) { foreach (keys %$hashRef) { print "hashref:$hashRef and $_ is $hashRef->{$_}\n"; } }
3rd step is not retrieving anything. curserecords=DBI::st=HASH(0x2371bd0)
this has hash object. Can some one help me know what is missing here. Why am I not able to retrieve rows from table stored in cursor?
PROCEDURE for reference
create or replace PROCEDURE GetProc
(
v_catg IN CHAR DEFAULT NULL,
v_cursor OUT SYS_REFCURSOR
)
AS
BEGIN
IF ( v_catgIS NULL ) THEN
BEGIN
OPEN v_cursor FOR
SELECT EnvVar,
VALUE
FROM table;
END;
ELSE
BEGIN
OPEN v_cursor FOR
SELECT EnvVar ,
VALUE
FROM table
WHERE Category = v_catg ;
END;
END IF;
EXCEPTION
WHEN OTHERS THEN raise_application_error(-20002,SQLCODE||':'||SQLERRM);
END;
Solution 1:[1]
Please try (as in René Nyffenegger's collection)
my $sth = $dbh->prepare(
q{
DECLARE
curs sys_refcursor;
BEGIN
Getproc(:category, :curs);
END;
});
Solution 2:[2]
this is my solution, using a stored procedure with mysql and invoked for perl
CREATE DEFINER=`fact`@`%` PROCEDURE `ESTE`(
IN `DENTRO` INT,
OUT `UNO` INT,
OUT `DOS` VARCHAR(50)
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
SET UNO = DENTRO;
SET DOS = 'TODO OK';
END
Code in perl
################################################################################
#Funcion para establecer la conexion con la base de datos
sub conectaServer{
(my $dbase_db, my $ip_db, my $user_db, my $pass_db, my $port) = @_;
my $connectionInfo = "DBI:mysql:database=$dbase_db;$ip_db:$port";
my $dbh = DBI->connect($connectionInfo,$user_db,$pass_db);
return $dbh;
}
####################################################################
sub store{
my $v = 10;
my $query = "CALL ESTE(?, \@uno, \@dos)";
my $dbh = $S_FACTURA->prepare( $query );
$dbh->bind_param(1, $v);
$dbh->execute();
my $query = " SELECT \@uno, \@dos";
my $dbh = $S_FACTURA->prepare( $query );
$dbh->execute();
my @out = $dbh->fetchrow_array();
print("$out[0] $out[1]\n");
}
########################## M A I N ##############################
$S_FACTURA = &conectaServer($d_bFACTURA, $d_hFACTURA, $d_uFACTURA, $d_pFACTURA, $d_portFACTURA );
&store();
$S_FACTURA->disconnect()
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Gerard H. Pille |
Solution 2 | Jose Luis Larios Rodriguez |