何时使用Oracle Objects(用户定义类型)?

时间:2015-01-27 16:13:41

标签: oracle object oracle11g user-defined-types

我陷入两难境地。使用或不使用Object。 在实现一些验证程序时,我意识到以下功能:

function my_table_row_has_not_children (
  p_my_object_id in number
) return varchar2
is
  t_counter number := 0;
begin

  select count(*)
    into t_counter
  from other_table_than_my_object other_obj
  where other_obj.fk_my_object_id = p_my_object_id;

  if t_counter = 0 then
    return 'T';
  else
    return 'F';
  end if;

end;

是对象方法的理想候选者,因为它与my_table_row高度相关。 它也将至少用于两个不同的包装中。 我也会获得更清晰的代码。

无论如何,我研究过Oracle Objects并不那么受欢迎: How widely used are Oracle objects?,但甲骨文还在 开发它,如Oracle 12c doc所示:https://docs.oracle.com/database/121/ADOBJ/adobjadv.htm#ADOBJ006

我们的应用程序不会使用太多的对象,而是很少使用。 因此,我应该为这种情况创建Object还是简单地将函数提取到更通用的包并在两个地方使用它。 您是否还可以提供一些其他参数来使用Oracle Objects?


我的示例代码:

CREATE TYPE my_type AS OBJECT (
  id           NUMBER,
  MEMBER FUNCTION my_table_row_has_not_children RETURN boolean;
/

CREATE TYPE BODY my_type AS
  MEMBER FUNCTION my_table_row_has_not_children RETURN boolean IS
    t_count number := 0;
  BEGIN
    select count(*) into t_count
    from other_table_than_my_object other_obj
    where other_obj.fk_my_object_id = p_my_object_id;

    if t_count > 0 then
      return true;
    else
      return false;
    end if;
  END;  

与此同时,我决定将其他两个高度相关的函数与其中的对象一起移动。现在使用该对象的验证pl / sql现在比以前更清晰了。 我想知道维护这些方法,但它是分开的主题......

经过一些编码和思考,我很确定这是一个很好的决定。 更多例子赞赏:)

1 个答案:

答案 0 :(得分:1)

我偶尔会使用Object类型来创建XML文档,这非常方便。

示例:

CREATE OR REPLACE TYPE "IPoverEthernet" AS OBJECT (
 "@ethernetIpAddress" VARCHAR2(15),
 "@ethernetSubnetMask" VARCHAR2(15))
/

SELECT XMLTYPE("IPoverEthernet"('10.100.100.20','255.255.255.0')) FROM dual;

returns 
<IPoverEthernet ethernetIpAddress="10.100.100.20" ethernetSubnetMask="255.255.255.0"></IPoverEthernet>

当然,您可以创建更复杂的XML元素。