在PL / SQL触发器中查找JSON数组的长度

时间:2017-05-22 21:46:41

标签: oracle plsql oracle-apex oracle12c oracle-apex-5

我试图使用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"}]
}

1 个答案:

答案 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;