正如标题所述,我正在尝试测试位于该对象表内的对象的过程,而且与简单选择的函数不同,我不知道该如何做。 这是我的代码
第一个对象
create or replace type t_ingresos is object
(anio number(4),
excedentes number(12),
premios_concedidos number(12));
/
该对象的类型表
create type tab_ingresos as table of t_ingresos;
另一个对象,带有相关过程
create or replace type t_beneficios is object
(id_socio number(12),
ingresos tab_ingresos,
map member function f_ordenar return number,
member procedure p_calcular_ingresos)
/
create or replace type body t_beneficios is
map member function f_ordenar return number is
begin
return self.id_socio;
end;
member procedure p_calcular_ingresos is
v_mov_excedente number(3);
v_mov_premio number(3);
v_id_cuenta number(8);
ind number;
begin
select id_tipo into v_mov_e
from aho_tipo_movimiento
where nombre_tipo like '%DE%';
select id_tipo into v_mov_p
from aho_tipo_movimiento
where nombre_tipo like '%P%';
select id_cuenta into v_id_cuenta
from aho_cuenta_ahorro
where id_socio = self.id_socio and rownum = 1;
ind := self.ingresos.first;
while ind <= self.ingresos.last loop
dbms_output.put_line(self.ingresos(ind).excedentes);
dbms_output.put_line(self.ingresos(ind).premios_concedidos);
dbms_output.put_line(v_mov_e);
dbms_output.put_line(v_mov_p);
dbms_output.put_line(v_id_cuenta);
end loop;
end;
end;
/
最后一个表,带有嵌套表
create table socios_beneficios of t_beneficios
nested table ingresos store as ingresos_tab
/
我尝试过pl / sql,因为它是一个过程,但是我得到了“必须声明组件'P_CALCULAR_INGRESOS'”
declare
begin
socios_beneficios.p_calcular_ingresos();
end;
/
谢谢
答案 0 :(得分:1)
您的member procedure
在外部表中查找某些数据,因此我创建了一些虚拟数据以对其进行测试。
您可以通过从表中检索数据来测试它,例如select value(p) from socios_beneficios p
,但这不是一个好主意。为什么?因为您的过程包含错误。每次您更正它时,都必须删除表,因为重新编译依赖对象所在的类型时会遇到问题。
因此,创建一个简单的变量并测试过程:
declare
v_beneficios t_beneficios;
begin
v_beneficios := t_beneficios(1, tab_ingresos(t_ingresos(11, 101, 1001),
t_ingresos(12, 102, 1002)));
dbms_output.put_line(v_beneficios.f_ordenar);
v_beneficios.p_calcular_ingresos;
end;
这告诉我v_mov_e
和v_mov_p
的定义丢失了。并且v_mov_excedente
和v_mov_premio
被声明但从未使用过。并且存在无限循环,因为您没有递增ind
。因此纠正的过程是:
member procedure p_calcular_ingresos is
v_mov_e number(3);
v_mov_p number(3);
v_mov_excedente number(3);
v_mov_premio number(3);
v_id_cuenta number(8);
ind number;
begin
select id_tipo into v_mov_e
from aho_tipo_movimiento
where nombre_tipo like '%DE%';
select id_tipo into v_mov_p
from aho_tipo_movimiento
where nombre_tipo like '%P%';
select id_cuenta into v_id_cuenta
from aho_cuenta_ahorro
where id_socio = self.id_socio and rownum = 1;
ind := self.ingresos.first;
while ind <= self.ingresos.last loop
dbms_output.put_line(self.ingresos(ind).excedentes);
dbms_output.put_line(self.ingresos(ind).premios_concedidos);
dbms_output.put_line(v_mov_e);
dbms_output.put_line(v_mov_p);
dbms_output.put_line(v_id_cuenta);
ind := ind + 1;
end loop;
end;
我不知道它的作用,我想您可能正在构建某些东西,因此尚未完成。但是现在可以编译了,我们简单的测试用例就可以了。