GOOGLE ADS

jueves, 28 de abril de 2022

Error al llamar a un procedimiento almacenado PHP y Oracle

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 wherecláusula), por lo tanto, no separe las tablas con comas en la fromclá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

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...