当前位置: 首页 > 知识库问答 >
问题:

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

聂涛
2023-03-14

我试图使用Application Express以编程方式在Oracle12c中查找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:at“apex_050100.wwv_flow_json”,第1597行
ORA-06512:at“triggername”,第9行
ORA-04088:html" target="_blank">执行触发器'triggername'
ORA-06512:at第6`

我认为我应该使用另一种方法来查找JSON数组的长度,但我无法通过文档或堆栈溢出找到任何长度。

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

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

共有1个答案

耿锦
2023-03-14

由于您使用的是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;
 类似资料:
  • 主要内容:创建触发器,示例在本章中,我们将讨论和学习PL/SQL中的触发器。 触发器是存储的程序,在发生某些事件时会自动执行或触发。事实上,触发器是为了响应以下任何事件而被执行的 - 数据库操作(DML)语句(,或) 数据库定义(DDL)语句(,或)。 数据库操作(,,,或)。 可以在事件关联的表,视图,模式或数据库上定义触发器。 使用触发器的好处 触发器可以用于以下目的 - 自动生成一些派生列值 强化参照完整性 事件记录

  • 问题内容: 我正在尝试编写一个触发器来填充一个包含有关雇员的最新工资信息的表。我有一个问题,我现在无法完全绕开我的头。 这是要填充的表: 这是我的触发器: 触发器编译没有问题,但是当我尝试运行此更新时,Oracle告诉我触发器无效。是什么原因造成的? 问题答案: 您已按块显示了代码。但似乎您正在运行一起显示为脚本的内容,最初没有进行更新: 在SQL Developer中作为脚本运行时,脚本输出窗口

  • 我想创建ddl触发器(在创建),这将创建一个dml触发器,但我有错误: ORA-06512:8 00604. 00000-"错误发生在递归SQL级别%s"*原因:错误发生在处理递归SQL语句(适用于内部字典表的语句)。*操作:如果可以纠正堆栈上下一个错误中描述的情况,请这样做;否则请联系Oracle支持。

  • 问题内容: 我有一些代码需要调试帮助,但我认为,如果我能运行其中之一,我将可以得到其余的代码(哦,我希望如此)。 我正在尝试通过sqlplus在我学校的服务器上运行的表上执行此操作,如果有帮助的话。 问题答案: 遇到错误时,指定什么错误总是有帮助的。触发器中的调用中存在语法错误。该过程需要两个参数,一个数字和一个字符串。您传入的是一个长字符串的单个参数。 假设您的表格中有一列,则该值应有效。

  • 主要内容:创建Varray类型在本章中,我们将讨论学习PL/SQL中的数组。 PL/SQL编程语言提供了一种称为的数据结构,它可以存储相同类型的元素的固定大小顺序集合。用于存储有序的数据集合,但通常最好将数组视为相同类型变量的集合。 所有是由连续的内存位置组成。最低的地址对应于第一个元素,而最后一个元素的地址最高。参考以下图示 - 数组是集合类型数据的一部分,表示可变大小的数组。 我们将在后面的“PL/SQL集合”这一章中学习

  • 问题内容: 如何找到二维数组中的行和列数? 例如, 应该显示为3行2列。 问题答案: 像这样: 假定所有子列表具有相同的长度(也就是说,它不是锯齿状的数组)。