Создание вложенных ассоциативных массивов в Oracle 11g
Я определил ассоциативный массив в 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 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;
2 ответа
Утверждение "массовый сбор не работает с ассоциативными массивами" неверно. Массовое накопление также работает с ассоциативными массивами.
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>;
но он не будет работать для вложенного ассоциативного массива. В вашем случае вам нужно будет заполнить массивы "вручную" циклом курсора. Я никогда не использовал объект (только запись), поэтому я не знаю точный синтаксис. Но это должно выглядеть
-> создать индекс ассоциативного массива по двоичному целому числу, где индекс будет идентификатором учетной записи
-> создать запись для 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;
То, что у вас есть, не является ассоциативным массивом оракула, это вложенные таблицы оракула. Однако массовый сбор не работает с ассоциативными массивами, а с вложенными таблицами.
Ассоциативный массив 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;