当所需字段的名称存储在变量中时,有没有一种方法可以动态获取和设置对象字段的值?
类似这样的:
create or replace type t_my_type force as object
(
num_val_a number(30),
num_val_b number(30)
);
declare
l_object t_my_type := t_my_type(33, 77);
l_field_name varchar2(255 char) := 'num_val_b';
begin
dbms_output.put_line(
l_object.get_num_value_by_name(l_field_name)
);
end;
这个想法是必须计算字段的名称 - l_field_name
例如,在 Javascript 中,通过存储在变量中的名称获取对象字段的值非常简单 - 就像这样:
l_object[l_field_name]
如何在 Oracle PL/SQL 中执行此操作?
您可以向对象添加成员函数:
create or replace type t_my_type force as object
(
num_val_a number(30),
num_val_b number(30),
member function get_num_value_by_name(p_name varchar2) return number
);
/
然后在该函数的主体中,使用 case 语句来选择要返回的字段:
create or replace type body t_my_type as
member function get_num_value_by_name(p_name varchar2) return number is
begin
case lower(p_name)
when 'num_val_a' then return num_val_a;
when 'num_val_b' then return num_val_b;
else return null;
end case;
end get_num_value_by_name;
end t_my_type;
/
或 case 表达式:
create or replace type body t_my_type as
member function get_num_value_by_name(p_name varchar2) return number is
begin
return case lower(p_name)
when 'num_val_a' then num_val_a
when 'num_val_b' then num_val_b
else null
end;
end get_num_value_by_name;
end t_my_type;
/
然后您可以将所需字段的名称作为字符串传递,如您的问题所示:
declare
l_object t_my_type := t_my_type(33, 77);
l_field_name varchar2(255 char) := 'num_val_b';
begin
dbms_output.put_line(
l_object.get_num_value_by_name(l_field_name)
);
end;
/
输出;
77