如何在所述 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_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;
我不知道它的作用,我猜你可能正在构建一些东西,所以它还没有完成。但是现在它编译了,我们的简单测试用例就可以工作了。
正如标题所说,我正在尝试测试一个 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_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;
我不知道它的作用,我猜你可能正在构建一些东西,所以它还没有完成。但是现在它编译了,我们的简单测试用例就可以工作了。