sql >> Base de Datos >  >> RDS >> Oracle

Desarrollador de procedimientos almacenados-SQL

¿Por qué pasaría todo el conjunto de parámetros cuando todo lo que necesita es una identificación de camper (y no hay nada que pueda hacer con el resto de ellos)? Eso simplemente no tiene sentido...

Aquí hay una opción que muestra cómo hacerlo.

Tabla de muestra:

SQL> select * from charges;

  CAMPERID CATEGORY   CHARGEDATE                 AMT
---------- ---------- ------------------- ----------
         1 Category 1 12.10.2021 00:00:00        500

SQL>

Procedimiento:

SQL> create or replace procedure p_test
  2    (par_camperid   in charges.camperid%type,
  3     par_message   out varchar2
  4    )
  5  as
  6    l_camperid   charges.camperid%type;
  7  begin
  8    select c.camperid
  9      into l_camperid
 10      from charges c
 11      where c.camperid = par_camperid;
 12
 13    par_message := 'Camper ' || par_camperid || ' exists';
 14  exception
 15    when no_data_found then
 16      par_message := 'Error: no such camper ID (' || par_camperid || ')';
 17  end;
 18  /

Procedure created.

Prueba:

SQL> set serveroutput on;
SQL> declare
  2    l_msg varchar2(100);
  3  begin
  4    p_test(1, l_msg);
  5    dbms_output.put_line(l_msg);
  6  end;
  7  /
Camper 1 exists

PL/SQL procedure successfully completed.

SQL> declare
  2    l_msg varchar2(100);
  3  begin
  4    p_test(2, l_msg);
  5    dbms_output.put_line(l_msg);
  6  end;
  7  /
Error: no such camper ID (2)

PL/SQL procedure successfully completed.

SQL>

Código que escribiste:

  • errores tipográficos, errores tipográficos, errores tipográficos... es p_error o p_erorr ?
  • if debería tener end if
  • if no puede contener un select instrucción (debe seleccionar el valor por separado y luego usarlo en if )
  • where la condición es incorrecta. Nunca, nunca nombre los parámetros de la misma manera que los nombres de las columnas. Esto:where camperid = camperid es igual a where 1 = 1 y obtendría todas las filas de la tabla, no solo la que está buscando