Exception handler plsql ORA-06250
518605Jun 16 2006 — edited Jun 19 2006Buenos días,
¿Comó pudedo tratar las Excepciones para que me índique el error que existe y siga leyendo el
fichero de entrada?. Solo lee hasta el 2º registro, dá la excepción y se termina la ejecución
y no sigue leyendo el fichero de entrada.
Un saludo,
Muchas gracias por tu ayuda.
Fichero Entrada:
1,laura,Junebug,Compute Science,13
2,Luisa,Murgatroid,Econimics,14
,Joane,Junebug,,13
4,Manis,Murgatroid,Econimics,14
5,Patrick,Poll,History,15
6,Timothy,Taller,,
7,Barbara,Blues,Economics,17
8,David,Dinsmore,Music,18
9,Rita,Razmataz,Nutrition,
10,Ester,Elegant,Nutricion,20
11,Rose,Riznit,LLLLLLLLLMusic,21
2,Luisa,Murgatroid,Econimics,1999
3,Joane,Junebug,,130
CREATE TABLE students (
id NUMBER(5) PRIMARY KEY,
first_name VARCHAR2(20),
last_name VARCHAR2(20),
major VARCHAR2(30),
current_credits NUMBER(3)
);
CREATE OR REPLACE PROCEDURE LoadStudents (
2
3 /* Carga de la tabla students, leyendo un archivo delimitado por comas.
4 El archivo deberá contener líneas similares a:
5 first_name,last_name,major,current_credit
6 El identificador del estudiante se genera a partir del student_sequence.
7 El número de total de filas insertadas lo devuelve p_TotalInserted.
8 */
9
10 p_TotalInserted_parcial IN OUT NUMBER,
11 p_TotalInserted IN OUT NUMBER) AS
12
13 v_StudentRecord students%ROWTYPE;
14
15 V_FileHandle UTL_FILE.FILE_TYPE;
16 V_NewLine VARCHAR2(100); lÍNEA DE ENTRADA
17
18 v_id students.id%TYPE;
19 v_FirstName students.first_name%TYPE;
20 v_LastName students.last_name%TYPE;
21 v_Major students.major%TYPE;
22 v_currentcredits students.current_credits%TYPE;
23
24 ------------------------------------------------------------------------------
25 Declaraciones de variables para ver si existe el registro yá en la tabla
26
27 TYPE t_idTable IS TABLE OF students.id%TYPE
28 INDEX BY binary_integer;
29
30 id_table t_idTable;
31 ------------------------------------------------------------------------------
32
33 /* Posiciones de las comas en la línea de entrada. */
34
35 v_FirstComa NUMBER;
36 v_SecondComa NUMBER;
37 v_TercerComa NUMBER;
38 v_CuartaComa NUMBER;
39
40 BEGIN
41
42 Abre el fichero especificado para lectura.
43
44 v_FileHandle := UTL_FILE.FOPEN('D:\scriptsplsql\','loadstudents2_OLD.txt','r');
45 DBMS_OUTPUT.PUT_LINE('Fichero D:\scriptsplsql\loasstudents2_OLD.txt abierto.');
46
47 Inicializa el número de estudiantes insertados.
48 p_TotalInserted_parcial := 0;
49 p_TotalInserted := 0;
50
51 Recorrer mediante un bucle el archivo para leer cada línea. GET_LINE
52 generará la excepción NO_DATA_FOUND cuando no encuentre más datos que leer,
53 por lo que lo usamos como condición del salida del bucle.
54
55 <>
56
57 LOOP
58 BEGIN
59 UTL_FILE.GET_LINE(v_FileHandle, v_NewLine);
60 EXCEPTION
61 WHEN NO_DATA_FOUND THEN EXIT;
62 WHEN VALUE_ERROR THEN UTL_FILE.FCLOSE(V_FileHandle);
63 END;
64
65 Cada campo del registro de entrada está delimitado por comas.
66 Necesitamos encontrar las posiciones de las cuatro comas en
67 la linea y usarlas para obtener los campos a partir de v_NewLine.
68 se emplea INSTR para encontrar las posiciones de las comas.
69
70 v_FirstComa := INSTR(v_NewLine, ',', 1, 1);
71 v_SecondComa := INSTR(v_NewLine, ',', 1, 2);
72 v_Tercercoma := INSTR(v_NewLine, ',', 1, 3);
73 v_Cuartacoma := INSTR(v_NewLine, ',', 1, 4);
74
75 Ahora podemos usar SUBSTR para extraer los campos.
76
77 v_id := SUBSTR(v_NewLine, 1, v_FirstComa -1);
78 v_FirstName := SUBSTR(v_NewLine, v_FirstComa + 1, v_SecondComa - v_FirstComa - 1);
79 v_LastName := SUBSTR(V_NewLine, v_SecondComa + 1, v_TercerComa - v_SecondComa - 1);
80 v_Major := SUBSTR(V_NewLine, v_TercerComa + 1, v_CuartaComa - v_TercerComa - 1);
81 v_currentcredits := SUBSTR(v_NewLine, v_CuartaComa + 1);
82
83 Inserta el número de registro en la tabla students.
84
85 BEGIN
86 IF v_id = p_TotalInserted
87 THEN
88 DBMS_OUTPUT.PUT_LINE(' Registro Ya existente - Se actualiza en la Tabla');
89 ELSE
90 DBMS_OUTPUT.PUT_LINE('Registro cuyo ID es: ' || v_id);
91 INSERT INTO students (ID, first_name, last_name, major,current_credits)
92 VALUES (v_id, v_FirstName, v_LastName, v_Major, v_currentcredits);
93
94 DBMS_OUTPUT.PUT_LINE(' Registro Adicionado a la Tabla');
95 END IF;
96
97 EXCEPTION
98 WHEN DUP_VAL_ON_INDEX THEN
99 DBMS_OUTPUT.PUT_LINE(' Registro Ya existente - Se actualiza en la Tabla');
100 UPDATE students set ID = v_id,
101 first_name = v_FirstName,
102 last_name = v_lastName,
103 major = v_Major,
104 current_credits = v_currentcredits
105 WHERE v_id = students.id;
106
107 WHEN VALUE_ERROR THEN
108 DBMS_OUTPUT.PUT_LINE('Registro Rechazado por no tener el apropiado tipo de campo.');
109 DBMS_OUTPUT.PUT_LINE('Registro cuyo ID es: ' || v_id);
110
111 WHEN INVALID_NUMBER THEN
112 DBMS_OUTPUT.PUT_LINE('Registro Rechazado por CONVERSION A NUMERICO.');
113 DBMS_OUTPUT.PUT_LINE('Registro cuyo ID es: ' || v_id);
114 END;
115
116 P_TotalInserted_parcial := p_TotalInserted_parcial + 1;
117 p_TotalInserted := p_TotalInserted + 1;
118
119 Se realiza un COMMIT cada 5 registros.
120
121 IF p_TotalInserted_parcial > 5
122 THEN
123 COMMIT;
124 p_TotalInserted_parcial := 0;
125 END IF;
126
127 END LOOP;
128
129 Cierre del archivo.
130 UTL_FILE.FCLOSE(V_FileHandle);
131
132 COMMIT;
133
134 EXCEPTION
135
136 Gestiona las excepciones de UTL_FILE y se asegura
137 de que el archivo se cierra adecuadamente.
138
139 WHEN UTL_FILE.INVALID_OPERATION
140 THEN
141 UTL_FILE.FCLOSE(v_FileHandle);
142 RAISE_APPLICATION_ERROR(-20051, 'LoadStudents: Operación Invalida');
143
144 WHEN UTL_FILE.INVALID_FILEHANDLE
145 THEN
146 UTL_FILE.FCLOSE(V_FileHandle);
147 RAISE_APPLICATION_ERROR(-20052, 'LoadStudents: Invalida la gestión del fichero');
148
149 WHEN UTL_FILE.READ_ERROR
150 THEN
151 UTL_FILE.FCLOSE(v_FileHandle);
152 RAISE_APPLICATION_ERROR(-20053, 'LoasStudents: Error de Lectura');
153
154 WHEN UTL_FILE.INVALID_PATH
155 THEN
156 UTL_FILE.FCLOSE(v_FileHandle);
157 raise_application_error(-20054, 'ERROR: Invalid path for file.');
158
159 WHEN OTHERS
160 THEN
161 UTL_FILE.FCLOSE(v_FileHandle);
162 RAISE;
163
164 END LoadStudents;
165 /
Procedimiento creado.
show errors
No hay errores.
declare
2 p_TotalInserted_parcial number(30);
3 p_TotalInserted number(30);
4 begin
5 p_TotalInserted_parcial := 0;
6 p_TotalInserted := 0;
7 LOADSTUDENTS(p_TotalInserted_parcial,p_TotalInserted);
8 DBMS_OUTPUT.put_line(p_TotalInserted_parcial);
9 DBMS_OUTPUT.put_line(p_TotalInserted);
10 end;
11 /
Fichero D:\scriptsplsql\loasstudents2_OLD.txt abierto.
Registro cuyo ID es: 1
Registro Adicionado a la Tabla
Registro cuyo ID es: 2
Registro Adicionado a la Tabla
Registro cuyo ID es:
declare
*
ERROR en línea 1:
ORA-01400: no se puede realizar una inserción NULL en ("SYS"."STUDENTS"."ID")
ORA-06512: en "SYS.LOADSTUDENTS", línea 162
ORA-06512: en línea 7