Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Oracle (http://www.forosdelweb.com/f100/)
-   -   Retorno De Carro, Salto De Linea En Plsql (http://www.forosdelweb.com/f100/retorno-carro-salto-linea-plsql-564458/)

Sonic_plsql 10/03/2008 05:22

Retorno De Carro, Salto De Linea En Plsql
 
Hola!!

Soy nuevo en este foro y tengo un problema con un plsql, a ver si alguien sabe darme una idea :)

Me estan pasando un fichero de array de bites desde java para que lo desglose con un plsql, tiene la siguiente forma:

[73, 68, 83, 72, 80, 124, 78, 79, 77, 67, 79, 77, 80, 76, 69, 84, 79, 124, 78, 79, 77, 82, 79, 84, 85, 76, 65, 82, 124, 78, 79, 77, 67, 79, 82, 84, 79, 124, 71, 69, 78, 69, 82, 73, 67, 79, 124, 78, 79, 77, 66, 85, 83, 81, 85, 69, 68, 65, 124, 78, 79, 77, 78, 79, 77, 84, 73, 80, 79, 95, 67, 124, 78, 79, 77, 78, 79, 77, 84, 73, 80, 79, 95, 69, 13, 10, 55, 124, 101, 100, 105, 102, 105, 99, 105, 111, 124, 101, 100, 105, 102, 105, 99, 105, 111, 46, 116, 101, 115, 116, 100, 99, 124, 101, 100, 105, 102, 105, 99, 105, 111, 46, 116, 101, 115, 116, 100, 99, 124, 101, 100, 105, 102, 105, 99, 105, 111, 46, 116, 101, 115, 116, 100, 99, 124, 101, 100, 105, 102, 105, 99, 105, 111, 46, 116, 101, 115, 116, 100, 99, 124, 101, 100, 105, 102, 105, 99, 105, 111, 124, 101, 114, 97, 105, 107, 105, 110, 13, 10, 50, 48, 50, 124, 101, 100, 105, 102, 105, 99, 105, 111, 124, 101, 100, 105, 102, 105, 99, 105, 111, 46, 116, 101, 115, 116, 100, 99, 124, 101, 100, 105, 102, 105, 99, 105, 111, 46, 116, 101, 115, 116, 100, 99, 124, 101, 100, 105, 102, 105, 99, 105, 111, 46, 116, 101, 115, 116, 100, 99, 124, 101, 100, 105, 102, 105, 99, 105, 111, 46, 116, 101, 115, 116, 100, 99, 124, 101, 100, 105, 102, 105, 99, 105, 111, 124, 101, 114, 97, 105, 107, 105, 110, 13, 10, 57, 48, 50, 124, 101, 100, 105, 102, 105, 99, 105, 111, 124, 101, 100, 105, 102, 105, 99, 105, 111, 46, 116, 101, 115, 116, 100, 99, 124, 101, 100, 105, 102, 105, 99, 105, 111, 46, 116, 101, 115, 116, 100, 99, 124, 101, 100, 105, 102, 105, 99, 105, 111, 46, 116, 101, 115, 116, 100, 99, 124, 101, 100, 105, 102, 105, 99, 105, 111, 46, 116, 101, 115, 116, 100, 99, 124, 101, 100, 105, 102, 105, 99, 105, 111, 124, 101, 114, 97, 105, 107, 105, 110, 13, 10, 49, 55, 55, 56, 124, 101, 100, 105, 102, 105, 99, 105, 111, 124, 101, 100, 105, 102, 105, 99, 105, 111, 46, 116, 101, 115, 116, 100, 99, 124, 101, 100, 105, 102, 105, 99, 105, 111, 46, 116, 101, 115, 116, 100, 99, 124, 101, 100, 105, 102, 105, 99, 105, 111, 46, 116, 101, 115, 116, 100, 99, 124, 101, 100, 105, 102, 105, 99, 105, 111, 46, 116, 101, 115, 116, 100, 99, 124, 101, 100, 105, 102, 105, 99, 105, 111, 124, 101, 114, 97, 105, 107, 105, 110]

Se que el retorno de carro es el caracter 13 y el salto de linea es el 10.
Mis pregunta son ¿Existe alguna función dentro de un paquete en el que pueda hacer el retorno de carro y el salto de linea?
Estoy usando UTL_FILE para abrir ficheros, ¿existe dentro de este paquete alguna función que me almacene temporalmente un fichero en la base de datos y luego borrarlo?.
Llevo poco programando el PLSQL y una ayudita me vendria genial.
Gracias de antemano :)

matanga 10/03/2008 06:15

Re: Retorno De Carro, Salto De Linea En Plsql
 
Hola,

Cita:

¿Existe alguna función dentro de un paquete en el que pueda hacer el retorno de carro y el salto de linea?
Si entiendo bien, lo que buscas es la funcion CHR, chr(10) y chr(13) es la representacion de retorno de carro y salto de linea.

Cita:

¿existe dentro de este paquete alguna función que me almacene temporalmente un fichero en la base de datos y luego borrarlo?.
Te dejo un procedimiento que utilizo para cargar ficheros a la base de datos dentro de campos LOBs, aunque no veo claramente para que los quieres cargar. Tendras que cambiar el codigo y pasar de utilizar el package UTL_FILE al package DBMS_LOB para leer la informacion.

Código:

SQL> CREATE TABLE files (
  2  dir_name  VARCHAR2(30),
  3  file_name VARCHAR2(30),
  4  file_data BLOB)
  5  /

Tabla creada.

SQL> CREATE DIRECTORY TEMP AS 'C:\TEMP\'
  2  /

Directorio creado.

SQL>
SQL> CREATE OR REPLACE PROCEDURE load (
  2    p_dir_name  VARCHAR2,
  3    p_file_name VARCHAR2
  4  )
  5  IS
  6
  7  s_file BFILE;
  8  d_file BLOB;
  9  len BINARY_INTEGER;
 10
 11  BEGIN
 12
 13    s_file := bfilename(p_dir_name, p_file_name);
 14
 15    INSERT INTO files VALUES (p_dir_name, p_file_name, EMPTY_BLOB());
 16
 17    SELECT file_data INTO d_file
 18    FROM files
 19    WHERE dir_name = p_dir_name and file_name = p_file_name;
 20
 21    dbms_lob.fileopen(s_file, dbms_lob.file_readonly);
 22
 23    len := dbms_lob.getlength(s_file);
 24
 25    dbms_lob.loadfromfile(d_file, s_file, len);
 26
 27    UPDATE files
 28    SET file_data = d_file
 29    WHERE dir_name = p_dir_name and file_name = p_file_name;
 30
 31    dbms_lob.fileclose(s_file);
 32
 33  END;
 34  /

Procedimiento creado.

SQL> exec load('TEMP','1.txt');

Procedimiento PL/SQL terminado correctamente.

SQL>
SQL> commit;

Confirmaci¾n terminada.

Saludos

Sonic_plsql 12/03/2008 04:56

Re: Retorno De Carro, Salto De Linea En Plsql
 
Matanga, muchisimas gracias por ayudarme.

Me han servido de guia tus aclaraciones.

De nuevo mil gracias ;)

matanga 12/03/2008 05:02

Re: Retorno De Carro, Salto De Linea En Plsql
 
Por nada :)

Saludos

Sonic_plsql 27/03/2008 11:13

Re: Retorno De Carro, Salto De Linea En Plsql
 
Esta ha sido mi solución final

DECLARE

v_file CLOB := 'IDSHP|CAMPO1|CAMPO2|CAMPO3|CAMPO4|CAMPO5|CAMPO6|C AMPO7|'||CHR(10)||CHR(13)||'1|REG1|REG2|REG3|REG4| REG5| REG6|REG7|'||CHR(10)||CHR(13);

v_texto_linea VARCHAR2(4000);
v_long INTEGER;
v_contini PLS_INTEGER;
v_initline PLS_INTEGER;
v_salto VARCHAR2(10);
v_chunk_size INTEGER := 0;
v_cont PLS_INTEGER;
v_campo_idshp VARCHAR2(32);

BEGIN

v_cont := 1;
v_contini := 0;
v_initline := 1;
v_salto :=CHR(10)||CHR(13); --salto de carro

LOOP

v_contini := DBMS_LOB.INSTR(v_file,v_salto,v_initline,1);

v_chunk_size := v_contini - v_initline;

DBMS_LOB.READ(v_file,
v_chunk_size,
v_initline,
v_texto_linea);

v_long := DBMS_LOB.GETLENGTH(v_texto_linea);

v_initline := v_contini + 2;

IF v_cont = 1 THEN

v_campo_idshp := SUBSTR(v_texto_linea, 1, INSTR(v_texto_linea, '|') - 1);
v_texto_linea := SUBSTR(v_texto_linea, INSTR(v_texto_linea, '|') + 1, LENGTH(v_texto_linea));

END IF;

dbms_output.put_line(v_campo_idshp);
dbms_output.put_line(v_texto_linea);

END LOOP;
END;

Bueno puedo ir quedandome con los nombres de campo o registros que necesite leyendo desde cada separador de campo "|", si quiero ir a que me desglose los registros tendre que meter un contador en el loop y sumando 1 (cont := cont +1).

Y me ha funcionado bien , de nuevo gracias a los que me han ayudado


La zona horaria es GMT -6. Ahora son las 19:55.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.