Как выполнить процедуру объекта внутри таблицы указанного объекта? - PullRequest
1 голос
/ 20 мая 2019

Как видно из заголовка, я пытаюсь проверить процедуру объекта, которая находится внутри таблицы указанного объекта, и я понятия не имею, как, в отличие от функции, которая является простым выбором. Вот мой код

Первый объект

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 Ответ

1 голос
/ 20 мая 2019

Ваш 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;

Я не знаю, что он делает, вы, вероятно, что-то строите, так что, я думаю, он еще не закончен. Но теперь он компилируется, и наш просто контрольный пример работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...