Necesito una forma sencilla para introducir una sentencia larga utilizando SQLplus y SQLdeveloper

Tengo una sentencia larga para la introducción de información para una tabla, trabajo en SQLplus y SQLdeveloper, ¿existe una forma donde no deba codificar toda la sentencia cada vez que le inserte un registro?
La tabla utiliza 2 campos blob entonces me toca introducir toda la declaración para insertar los registros, esto me parece engorroso, pienso que debe haber una forma más eficiente de hacerlo.

1 respuesta

Respuesta
1
Ante todo, necesitaría para ayudarte que me indicases la versión de ORACLE que estás usando.
Y si puede ser un ejemplo de como lo estás haciendo hasta ahora.
En espera de esa respuesta, no te puedo dar una o varias soluciones. Ya que ellas pueden estar relacionadas con la version de Oracle que estés utilizando.
Hola, gracias por el interés. Bueno, te cuento, tengo la siguiente sentencia para la inserción de registros de un tabla llamada INSPECCIÓN. Trabajo en Oracle 11g:
Declare
l_bfile BFILE;
l_blob BLOB;
l_bfile2 BFILE;
l_blob2 BLOB;
BEGIN
INSERT INTO inspeccion
(Id_i, Fecha, equipo_i, tecnica_i, indicacion, ubicacion, foto,e_pro,e_min,e_ret,e_nom, perfil, Observaciones_insp)
VALUES
('',to_date('12/03/2008'),'AD150','4','','',EMPTY_BLOB(),'1,234','0,655','0,343','0,333',EMPTY_BLOB(),'')
RETURN foto,perfil INTO l_blob, l_blob2;
l_bfile := BFILENAME ('IMAGES','ad150.jpg');
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','perfilad150.jpg');
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
ROLLBACK;
RAISE;
END;
La tengo en el Block de Notas, voy cambiando los valores de los campos que voy a almacenar, el problema es que tengo que hacer más de mil inserciones, y no veo cuando voy a acabar...
Se me ocurrió algo, puse la sentencia en celdas de Excel y dejo culumnas bacías en donde insertaré la información de los campos, luego la llevo al block de notas pero me deja espacios, por ejemplo ( INSERT INTO... VALUES (' 33329',' DUITAMA',' BOYACÁ '...), y lógicamente no lo puedo ejecutar con esos espacios, entonces lo corrojo en el block y lo ejecuto, funciona pero es muy engorroso, si puedes tienes una idea mejor te lo agradezco.
Entiendo perfectamente el ámbito de tu problema ...
Una pregunta : ¿De dónde sacas la información que tienes que insertar? ¿Te la envían en Excel?
Respecto al otro problema lo puedes hacer más sencillo ...
Create una Función o Procedimiento que te haga toda esta funcionalidad ...
Por ejemplo :
CREATE OR REPLACE PROCEDURE INSERTA_INSPEC (v_Id_i VARCHAR2,
                                                                                   v_Fecha VARCHAR2,
                                                                                   v_equipo_i VARCHAR2,
                                                                                   v_tecnica_i VARCHAR2,
                                                                                   v_indicacion VARCHAR2,
                                                                                   v_ubicacion VARCHAR2,
                                                                                   v_nom_foto VARCHAR2,
                                                                                   v_e_pro VARCHAR2,
                                                                                   v_e_min VARCHAR2,
                                                                                   v_e_ret VARCHAR2,
                                                                                   v_e_nom VARCHAR2,
                                                                                   v_nom_perfil VARCHAR2,
                                                                                   v_Observaciones_insp VARCHAR2)
IS
--
l_bfile BFILE;
l_blob BLOB;
l_bfile2 BFILE;
l_blob2 BLOB;
--
BEGIN
-- 
INSERT INTO inspeccion
(Id_i,             Fecha,               equipo_i,    tecnica_i,     indicacion,    ubicacion,
foto,                     e_pro, e_min,         e_ret, e_nom,    perfil, 
Observaciones_insp)
VALUES
(v_Id_i, to_date(v_Fecha), v_equipo_i, v_tecnica_i, v_indicacion, v_ubicacion,
EMPTY_BLOB(), v_e_pro, v_e_min, v_e_ret, v_e_nom, EMPTY_BLOB(),
v_Observaciones_insp)
RETURN foto, perfil INTO l_blob, l_blob2;
--
l_bfile := BFILENAME ('IMAGES', v_nom_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_nom_perfil);
--
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_INSPEC;
/
De esta forma todo el código lo tienes grabado en la BB. DD. En ese procedimiento.
NOTA : Fíjate bien en si los tipos de datos que he puesto en los parámetros son los correctos. Sino, modificalos al tipo de la tabla o coloca por ejemplo :
v_Id_i INSPECCION.ID_I%TYPE, ... etc
En todos menos en los 'v_nom_foto' i 'v_nom_perfil' que recibirán como valor el nombre de las imágenes.
Luego, para ejecutarla, tan solo debes de hacer ... si está en el sqlplus :

   exec inserta_inspec( valor1, valor2 ... etc );
Con los valores separados por comas y con su formato de tipo.
COMO NO SÉ EL ORIGEN (si me lo dices, te podría ayudar a hacer un 'script dinámico') luego te puede quedar algo como :
SET SERVEROUTPUT ON -- Para ver el error de la exception si se produce ...
exec inserta_inspec( valor1, valor2 ... etc );
exec inserta_inspec( valor1, valor2 ... etc );
exec inserta_inspec( valor1, valor2 ... etc );
exec inserta_inspec( valor1, valor2 ... etc );
O, tambien puedes hacelo :
SET SERVEROUTPUT ON
BEGIN
   inserta_inspec( valor1, valor2 ... etc );
   inserta_inspec( valor1, valor2 ... etc );
   inserta_inspec( valor1, valor2 ... etc );
   inserta_inspec( valor1, valor2 ... etc );
...
END;
/
Espero que hayas entendido todo. Si tienes alguna duda, indícamela y te ayudaré.
Así como cual es el origen de la información que recibes y en que formato, para no tener que hacerlo uno a uno.
Un Saludo y ya me contarás.
Ramón
Spain
Excelente Ramon la idea del procedimiento, lo voy a probar.
De otro lado, los datos me los entregan en tablas de excel, y para insertar las gráficas cree un directorio y debo digitar el nombre en una columna para que se incluya en el registro: como el ejemplo!
Gracias Ramon.
Lo digo, porque si eres capaz de saber un poco de Visual Basic for Applications, puedes :
- Crear un procedimiento que extraiga las imágenes y les dé un nombre.
- Leer fila a fila la información llamando a Oracle y a este procedimiento.
Eso lo puedes hacer con OO4O - Oracle Objects for OLE.
Seguro que lo tendrás instalado ...
Coge solo un ejemplo de ese directorio, donde pone 'Excel' y te enseña como realizar una select y presentar los resultados en las celdas del Excel.
A partir de ahí, y mirando el código, puedes ver como se conecta. Y la llamada al procedimiento será muy fácil de implementar!
Intentalo. Es fácil.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas