es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

FUNCIÓN PL/SQL CON PARÁMETRO VARCHAR

Estos son los errores que obtuve. https://i.stack.imgur.com/hBB2e.png

La pregunta pedía a las personas que nacieron después del 30 de junio de 1990 que se vacunaran. Pide al usuario que ingrese su identificación. Me dio un error que decía que “el literal no coincide con el formato de cadena”. No sé cómo devolver un varchar en una función de PL/SQL. Aquí está mi código:

create or replace function p_immune (ptdob in date)
return varchar2
is sta_imm varchar2(30);

BEGIN
  if ptdob > '30th June 1990 ' then sta_imm := 'REQUIRED';
  else sta_imm := 'NOT REQUIRED';
  end if;
  return(sta_imm);
END p_immune; /

Accept pt_id prompt 'Enter the patient ID: '
DECLARE
v_dob patient.ptdob%type;
v_ptdob patient.ptdob%type;

BEGIN
  select ptdob
  into v_dob
  from patient
  where pt_id = &pt_id;

  dbms_output.put_line('Enter the patient ID: '||&pt_id);
  dbms_output.put_line('The status of X-immunization :'||p_immune(v_ptdob));
END; /
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El error que estás obteniendo está relacionado con el formato de la fecha. Cuando se compara un valor de fecha en PL/SQL con una cadena, primero se debe convertir la cadena en una fecha. En tu código, estás comparando el valor de fecha con la cadena ’30th June 1990′, lo que está causando el error.

    Para solucionar este error, necesitas convertir la cadena ’30th June 1990′ a una fecha usando la función TO_DATE. Aquí tienes una versión actualizada de tu código:

    create or replace function p_immune (ptdob in date)
    return varchar2 
    is 
        sta_imm varchar2(30);
    begin 
        if ptdob > to_date('30-JUN-1990', 'DD-MON-YYYY') then
            sta_imm := 'REQUERIDO'; 
        else 
            sta_imm := 'NO REQUERIDO'; 
        end if;
        return sta_imm;
    end p_immune;
    /
    
    accept pt_id prompt 'Ingrese el ID del paciente: '
    
    declare
        v_dob patient.ptdob%type;
    begin
        select ptdob into v_dob
        from patient
        where pt_id = &pt_id;
        dbms_output.put_line('El estado de X-inmunización: '||p_immune(v_dob));
    end;
    /
    

    En este código actualizado, utilizamos la función TO_DATE para convertir la cadena ’30-JUN-1990′ en un valor de fecha que se pueda comparar con el parámetro ptdob. También hemos eliminado la variable innecesaria v_ptdob del bloque DECLARE y hemos utilizado v_dob para llamar a la función p_immune.

Comments are closed.