FUNCIONES ORACLE EN PHP

HTML y todos sus derivados relacionados con la creación de sitios web

Moderador: Moderadores

posix
Novat@
Mensajes: 4
Registrado: Mié May 05, 2004 11:59 am

FUNCIONES ORACLE EN PHP

Mensaje por posix » Jue May 06, 2004 2:01 pm

Saludos a todos. Tengo un problema para ejecutar procedimientos pl/sql desde php a Oracle. La compilación me la hace bien, pero al intentar ejecutar (con la sentencia "exec") me dice que no es una sentencia sql válida. Os muestro el fichero que estoy ejecutando (info2.php):

<?php

$db_t1 = ora_Logon("scott@bdmodel", "tiger");




function create_table($conn)
{ $tabla = ora_open($conn);

$stmt = ora_parse($tabla,"create table scott.grupo (ID VARCHAR2(20) NOT NULL,Cod_grupo VARCHAR2(20) NULL,
Nombre_grupo VARCHAR2(20) NULL,CONSTRAINT XPKGRUPO PRIMARY KEY (ID))",$hola);

if($stmt == '0') {
echo " <h4>La tabla no ha podido ser creada</h4>\n\n";
}
else {
ora_exec($tabla);
echo " <h4>La tabla GRUPO ha sido creada</h4>\n\n";
}
}



function drop_table($conn)
{ $drop_t = ora_open($conn);
$stmt = ora_parse($drop_t,"drop table scott.grupo",$adios);
ora_exec($drop_t);
echo " <h4>La tabla GRUPO ha sido eliminada</h4>\n\n";
}




function crear_procedure($conn)
{
$cursor = ora_open ($conn);

$stmt = ora_parse($cursor,"CREATE OR REPLACE PROCEDURE scott.crear_usuario IS
BEGIN
INSERT INTO scott.grupo VALUES ('003','6','6');
END scott.crear_usuario;
/ ",$adios);
ora_exec($cursor);
echo " <h4>El procedimiento ha sido creado</h4>\n\n";
}




function ejecutar_procedure($conn)
{
$ex = ora_open ($conn);

$stmt = ora_parse($ex,"exec crear_usuario('I04')",$adios);
ora_exec($ex);
echo " <h4>El procedimiento ha sido ejecutado</h4>\n\n";

}





function drop_procedure($conn)
{ $drop_p = ora_open($conn);
$stmt = ora_parse($drop_p,"drop procedure scott.crear_usuario",$hola);
ora_exec($drop_p);
echo " <h4>El procedimiento crear_usuario ha sido eliminado</h4>\n\n";
}



create_table($db_t1);
crear_procedure($db_t1);
ejecutar_procedure($db_t1);
drop_table($db_t1);
drop_procedure($db_t1);



?>


Y la respuesta que me sale en el navegador:

La tabla GRUPO ha sido creada
El procedimiento ha sido creado

Warning: Ora_Parse failed (ORA-00900: sentencia SQL no válida -- while processing OCI function OPARSE) in C:\Archivos de programa\Apache Group\Apache\htdocs\aux2.php on line 55

Warning: Ora_Exec failed (ORA-01003: ninguna sentencia analizada -- while processing OCI function OEXEC/OEXN) in C:\Archivos de programa\Apache Group\Apache\htdocs\aux2.php on line 56

El procedimiento ha sido ejecutado
La tabla GRUPO ha sido eliminada
El procedimiento crear_usuario ha sido eliminado

La verdad es que no lo entiendo, puesto que "exec" es la forma de ejecutar procedimientos en pl/sql. ¿Alguien sabe que me esta pasando?.

Muchas gracias a todos.

Saludos. de Posix.

alfon
Senior
Mensajes: 90
Registrado: Mié Oct 04, 2006 6:26 pm

Mensaje por alfon » Mar Mar 13, 2007 7:28 pm

El problema está en que en la función ejecutar_procedure($conn) en esta linea:

Código: Seleccionar todo

$stmt = ora_parse($ex,"exec crear_usuario('I04')",$adios);
como segundo parametro intentas llamar a una función (crear_usuario('I04')) que supongo habrás creado tú, cuando ahí lo que debe haber es una sentencia SQL Dinámica, que es para lo que se usa el EXEC, no se mucho de ello pero te voy a pasar un enlace por si te ayuda:

http://www.hayes.ch/sql/sql_dinamico.html

lo_jorge, no hay que confundir SQL con Microsoft SQL o MySQL. SQL es un lenguaje de sentencias para mandar ordenes a motores de bases de datos, como Microsoft SQL, MySQL, Oracle,... como el típico "SELECT * FROM tabla WHERE ...."

Un saludo.

Avatar de Usuario
Invitado

Re: FUNCIONES ORACLE EN PHP

Mensaje por Invitado » Mié Oct 17, 2007 10:39 pm

Buenas tardes, tengo un problema similar pero con cursores, necesito ayuda.

1.- Me rendi para hacer una conexion oracle con php_oci8.php o con php_oracle.php
2.- Opte por hacer una conexion via odbc, pero me da error en los parametros, el cursor es

opciones_usuario(user IN VARCHAR2, opcionesUser OUT cursor_opcion, result OUT PLS_INTEGER, observacion OUT VARCHAR2)

claro, eso esta en el paquete pkg_menu

Y desde php hago lo siguiente:

// Realizamos la conexion via ODBC
$cid=odbc_connect($dsn, $usu_odbc, $cla_odbc, SQL_CUR_USE_ODBC);
if (!$cid)
{
exit("Error: No se logro establecer la conexion. <br>Line 26.<br>odbc_errormsg: ".odbc_errormsg());
}
else
{
// Buscamos el paquete que tenemos que necesitamos usar
$query_string="call pkg_menu.opciones_usuario(?,?,?,?)";
// Preparamos la funcion que vamos a usar
$res = odbc_prepare($cid, $query_string);
if(!$res)
{
exit("<br>ERROR: Paquete no preparado ".$query_string."<br>");
}
else
{
// Inicializamos el resultado del arreglo
$parametro['user']=$usuario;
$parametro['opcionesUser']='';
$parametro['result']='';
$parametro['observacion']='';

//odbc_setoption ($res, 2, 0, $usuario);
$result = odbc_execute($res,$parametro);
if(!$result)
{
echo("Error: no se ejecuto el PL/ORACLE.<br>Line 48.");
}
else
{
//$row = odbc_fetch_array($res);
echo("Bienvenido(a) ".$usuario.".<br>");
}
}
}

Pero me dice que los parametros son incorrectos, yo considero que no los se manejar... nose como indicar los parametros de entradas y salidas.

¿Alguien me puede ayudar?

Avatar de Usuario
Invitado

Mensaje por Invitado » Mar Nov 13, 2007 3:38 am

mira este codigo.,,lo crre yo, no tiene plsql pero se conecta y funciona..

<html>
<head>
<link rel="stylesheet" href="images/style.css" type="text/css" />
<title>Bodega GTI</title>
<style type="text/css">
<!--
.Estilo1 {font-size: 14px}
-->
</style>
<script language="JavaScript" type="text/JavaScript">
<!--
function MM_reloadPage(init) { //reloads the window if Nav4 resized
if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
}
MM_reloadPage(true);
//-->
</script>
</head>
<body>
<div id="page" align="left">
<div id="content" style="width:800px">
<div id="logo"><div style="margin-top:70px; font-size: 24px;" class="whitetitle"><div align="center">Bodega GTI</div></div></div>
<div id="topheader">
<div align="left" class="bodytext">
<p><strong>Bodega GTI</strong><br/>
Avenida Providencia 616<br/>
Santiago, Chile <br/>
Phone: +56 02 16 16 616</p>
</div>
</div>
<div id="menu">
<div align="right" class="smallwhitetext" style="padding:9px;">
<script>
<!--
var dias=new Array ("domingo","lunes","martes","miercoles","jueves","viernes","sabado");
var meses=new Array("enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre");
var texto;
var dia, mes, anio, diasem;
var fecha=new Date();
dia=fecha.getDate();
mes=fecha.getMonth();
anio=fecha.getFullYear();
diasem=fecha.getDay();
if(dia<10)
dia="0"+ dia;
texto=dias[diasem]+" "+dia+" de " + meses[mes]+" de "+anio;
document.write(texto);
//-->
</script>
</div>
</div>
<div id="submenu">
<div align="right" class="smallgraytext" style="padding:9px;"></div>
</div>
<div id="contenttext">
<div class="bodytext" style="padding:12px;" align="justify">
<p><strong>Gesti&oacute;n de Usuarios </strong></p>
<p>&nbsp;</p>
<?php
$connect = ocilogon("haku", "1412", "//nb-haku/XE");
$sql = ' select usuario, rut_usuario, apellidos_usuario, nombres_usuario, activo from usuarios';
$sentencia = ociparse($connect, $sql);
ociexecute($sentencia);
$nrows = OCIFetchStatement($sentencia,$results);
if ( $nrows > 0 ) {
print "<TABLE BORDER=\"1\">\n";
print "<TR>\n";
while ( list( $key, $val ) = each( $results ) ){
print "<TH><span class='bodytext'>$key</span></TH>\n";}
print "</TR>\n";
for ( $i = 0; $i < $nrows; $i++ ) {
reset($results);
print "<TR>\n";
while ( $column = each($results)){
$data = $column['value'];
print "<TD><span class='bodytext'>$data[$i]</span></TD>\n";}
print "</TR>\n";}
print "</TABLE>\n";}
else {echo "No data found<BR>\n";}
OCIFreeStatement($sentencia);
ocilogoff($connect);
if (isset($_POST['Buscar'])){
$connect = ocilogon("haku", "1412", "//nb-haku/XE");
if ($_POST['por'] == "user") {
$sql0 = ' select usuario from usuarios where(usuario= :busqueda)';
$sql1 = ' select rut_usuario from usuarios where(usuario= :busqueda)';
$sql2 = ' select apellidos_usuario from usuarios where(usuario= :busqueda)';
$sql3 = ' select nombres_usuario from usuarios where(usuario= :busqueda)';
$sql4 = ' select activo from usuarios where(usuario= :busqueda)';
$sql5 = ' select password from usuarios where(usuario= :busqueda)';}
if ($_POST['por'] == "rut") {
$sql0 = ' select usuario from usuarios where(rut_usuario= :busqueda)';
$sql1 = ' select rut_usuario from usuarios where(rut_usuario= :busqueda)';
$sql2 = ' select apellidos_usuario from usuarios where(rut_usuario= :busqueda)';
$sql3 = ' select nombres_usuario from usuarios where(rut_usuario= :busqueda)';
$sql4 = ' select activo from usuarios where(rut_usuario= :busqueda)';
$sql5 = ' select password from usuarios where(rut_usuario= :busqueda)';}
$sentencia0 = ociparse($connect, $sql0);
$sentencia1 = ociparse($connect, $sql1);
$sentencia2 = ociparse($connect, $sql2);
$sentencia3 = ociparse($connect, $sql3);
$sentencia4 = ociparse($connect, $sql4);
$sentencia5 = ociparse($connect, $sql5);
ocibindbyname($sentencia0, ':busqueda', $_POST['busqueda']);
ocibindbyname($sentencia1, ':busqueda', $_POST['busqueda']);
ocibindbyname($sentencia2, ':busqueda', $_POST['busqueda']);
ocibindbyname($sentencia3, ':busqueda', $_POST['busqueda']);
ocibindbyname($sentencia4, ':busqueda', $_POST['busqueda']);
ocibindbyname($sentencia5, ':busqueda', $_POST['busqueda']);
ociexecute($sentencia0);
ociexecute($sentencia1);
ociexecute($sentencia2);
ociexecute($sentencia3);
ociexecute($sentencia4);
ociexecute($sentencia5);
$resultado0= ociresult($sentencia0, ocifetch($sentencia0));
$resultado1= ociresult($sentencia1, ocifetch($sentencia1));
$resultado2= ociresult($sentencia2, ocifetch($sentencia2));
$resultado3= ociresult($sentencia3, ocifetch($sentencia3));
$resultado4= ociresult($sentencia4, ocifetch($sentencia4));
$resultado5= ociresult($sentencia5, ocifetch($sentencia5));
ocilogoff($connect);}
if (isset($_POST['enviar'])){
if (empty($_POST['user']) ){
print '<br><br><br>Vuelve a ingresar los datos, por lo menos el nombre del usuario.';}
else{
$connect = ocilogon("haku", "1412", "//nb-haku/XE");
if ($_POST['select'] == "1") {
$sql = ' INSERT INTO usuarios VALUES(:usuario, :password, :rut_usuario, :apellidos_usuario, :nombres_usuario, :activo)';
$sentencia = ociparse($connect, $sql);
ocibindbyname($sentencia, ':usuario', $_POST['user']);
ocibindbyname($sentencia, ':password', $_POST['passwd']);
ocibindbyname($sentencia, ':rut_usuario', $_POST['rutuser']);
ocibindbyname($sentencia, ':apellidos_usuario', $_POST['apellidouser']);
ocibindbyname($sentencia, ':nombres_usuario', $_POST['nombreuser']);
ocibindbyname($sentencia, ':activo', $_POST['activo']);
$run = ociexecute($sentencia);
if (!$run) {print '<br><br><br>Ocurrio un error al tratar de insertar la fila, favor vuelve a intentarlo.';}
}
if ($_POST['select'] == "2") {
$sql = ' update usuarios set password= :password, rut_usuario= :rut_usuario, apellidos_usuario= :apellidos_usuario, nombres_usuario= :nombres_usuario, activo= :activo WHERE(usuario= :usuario)';
$sentencia = ociparse($connect, $sql);
ocibindbyname($sentencia, ':usuario', $_POST['user']);
ocibindbyname($sentencia, ':password', $_POST['passwd']);
ocibindbyname($sentencia, ':rut_usuario', $_POST['rutuser']);
ocibindbyname($sentencia, ':apellidos_usuario', $_POST['apellidouser']);
ocibindbyname($sentencia, ':nombres_usuario', $_POST['nombreuser']);
ocibindbyname($sentencia, ':activo', $_POST['activo']);
$run = ociexecute($sentencia);
if (!$run) {print '<br><br><br>Ocurrio un error al tratar de modificar la fila, favor vuelve a intentarlo.';}
}
ocilogoff($connect);}
echo "<META HTTP-EQUIV='refresh' CONTENT='2; URL=$PHP_SELF'>";}
?>
</p>
</div>
</div>
<div id="leftpanel">
<div align="justify" class="graypanel">
<p><span class="smalltitle">Mantenedor</span></p>
<form name="Mantenedor" id="form1" method="post" action="usuarios.php">
<table width="200" border="1">
<tr>
<td width="74"><select name="por">
<option value="rut" selected>Por rut</option>
<option value="user">usuario</option>
</select></td>
<td width="110"><input type="text" name="busqueda"></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input name="Buscar" type="submit" class="smallgraytext" value="Buscar"></td>
</tr>
</table>
<p><span class="bodytext">Seleccione opcion a realizar
<select name="select">
<option value="1" selected>Agregar</option>
<option value="2">Modificar</option>
</select>
</span></p>
<p><span class="bodytext">en el caso de eliminar marque usuario activo como "no" </span></p>
<table width="234" border="1">
<tr>
<td width="68"><div align="left"><span class="bodytext">Rut Usuario:</span></div></td>

<td width="150"><input name="rutuser" type="text" value="<? print $resultado1;?>"/></td>
</tr>
<tr>
<td><div align="left"><span class="bodytext">Apellidos usuario:</span></div></td>
<td><input name="apellidouser" type="text" value="<? print $resultado2;?>"/></td>
</tr>
<tr>
<td><div align="left"><span class="bodytext">Nombres usuario:</span></div></td>
<td><input name="nombreuser" type="text" value="<? print $resultado3;?>"/></td>
</tr>
<tr>
<td><div align="left"><span class="bodytext">Usuario :</span></div></td>
<td> <input name="user" type="text" value="<? print $resultado0;?>"/></td>
</tr>
<tr>
<td><span class="bodytext">Contrase&ntilde;a usuario :</span></td>
<td><input name="passwd" type="password" value="<? print $resultado5;?>" /></td>
</tr>
<tr>
<td><span class="bodytext">Usuario activo:</span></td>
<td><select name="activo">
<? if ( $resultado4 == "no" ){?>
<option value="si">si</option>
<option value="no" selected>no</option>
<? }else{?>
<option value="si" selected>si</option>
<option value="no">no</option>
<? }?>
</select></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input name="enviar" type="submit" class="smallgraytext" value="Enviar" /></td>
</tr>
</table>
</form>
</div>
</div>
<div id="footer" class="smallgraytext">
<div align="center"><a href="Home.php">P&aacute;gina de inicio </a> |<a href="About.htm" target="_blank"> Acerca de nosotros</a>|<a href="mailto:sukidaio@gmail.com">Contactanos</a> | Bodega GTI &copy; 2007</div>
</div>
</div>
</div>
</body>
</html>

Responder