Error en PL/SQL con un procedimiento con cursores

publicado por: Anonymous

Intento resolver la siguiente cuestión:

Pedir al Usuario la nacionalidad, y que muestre los clientes con esa nacionalidad, para ello he usado un bloque anónimo y un procedimiento que es el siguiente:

Procedimiento:

CREATE OR REPLACE PROCEDURE mostrarNacionalidad(nacionalidad IN String2(30)) AS
CURSOS registros is SELECT Nacionalidad FROM clientes WHERE Nacionalidad = nacionalidad;

BEGIN

FOR registro IN registros LOOP
dbms_output.put_line('* * * * * * * * * * * * * * * * * * ');
dbms_output.put_line('Nombre Cliente: ' || registro.NOMBRECLIENTE);
dbms_output.put_line('Nacionalidad: ' || registro.Nacionalidad );
dbms_output.put_line('* * * * * * * * * * * * * * * * * * ');
END LOOP;

END;

Este bloque me da el siguiente error:

Error at line 13: PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

   end not pragma final instantiable order overriding static
   member constructor map

1. CREATE OR REPLACE PROCEDURE mostrarNacionalidad(nacionalidad IN String2(30)) AS
2. CURSOS registros is SELECT Nacionalidad FROM clientes WHERE Nacionalidad = nacionalidad;
3. BEGIN

Agradecería que alguien pudiera echarme una mano para resoverlo.
Muchas gracias.

solución

No se si mi versión del oracle es diferente pero probé tu código y me salio otro error.

PLS-00103: Se ha encontrado el símbolo “(” cuando se esperaba uno de
los siguientes: := . ) , @ % default character El símbolo “:=”
ha sido sustituido por “(” para continuar.

Lo cual resolví quitando paréntesis de la variable que está en la declaración del procedimiento.

String2(30)

Después volvió a salir otro error el cual no me reconocía ese tipo de datos

1/47 PLS-00201: el identificador ‘STRING2’ se debe declarar 0/0
PL/SQL: Compilation unit analysis terminated

Le cambié el tipo de datos y lo volví a probar y funciona!

El código quedó de la siguiente manera:

CREATE OR REPLACE PROCEDURE mostrarNacionalidad(nacionalidad IN VARCHAR2) AS
CURSOR registros is SELECT NOMBRECLIENTE, Nacionalidad FROM clientes WHERE Nacionalidad = nacionalidad;

BEGIN

FOR registro IN registros LOOP
dbms_output.put_line('* * * * * * * * * * * * * * * * * * ');
dbms_output.put_line('Nombre Cliente: ' || registro.NOMBRECLIENTE);
dbms_output.put_line('Nacionalidad: ' || registro.Nacionalidad );
dbms_output.put_line('* * * * * * * * * * * * * * * * * * ');
END LOOP;

END;

/

Los resultados:

declare 
  -- Local variables here
  i integer;
begin
  -- Test statements here
  mostrarNacionalidad('PY');
end;

/

* * * * * * * * * * * * * * * * * * 
Nombre Cliente: PEPITO
Nacionalidad: PY
* * * * * * * * * * * * * * * * * * 
* * * * * * * * * * * * * * * * * * 
Nombre Cliente: ARIELITO
Nacionalidad: PY
* * * * * * * * * * * * * * * * * * 
Respondido por: Anonymous

Leave a Reply

Your email address will not be published.