Oracle:如何通过名称动态获取对象字段值

问题描述 投票:0回答:1

当所需字段的名称存储在变量中时,有没有一种方法可以动态获取和设置对象字段的值?

类似这样的:

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 中执行此操作?

oracle plsql
1个回答
0
投票

您可以向对象添加成员函数:

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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.