utilizar atributo %rowtipe en recibimiento de parametros (PL/SQL)

occiso
28 de Diciembre del 2004
¿lo siguiente es correcto?

create or replace procedure dinamicSql (registro nombretabla%rowtype) is
begin
null;
end;

luego intento acceder a los campos mediante el operador punto de la manera registro.campo pero no me funciona. Despues de mirar por internet no logro saber si es que eso no es posible o si estoy haciendo algo mal.

saludos.

nerea
28 de Diciembre del 2004
Sí es posible, y funciona muy bien.
¿Qué error te da?

occiso
28 de Diciembre del 2004
bien, pues digamos que tengo una tabla llamada alumnos con los siguientes campos:
pk_nif varchar2(8),
nombre varchar2(30),
edad number(2),
direccion varchar2(30));

bien ahora creo el siguiente procedimiento:
create or replace procedure JosePrueba (datos alumnos%rowtype) is
begin
dbms_output.put_line(datos.pk_nif);
end JosePrueba;


¿como lo llamo desde sqlplus con execute?

si hago esto:
execute josePrueba ('alumnos', 'antonio', 22, 'calle dos');

me da el error:
PLS-00306: número o tipos de argumentos erróneos al llamar a 'JOSEPRUEBA'

y si pruebo esto otro:
execute josePrueba ('alumnos' 'antonio' 22 'calle dos');

me da este error:
PLS-00103: Se ha encontrado el símbolo "antonio" cuando se esperaba uno de los
siguientes: , ; ..

¿si se puede agradeceria que me dijeras la forma?


nerea
28 de Diciembre del 2004
Esque estás definiendo un únuco parámetro de tipo registro, y en la llamada estás mandando 4 valores,... no cuadra.
Tienes dos opciones, elige la que más te guste:

1) definir el procedimiento de la siguiente forma:
create or replace procedure JosePrueba (datos alumnos.tabla%type, alumnos.nombre%type,alimnos.edad%type,alumnos.dir%type)

2) O sino realiza la llamada de la siguiente forma:
declare mi_registro alumnos%rowtype;
begin
mi_reg.tabla:='alumnos';
mi_reg.nombre:='antonio';
mi_reg.edad:=22;
mi_reg.dir:='calle dos';
execute josePrueba (mi_reg);
end;
/