Buenos días a todos:
Vereis, he empezado un nuevo proyecto con PHP+ADODB+PL/SQL y nunca he desarrolado o programado con PL/SQL (ORACLE)
En un principio quiero probar con algo muy sencillo, que sea, hacer la llamada a un procedimiento, que tenga una simple select y te devuelva el resultado al PHP, a través de ADODB.
He encontrado un ejemplo muy bueno en internet que es el siguiente (http://phplens.com/adodb/reference.f...ecursor.html):
************************************************** **************
ExecuteCursor($sql,$cursorName='rs',$parameters=fa lse)
Execute an Oracle stored procedure, and returns an Oracle REF cursor variable as a regular ADOdb recordset. Does not work with any other database except oci8. Thanks to Robert Tuttle for the design.
$db = ADONewConnection("oci8");
$db->Connect("foo.com:1521", "uid", "pwd", "FOO");
$rs = $db->ExecuteCursor("begin :cursorvar := getdata(:param1); end;",
'cursorvar',
array('param1'=>10));
# $rs is now just like any other ADOdb recordset object rs2html($rs);
ExecuteCursor() is a helper function that does the following internally:
$stmt = $db->Prepare("begin :cursorvar := getdata(:param1); end;", true);
$db->Parameter($stmt, $cur, 'cursorvar', false, -1, OCI_B_CURSOR);
$rs = $db->Execute($stmt,$bindarr);
ExecuteCursor only accepts 1 out parameter. So if you have 2 out parameters, use:
$vv = 'A%';
$stmt = $db->PrepareSP("BEGIN list_tabs(:crsr,:tt); END;");
$db->OutParameter($stmt, $cur, 'crsr', -1, OCI_B_CURSOR);
$db->OutParameter($stmt, $vv, 'tt', 32); # return varchar(32)
$arr = $db->GetArray($stmt);
print_r($arr);
echo " val = $vv"; ## outputs 'TEST'
for the following PL/SQL:
TYPE TabType IS REF CURSOR RETURN TAB%ROWTYPE;
PROCEDURE list_tabs(tabcursor IN OUT TabType,tablenames IN OUT VARCHAR) IS
BEGIN
OPEN tabcursor FOR SELECT * FROM TAB WHERE tname LIKE tablenames;
tablenames := 'TEST';
END list_tabs;
************************************************** **************
De la parte que menos controlo es cuando dice "for the following PL/SQL:" Mis dudas son las siguientes:
* Cuando dice para el siguiente PL/SQL, ¿Donde tengo que colocar exactamente el código PL/SQL que te indica? ¿Dentro de una función de Oracle? ¿Dentro de un procedimiento de oracle? ¿Dentro de un paquete de oracle? Lo pregunto porque me parece muy raro que el TYPE TabType esté delante del PROCEDURE.
* Luego, otra cosa que no entiendo es que, desde mi SQL Developer, cuando creo un procedure, función o paquete, me aparece la palabra AS, es decir "Procedure NombreProcedure AS", sin embargo en los ejemplos que he visto
en internet, me aparece IS (No sé si esto depende de la versión del PL).NO SÉ SÍ NO ME FUNCIONA POR ESO EL EJEMPLO DE ARRIBA. CAMBIO EL IS POR EL AS, PERO SIGUE SIN FUNCIONARME.
¿Alquien puede orientarme un poco?
Muchas gracias y un cordial saludo.