我试图使用Application Express在Oracle 12c中以编程方式在PL / SQL触发器中找到JSON数组的长度。这将允许我遍历每个元素并将数据插入另一个表。现在,JSON作为CLOB存储在一列中,我将其转换为VarCHAR2。代码如下:
declare
json CLOB;
json_varchar VARCHAR2(32767);
json_member WWV_FLOW_T_VARCHAR2;
begin
json := :new.ORDER_SKU;
json_varchar := CAST(json AS VARCHAR2);
apex_json.parse (json);
json_member := APEX_JSON.get_members(p_path=>'order_sku');
FOR i IN 1..json_member.count
LOOP
...
END LOOP;
end;
运行此触发器时出现以下错误:
SQL错误消息:ORA-06502:PL / SQL:数字或值错误
ORA-06512:在“APEX_050100.WWV_FLOW_JSON”,第1597行
ORA-06512:在“TriggerName”,第9行 ORA-04088:执行触发器'TriggerName'时出错。
ORA-06512:在6号线
我在想我应该使用不同的方法来查找JSON数组的长度,但是我无法通过文档或堆栈溢出找到任何方法。
如果它有帮助,JSON以下列形式存储:
{
"order_sku":[{"sku1":"details"},{"sku2":"details"}]
}
答案 0 :(得分:1)
由于你处于12c版本,我同意@alexgibbs,你应该看看json_table,如果你真的想使用apex_json,你不需要将你的clob转换为varchar,你可以做类似的事情
DECLARE
l_json CLOB := '{"order_sku":[{"sku1":"details"},{"sku2":"details"}] }';
j apex_json.t_values;
l_path VARCHAR2(100);
BEGIN
apex_json.parse(j, l_json);
FOR i IN 1..apex_json.get_count(p_values => j, p_path => 'order_sku')
LOOP
-- if your sku tag could be always the same "sku" you would not need the following line
l_path := 'order_sku[%d].' || apex_json.get_members(p_values => j, p_path => 'order_sku[%d]', p0 => i)(1);
-- replace with the insert you want to do
dbms_output.put_line(apex_json.get_varchar2(p_values => j, p_path => l_path, p0 => i));
END LOOP;
END;