Tengo el siguiente problema. Tengo un procedimiento almacenado en Oracle. Cuando llamo al procedimiento en PHP, me da el siguiente error:
Warning: oci_execute(): ORA-01403: No se ha encontrado ning�n dato ORA-06512: en "ESTUDIANTE.P_CONSULTA_LIBRO", l�nea 9 ORA-06512: en l�nea 1 in C:\xampp\htdocs\biblioteca\prueba.php on line 11
El procedimiento en Oracle funciona correctamente, pero no sé qué está pasando. Soy nuevo en la codificación en PHP.
Este es el código en PHP
<?php
require_once 'conexion.php';
$sql = 'BEGIN p_consulta_libro(:variable); END;';
$stmt_id = oci_parse($conexion, $sql);
$variable=0111;
oci_bind_by_name($stmt_id, 'variable', $variable);
$res = oci_execute($stmt_id);
print_r($res, true);
?>
Este es el procedimiento almacenado en Oracle.
create or replace procedure p_consulta_libro(idlibro in number )
as
obra varchar2(200);
autor varchar2(50);
valores varchar2(200);
BEGIN
select L.TITULO, A.NOMBRE_AUTOR into obra, autor
from LIBRO L, AUTOR A
where L.ID_LIBRO = idlibro AND A.ID_AUTOR = L.ID_AUTOR;
valores:=concat(concat(obra,' '),autor);
DBMS_OUTPUT.PUT_LINE('El libro es... '||valores);
end;
Solución del problema
No sé PHP, pero, desde el punto de vista de Oracle, tal vez prefiera usar una función que devuelva valor; si no se encuentra nada, maneje esa excepción y devuelva algo más (un mensaje o incluso una cadena vacía).
Además, una pista o dos:
- no tiene que seleccionar primero valores en variables declaradas localmente y luego concatenarlos
- hoy en día, se sugiere que separemos las uniones de las condiciones (que deben incluirse en la
where
cláusula), por lo tanto, no separe las tablas con comas en lafrom
cláusula y únalas correctamentewhere
.join
- la concatenación, en Oracle, es mucho más simple si usa el operador de concatenación de tubería doble, en lugar de llamadas a funciones
||
anidadasconcat
Algo como esto:
create or replace function f_consulta_libro (p_idlibro in number)
return varchar2
as
l_valores varchar2(200);
begin
select l.titulo ||' '|| a.nombre_autor
into l_valores
from libro l join autor a on a.id_autor = l.id_autor
where l.id_libro = p_idlibro;
return l_valores;
exception
when no_data_found then
return 'Nothing has been found';
end;
/
No hay comentarios.:
Publicar un comentario