我们可以在没有循环的情况下获得oracle中列表属性的总和吗?

Can We get sum of list attributes in oracle without loop?

我们可以得到下面列表中所有小时的总和吗?我将求和函数与 JSON_QUERY 函数一起使用,但出现错误。

 SET SERVEROUT ON
    
    DECLARE 
    data    varchar2(200);
    JSONSTRING  VARCHAR2(4000):= ' {"Implement_Details": [
        {
          "Hours": "100",
          "Implement1": "Laser Leveler"
        },
        {
          "Hours": "400",
          "Implement1": "Trolley"
        },
        {
          "Hours": "100",
          "Implement1": "Cultivator"
        }
      ]}';
      
      BEGIN 
      
      SELECT SUM(JSON_QUERY(JSONSTRING, '$.Implement_Details[*].Hours' WITH ARRAY WRAPPER)) INTO DATA
                FROM dual;
    
      
    DBMS_OUTPUT.PUT_LINE(data);
    
    end;

预期输出: 100 + 400 + 100 = 600

Error report - ORA-01722: invalid number ORA-06512: at line 20 01722. 00000 - "invalid number" *Cause: The specified number was invalid. *Action: Specify a valid number.

您不能对整个 ARRAY 使用 SUM()。 我所做的是将 Hours 变成 table 并在列上使用 SUM(),就像通常在 SELECT 子句中那样。

SET SERVEROUT ON

DECLARE 
    data    varchar2(200);
    JSONSTRING  VARCHAR2(4000):= ' {"Implement_Details": [
        {
          "Hours": 100,
          "Implement1": "Laser Leveler"
        },
        {
          "Hours": 400,
          "Implement1": "Trolley"
        },
        {
          "Hours": 100,
          "Implement1": "Cultivator"
        }
      ]}';
      
      BEGIN 
      
        SELECT SUM(value) INTO DATA
          FROM JSON_TABLE((JSON_QUERY(JSONSTRING, '$.Implement_Details[*].Hours' WITH ARRAY WRAPPER)), '$[*]' COLUMNS (value PATH '$'));    
      
    DBMS_OUTPUT.PUT_LINE(data);
    
    end;