我在Oracle中定义了关联数组,如下所示
CREATE OR REPLACE TYPE outlier AS OBJECT (
ACCOUNT_ID varchar2(100),
INC_MONTH date,
);
create or replace type outlier_acc_tab as table of outlier ;
CREATE OR REPLACE TYPE outlier_detail_rec AS OBJECT (
NAME varchar2(100),
OUTLIER_ACCOUNT_LIST outlier_acc_tab
);
create or replace type outlier_detail_tab as table of outlier_detail_rec;
目前,我在所有OUTLIER_ACCOUNT_LIST数组中重复了名称。相反,我想为单个名称分组多个帐户详细信息。请告诉我如何修改数组的定义。谢谢你的帮助。
我正在寻找像这样的输出
"OUTLIER_LIST": [
{
"NAME": "A",
"OUTLIER_ACCOUNT_LIST": [{
"ACCOUNT_ID": "361",
"INC_MONTH ": 1475208000000
}
},
{
"ACCOUNT_ID": "362",
"INC_MONTH": 1475208000000,
}
}
]
]
}
我在包中的select语句是
SELECT outlier_detail_rec (
NAME => NAME,
outlier_acc_tab (
outlier_acc_rec(
ACCOUNT_ID => ACCOUNT_ID,
INC_MONTH => INC_MONTH
) ))
BULK COLLECT INTO v_outlier_array
FROM outlier_Sel;
答案 0 :(得分:1)
你所拥有的不是oracle Associative Arrays,它们是oracle Nested Tables。但是,批量收集不适用于关联数组,但它适用于嵌套表。
outlier_account_lists的关联数组将是:
TYPE outlier_detail_aa AS TABLE OF outlier_acc_tab INDEX BY VARCHAR2(100);
要加载此类AA,您需要执行以下操作:
declare
type outlier_detail_aa as table of outlier_acc_tab index by varchar2(100)
outlier_detail outlier_detail_aa;
begin
for r in (select distinct name from outlier_sel)
loop
select outliser_acc_rec(account_id, inc_month)
bulk collect into outlier_detail(r.name)
from outlier_sel
where name = r.name;
end loop;
end;
答案 1 :(得分:1)
声明"批量收集不适用于关联数组"是错的。 批量收集也适用于关联数组。
type units_rec is record(...)
type unit_tab is table of units_rec index by binary_integer; -- <--associative array
volume_units unit_tab;
select distinct some columns
bulk collect into wul_units
from <table>;
但它不适用于嵌套的assiociative数组。在您的情况下,您将需要手动填充数组&#34;用光标循环。我从未使用过对象(只有记录)所以我不知道确切的语法。但它应该看起来像
- &GT;通过二进制整数创建关联数组索引,其中索引将是帐户ID
- &GT;为outlier_list创建一个记录,其中一列是上面创建的数组的类型,然后是该记录的一个关联数组(或者用对象尝试)
i number:=0;
for crs in (SELECT <columns> FROM outlier_Sel) loop
outlier_list(i).name := crs.outlier_list_name;
outlier_list(i)(crs.account_id) := crs.account_name;
...
end loop;