Corrección de Procedimiento

Hola neosys, hace unos días me diste la idea de construir un procedimiento para facilitar la inserción de registros, tengo este procedimiento pero me dice que se crea con errores de compilación, ¿me harías el favor de revisarlo haber si le ves algo? Es este:
CREATE OR REPLACE PROCEDURE INSERTA_visual (v_Id_vis INT,
v_Fecha DATE,
v_equipo_esp CHAR,
v_placa CHAR,
v_recubrimiento CHAR,
v_estado_rec CHAR,
v_accesorios CHAR,
v_anclajes CHAR,
v_base CHAR,
v_puesta_tierra CHAR,
v_corrosion_externa CHAR,
v_escalera_acceso CHAR,
v_uniones_soldadas CHAR,
v_foto BLOB,
v_diagrama BLOB,
v_observaciones CHAR)
IS
--
l_bfile BFILE;
l_blob BLOB;
l_bfile2 BFILE;
l_blob2 BLOB;
--
BEGIN
--
INSERT INTO visual
(Id_vis, Fecha, equipo_esp, placa, recubrimiento, estado_rec, accesorios,
anclajes, base, puesta_tierra, corrosion_externa, escalera_acceso, uniones_soldadas, foto,
diagrama, observaciones)
VALUES
(v_Id_vis, to_date(v_Fecha), v_equipo_esp, v_placa, v_recubrimiento, v_estado_rec, v_accesorios,
v_anclajes, v_base, v_puesta_tierra, v_corrosion_externa, v_escalera_acceso, v_uniones_soldadas,
EMPTY_BLOB(), EMPTY_BLOB(), v_observaciones)
RETURN foto, diagrama INTO l_blob, l_blob2;
--
l_bfile := BFILENAME ('IMAGES', v_foto);
--
DBMS_LOB.fileopen(l_bfile, Dbms_Lob.File_Readonly);
DBMS_LOB.Loadfromfile(l_blob,l_bfile,DBMS_LOB.getlength(l_bfile));
DBMS_LOB.fileclose(l_bfile);
--
l_bfile2 := BFILENAME ('IMAGES', v_diagrama);
--
DBMS_LOB.fileopen(l_bfile2, Dbms_Lob.File_Readonly);
DBMS_LOB.Loadfromfile(l_blob2,l_bfile2,DBMS_LOB.getlength(l_bfile2));
DBMS_LOB.fileclose(l_bfile2);
--
COMMIT;
--
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE( SQLERRM ); -- Muestra un mensaje de error si se produce
--
ROLLBACK;
---
RAISE;
--
END INSERTA_visual;
/
La tabla es esta:
CREATE TABLE visual (
Id_vis INT not null primary key,
Fecha DATE,
equipo_esp char (25) not null,
placa char (25),
recubrimiento char (25),
estado_rec char (50),
accesorios char (50),
anclajes char (50),
base char (50),
puesta_tierra char (50),
corrosion_externa char (50),
escalera_acceso char (50),
uniones_soldadas char (50),
foto BLOB,
diagrama BLOB,
observaciones char(50),
CONSTRAINT ClaveExtvisualnombre_equ FOREIGN KEY (equipo_esp) REFERENCES equipos ON DELETE CASCADE);
CREATE SEQUENCE seq_visual
start WITH 1
increment BY 1
nomaxvalue;
CREATE OR REPLACE TRIGGER trig_visual
BEFORE INSERT ON visual
FOR EACH ROW
BEGIN
SELECT seq_visual.NEXTVAL INTO :new.Id_vis FROM dual;
END;
/
La secuencia y el trigger lo hice para que me almacene un dato autonumérico en el primer campo de la tabla, en la tabla se define como INT PRIMARY KEY.
De antemano te agradezco mucho por tu tiempo.

1 Respuesta

Respuesta
1
Es muy sencillo. Cuando te propuse hacerlo es para no trabajar con parámetros BLOB.
Para ello te dije o indiqué que solo pasases el NOMBRE DEL FICHERO/s, y estos son de tipo VARCHAR2 ... Mira como queda :
CREATE OR REPLACE PROCEDURE INSERTA_visual (v_Id_vis INT,
v_Fecha DATE,
v_equipo_esp CHAR,
v_placa CHAR,
v_recubrimiento CHAR,
v_estado_rec CHAR,
v_accesorios CHAR,
v_anclajes CHAR,
v_base CHAR,
v_puesta_tierra CHAR,
v_corrosion_externa CHAR,
v_escalera_acceso CHAR,
v_uniones_soldadas CHAR,
v_foto VARCHAR2, -- BLOB,
v_diagrama VARCHAR2, --BLOB,
v_observaciones CHAR)
IS
--
l_bfile BFILE;
l_blob BLOB;
l_bfile2 BFILE;
l_blob2 BLOB;
--
BEGIN
--
INSERT INTO visual
(Id_vis, Fecha, equipo_esp, placa, recubrimiento, estado_rec, accesorios,
anclajes, base, puesta_tierra, corrosion_externa, escalera_acceso, uniones_soldadas, foto,
diagrama, observaciones)
VALUES
(v_Id_vis, to_date(v_Fecha), v_equipo_esp, v_placa, v_recubrimiento, v_estado_rec, v_accesorios,
v_anclajes, v_base, v_puesta_tierra, v_corrosion_externa, v_escalera_acceso, v_uniones_soldadas,
EMPTY_BLOB(), EMPTY_BLOB(), v_observaciones)
RETURN foto, diagrama INTO l_blob, l_blob2;
--
l_bfile := BFILENAME ('IMAGES', v_foto);
--
DBMS_LOB.fileopen(l_bfile, Dbms_Lob.File_Readonly);
DBMS_LOB.Loadfromfile(l_blob,l_bfile,DBMS_LOB.getlength(l_bfile));
DBMS_LOB.fileclose(l_bfile);
--
l_bfile2 := BFILENAME ('IMAGES', v_diagrama);
--
DBMS_LOB.fileopen(l_bfile2, Dbms_Lob.File_Readonly);
DBMS_LOB.Loadfromfile(l_blob2,l_bfile2,DBMS_LOB.getlength(l_bfile2));
DBMS_LOB.fileclose(l_bfile2);
--
COMMIT;
--
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE( SQLERRM ); -- Muestra un mensaje de error si se produce
--
ROLLBACK;
---
RAISE;
--
END INSERTA_visual;
/
Cin ese tipo de cambio COMPILARÁ perfectamente. Pero recuerda que lo que le pasas a la función son los 'nombres de los ficheros' no el contenido de ellos en un BLOB.
Ah! aunque te funcione ... mejor usar VARCHAR2 que CHAR.
Un Saludo ...
Lo he probado en una 9i y compila perfectamente!
Se quejaba cuando usabas : BFILENAME
Ya que necesita de dos parámetros CHAR p VARCHAR, que son el nombre del objeto DIRECTORY y el NOMBRE DEL FICHERO.
Un Saludo y suerte.
Ya me contarás ...
Ramón

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas