Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

PHP+ADODB+PL/SQL (¡Ayuda porfi please!)

Estas en el tema de PHP+ADODB+PL/SQL (¡Ayuda porfi please!) en el foro de Oracle en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 26/01/2009, 04:43
 
Fecha de Ingreso: noviembre-2008
Mensajes: 10
Antigüedad: 15 años, 5 meses
Puntos: 0
PHP+ADODB+PL/SQL (¡Ayuda porfi please!)

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.
  #2 (permalink)  
Antiguo 26/01/2009, 19:47
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años, 1 mes
Puntos: 7
Respuesta: PHP+ADODB+PL/SQL (¡Ayuda porfi please!)

de entrada no mencionas donde esta getdata que parece ser una funcion

("begin :cursorvar := getdata(:param1); end;", true);

despues si estas utilizando sqldeveloper corre primero

TYPE TabType IS REF CURSOR RETURN TAB%ROWTYPE;

es valido y genera un type, ahorita no te preocupes como y para que

despues crea el procedure que te dicen aunque cambialo a

CREATE PROCEDURE list_tabs(tabcursor IN OUT TabType,tablenames IN OUT VARCHAR) IS

eso del IS o AS funciona igual, yo tampoco se por que con los dos
__________________
Blogzote.com :-) Mi blog
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:55.