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