如何在所述对象表内执行对象的过程?

时间:2019-05-19 22:23:00

标签: oracle object nested procedure

正如标题所述,我正在尝试测试位于该对象表内的对象的过程,而且与简单选择的函数不同,我不知道该如何做。 这是我的代码

第一个对象

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;
/

谢谢

1 个答案:

答案 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_ev_mov_p的定义丢失了。并且v_mov_excedentev_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;

我不知道它的作用,我想您可能正在构建某些东西,因此尚未完成。但是现在可以编译了,我们简单的测试用例就可以了。