我陷入两难境地。使用或不使用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现在比以前更清晰了。 我想知道维护这些方法,但它是分开的主题......
经过一些编码和思考,我很确定这是一个很好的决定。 更多例子赞赏:)
答案 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元素。