Можем ли мы получить сумму атрибутов списка в oracle без l oop? - PullRequest
2 голосов
/ 21 июня 2020

можем ли мы получить сумму всех часов в списке ниже? Я использую функцию суммы с функцией 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

Отчет об ошибке - ORA-01722 : недопустимый номер ORA-06512 : в строке 20 01722. 00000 - «недопустимый номер» * Причина: указанный номер недействителен. * Действие: укажите действительный номер.

1 Ответ

2 голосов
/ 21 июня 2020

Вы не можете использовать SUM() для всего ARRAY. Я превратил Hours в таблицу и использовал 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;
...