Ver Mensaje Individual
  #11 (permalink)  
Antiguo 22/04/2008, 09:27
Avatar de dropthebass
dropthebass
 
Fecha de Ingreso: abril-2008
Mensajes: 27
Antigüedad: 16 años, 1 mes
Puntos: 0
Re: PL/SQL/Procedimiento: Invertir frase por palabras

Viendolo así he cambiado la condición de forma que se repetirá mientras "posicion" sea diferente de 0. He hecho cambios y ya le veo lógica al recorrido del procedimiento, pero sigue saliendome errores

Código:
CREATE OR REPLACE PROCEDURE reves_frase (cadena VARCHAR2)
AS
paraula_rev VARCHAR2(20);
paraula VARCHAR2(20);
frase_rev VARCHAR2(100);
posicion NUMBER default 1;
inicio NUMBER default 1;
x NUMBER;

BEGIN

WHILE posicion <> 0 LOOP
posicion:=INSTR(cadena,' ');
paraula:=SUBSTR(cadena,inicio,posicion);
inicio:=posicion+1;

x := LENGTH(paraula);
WHILE x >= 1 LOOP
paraula_rev := paraula_rev || SUBSTR(paraula, x , 1); 
x := x -1;
END LOOP;

frase_rev := frase_rev || paraula_rev;

END LOOP;
DBMS_OUTPUT.PUT_LINE(frase_rev);
END;
Sigo dudando en lo de la "posicion", ¿cada vez que hace el INSTR saca la posicion del espacio siguiente? Es que me da la sensación de que siempre saca la posicion del primer espacio.

De todos modos si puedes revisarme el código te lo agredecería.
Muchas gracias, me estás ayudando mucho


EDITO

Mirando la función INSTR y creo que contestando mi anterior pregunta... he visto que puedo poner un tercer argumento que determine que ocurrencia estoy buscando en la cadena. Así que he creado la variable "siguiente", que determinará que espacio está buscando. Ahora me ya no me da error, pero el resultado no es el esperado, te lo copio...

Código:
CREATE OR REPLACE PROCEDURE reves_frase (cadena VARCHAR2)
AS
paraula_rev VARCHAR2(20);
paraula VARCHAR2(20);
frase_rev VARCHAR2(100);
siguiente NUMBER default 0;
posicion NUMBER default 1;
inicio NUMBER default 1;
x NUMBER;

BEGIN

WHILE posicion <> 0 LOOP
siguiente:=siguiente+1;
posicion:=INSTR(cadena,' ',siguiente);
paraula:=SUBSTR(cadena,inicio,posicion);
inicio:=posicion+1;

x := LENGTH(paraula);
paraula_rev:= ' ';
WHILE x >= 1 LOOP
paraula_rev := paraula_rev || SUBSTR(paraula, x , 1); 
x := x -1;
END LOOP;

frase_rev := frase_rev || paraula_rev;

END LOOP;
DBMS_OUTPUT.PUT_LINE(frase_rev);
END;
EJEMPLO DEL RESULTADO:

SQL> execute reves_frase('Girar la frase');

rariG arf al arf al arf al arf al arf al esarf al esarf esarf

Última edición por dropthebass; 22/04/2008 a las 17:41