How to execute a Stored Procedure Oracle with ZF2

I was some problems to execute an oracle stored procedure in ZF2 with out params.

The following is an example, how finally I implemented the solution.

Procedure


CREATE OR REPLACE procedure sp_tmp(rtn out char) AS
begin

rtn := '1';

end sp_tmp;
/

 Call from ZF2 Model


        $adapter = $this->tableGateway->adapter;
        $statement = $adapter->createStatement();
        $statement->prepare("begin sp_tmp(:output); end;");

        $parameterContainer = new \Zend\Db\Adapter\ParameterContainer;
        //Uncomment this if you want to add IN params
        //$parameterContainer->offsetSet('inParam', '', $parameterContainer::TYPE_STRING); 
        $parameterContainer->offsetSetReference('output', 'output'); // Out parameter
        $statement->setParameterContainer($parameterContainer);
        $statement->execute();

        var_dump($parameterContainer->getNamedArray());

 Finally I got this:

array (size=1)
  'output' => &string '1' (length=1)
Anuncios

Error ORA-06502 Oracle y PHP

El problema se presentó usando PHP con Zend Framework 1 y Oracle 11G más detalles a continuación.

Oracle stored procedure:

CREATE OR REPLACE PROCEDURE FGONZALES.GRABA_PRUEBA
(ls_parametro varchar2
 ls_mensaje out varchar2)

Llamando al stored procedure desde PHP:

$param = 'test ';
$mensaje = ''; //O nulo
$params = array(
	'PARAM' => $param,
	'MENSAJE' => &$mensaje,
);

$sql = 'BEGIN 
GRABA_PRUEBA(
	:PARAM,
	:MENSAJE
);
END;'; 
$stmt = $db->prepare($sql);
$stmt->execute($params);

$respuesta = $mensaje;

Con los pasos anteriores obtengo el siguiente error por parte de Oracle:

6502 ORA-06502: PL/SQL: error : 
buffer de cadenas de caracteres demasiado 
pequeño numerico o de valor.

Para este caso ls_mensaje del stored procedure solo puede guardar un caracter, si pasa de uno aparece el error ORA-06502.
Mi solución fue la siguente:

$mensaje = str_repeat(' ', 4000);

Declarar la variable con un máximo tamaño para VARCHAR2 de Oracle.