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.

¿Cómo puedo insertar múltiples registros en una tabla durante la ejecución de PL SQL en (apex.oracle.com)?

Quiero insertar nuevos registros en la tabla en tiempo de ejecución y estoy utilizando la plataforma apex.oracle.com.

He creado la siguiente tabla:

CREATE TABLE STUDENTS(ID VARCHAR2(10),NAME VARCHAR2(50),COURSE VARCHAR2(10),MOBILE NUMBER(10),EMAIL VARCHAR2(50));

Y he creado este procedimiento para insertar un registro en la tabla:

CREATE OR REPLACE PROCEDURE "INSERTRECORD" (ID IN VARCHAR2,NAME IN VARCHAR2,COURSE IN VARCHAR2,MOBILE IN NUMBER,EMAIL IN VARCHAR2)
IS
BEGIN
INSERT INTO STUDENTS VALUES(ID,NAME,COURSE,MOBILE,EMAIL);
END;
DECLARE
RECORD_SIZE NUMBER := 2;
ID VARCHAR2(10);
NAME VARCHAR2(50);
COURSE VARCHAR2(10);
MOBILE NUMBER(10);
EMAIL VARCHAR2(50);
I NUMBER;
BEGIN
FOR I IN 1..RECORD_SIZE LOOP
ID:=:ID;
NAME:=:NAME;
COURSE:=:COURSE;
MOBILE:=:MOBILE;
EMAIL:=:EMAIL;
INSERTRECORD(ID,NAME,COURSE,MOBILE,EMAIL);
END LOOP;
END;

No puedo insertar registros en tiempo de ejecución dados por el usuario. Estoy obteniendo este error. ¿Alguien puede solucionarlo? ¿O puede ayudarme a insertar registros en la tabla en tiempo de ejecución?

Error:

ORA-01722: número no válido
ORA-06512: en "WKSP<em>CUPLSQL.INSERTRECORD", línea 4
ORA-06512: en la línea 16
ORA-06512: en "SYS.DBMS</em>SQL", línea 1721
  1. RECORD_SIZE NUMBER := 2;
    ID VARCHAR2(10);
    NAME VARCHAR2(50);
    COURSE VARCHAR2(10);
    MOBILE NUMBER(10);
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está con el parámetro de entrada MOBILE en el procedimiento INSERTRECORD. El parámetro se define como NUMBER(10), lo que significa que solo puede aceptar números de hasta 10 dígitos. Sin embargo, parece que la entrada del usuario para MOBILE puede contener caracteres no numéricos, lo que provoca el error ORA-01722.

    Para solucionar este problema, puedes modificar el procedimiento para validar la entrada de MOBILE antes de insertarla en la tabla. Por ejemplo, puedes usar la función REGEXP_LIKE para comprobar si la entrada solo contiene caracteres numéricos y luego convertirla a un tipo de dato numérico antes de insertarla.

    Aquí tienes una versión actualizada del procedimiento:

    CREATE OR REPLACE PROCEDURE "INSERTRECORD" (
      ID IN VARCHAR2,
      NAME IN VARCHAR2,
      COURSE IN VARCHAR2,
      MOBILE IN VARCHAR2,
      EMAIL IN VARCHAR2
    )
    IS
    BEGIN
      IF NOT REGEXP_LIKE(MOBILE, '^\d+$') THEN
        RAISE_APPLICATION_ERROR(-20001, 'Número de móvil inválido');
      END IF;
    
      INSERT INTO STUDENTS VALUES(ID, NAME, COURSE, TO_NUMBER(MOBILE), EMAIL);
    END;
    

    Ten en cuenta que agregamos una validación para el parámetro MOBILE utilizando la función REGEXP_LIKE, que verifica si la entrada coincide con el patrón ‘^\d+$’, lo que significa que debe contener solo dígitos.

    También hemos agregado una función TO_NUMBER para convertir la entrada de MOBILE a un tipo de dato numérico antes de insertarla en la tabla.

    Con estos cambios, ahora deberías poder insertar registros en la tabla durante el tiempo de ejecución sin errores.

Comments are closed.