У меня есть заявление, которое я пытаюсь построить в Oracle 18c. Следующая строка отлично работает:

Select JSON_VALUE(l_resp, '$.items[0].volumeInfo.industryIdentifiers[1].type')
  into l_temp_var
  from dual;

Тем не менее, я должен варьировать второй индекс по переменной. Второй индекс в настоящее время содержит [1]. Я пытался использовать [i], определенный как числовой или varchar, но это не работает. Как я могу построить оператор Select JSON_VALUE, чтобы он использовал переменную? Спасибо, что посмотрели на это.

0
user3138025 15 Фев 2020 в 04:23

2 ответа

Лучший ответ

Я не мог заставить конкатенацию работать. Я попробовал другой подход. Мне пришлось поместить «тип» и «идентификатор» в таблицу Json.

    --Obtain the NVP values of "industryIdentifiers" e.g. ISBN_10, ISBN_13 .
    For rowz in 
        (select *
            from json_table(l_resp, '$.items[0].volumeInfo.industryIdentifiers[*]' 
                            columns (ii_type varchar2(512) path '$.type',
                                     ii_identifier varchar2(512) path '$.identifier'
                                     ) 
                            ) j_ii_tab
        )
    Loop
/*
    If rowz.ii_type = 'ISBN_10' Then
        :P133_ISBN_10 := rowz.ii_identifier;
    Elsif rowz.ii_type = 'ISBN_13' Then
        :P133_ISBN_13 := rowz.ii_identifier;
    End If ;
*/    
    dbms_output.put_line('ii_type: ' || rowz.ii_type);
    dbms_output.put_line('ii_identifier: ' || rowz.ii_identifier);
    End Loop rowz;

Может быть полезно просмотреть данные Json по адресу: https: // www .googleapis.com / книги / v1 / объем д = ISBN : 9781484204856

0
user3138025 15 Фев 2020 в 17:51

Используйте конкатенацию строк для построения строки индекса. Например:

BEGIN
  FOR i IN 1..10 LOOP
    Select JSON_VALUE(l_resp, '$.items[0].volumeInfo.industryIdentifiers[' || i || '].type')
      into l_temp_var
      from dual;

    -- Do something with the value in l_temp_var here

  END LOOP;
END:
0
Bob Jarvis - Reinstate Monica 15 Фев 2020 в 03:44