如何在所述 object 的 table 中执行 object 的过程?

How to execute an object's procedure inside a table of said object?

正如标题所说,我正在尝试测试一个 object 的过程,该过程位于上述 object 的 table 中,但我不知道该怎么做,不像一个简单的函数 select。 这是我的代码

第一个object

create or replace type t_ingresos is object
(anio number(4),
excedentes number(12),
premios_concedidos number(12));
/

table object

类型
create type tab_ingresos as table of t_ingresos;

另一个 object,程序有问题

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

和最后一个 table,嵌套 table

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

谢谢

您的 member procedure 在外部 table 中寻找一些数据,因此我创建了一些虚拟数据以便能够对其进行测试。

您可以通过从 table 中检索数据来测试它,例如 select value(p) from socios_beneficios p,但这是个坏主意。为什么?因为你的程序包含错误。并且每次更正它时都必须删除 table,因为在存在依赖对象的情况下重新编译类型时会遇到问题。

所以创建一个简单的变量和测试程序:

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;

我不知道它的作用,我猜你可能正在构建一些东西,所以它还没有完成。但是现在它编译了,我们的简单测试用例就可以工作了。