【问题标题】:Finding length of JSON array in PL/SQL Trigger在 PL/SQL 触发器中查找 JSON 数组的长度
【发布时间】:2017-10-22 16:29:50
【问题描述】:

我正在尝试使用 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:在“触发器名称”,第 9 行
ORA-04088: 执行触发器“TriggerName”时出错
ORA-06512: 在第 6 行`

我想我应该只是使用不同的方法来查找 JSON 数组的长度,但我无法通过文档或堆栈溢出找到任何内容。

另外,如果有帮助,JSON 会以以下形式存储:

{
"order_sku":[{"sku1":"details"},{"sku2":"details"}]
}

【问题讨论】:

  • 感谢 N Cheadle。看起来你在 12c 上。我想知道您是否研究过 12cR1 中引入的 json 支持?它具有可能感兴趣的功能,例如json_tabledocs.oracle.com/database/121/ADXDB/json.htm#ADXDB6246
  • JSON_Table 完成了我打算对触发器执行的操作,感谢您的评论。

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


【解决方案1】:

由于您使用的是 12c 版本,因此我同意 @alexgibbs,因为如果您真的想使用 apex_json,您应该查看 json_table,您不需要将 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;

【讨论】:

  • 我认为你是对的,我正在更详细地查看 JSON 表,我认为这比尝试自己手动插入数据要干净得多。让我更深入地研究使用 json_table 创建视图,如果可行,我会将您的解决方案标记为答案。
  • JSON 表完全符合我的要求,使用该函数创建视图完全符合我的要求。
猜你喜欢
  • 2014-12-18
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多