Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / преобразование данных из json в таблицу / 20 сообщений из 20, страница 1 из 1
23.11.2016, 17:15
    #39352898
slana
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
Всем доброго времени суток.
Нужен совет или да помощь в решении одной задачи. Нужно реализовать преобразование данных из вида json в таблицу. Работаю на 11 Oracle. Установила пакеты PLJSON, пыталась использовать его функции и доку читала и у меня сложилась впечатление что он служит для формирования json, а обратный процесс... как создать цикл внутри json??
...
Рейтинг: 0 / 0
23.11.2016, 17:32
    #39352912
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
slana,

Приведите пример входных данных, ожидаемого результата и что уже пытались/смогли сделать.
Так вам ответят быстрее.
...
Рейтинг: 0 / 0
23.11.2016, 17:49
    #39352929
slana
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
env, спасибо за совет...

Да по сути я еще ничего не сделала, пока собираю информацию. Создала процедуру, в которую передаю свой json, кстати он еще в GLOB сидит, я его преобразовываю в тип json да и на этом все...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
 procedure lexem ( num number) as
      l_lob  CLOB;
      j_obj json;               
    begin
      
  select s_lana.json_obj.obj1 into l_lob from s_lana.json_obj where s_lana.json_obj.id_obj = num for update; 
         j_obj := json(l_lob);
                 if (j_obj.exist('FVictim.DInsurerID')) 
            then
      if(j_obj.get(''FVictim.DInsurerID'').is_array) then
       .
       . -- пока еще не придумала что дальше...
       .
           insert into s_lana.par_json (f_id, FV_DInsurerID, fc_claimdate,fv_otherpolicyseries,
      fv_otherpolicyno,fc_policyno,fc_policyseries,fv_fvehicle_regno,fc_fvehicle_regno
      ,fe_eventdate,fc_fcaseid,fc_recorddate,fc_modifydate)
      values (ae_script_log_seq.nextval, 
      json_ext.get_number(j_obj,'SearchResult.FVictim.DInsurerID'),
       s_lana.json_ext.get_date(j_obj,'SearchResult.FCase.ClaimDate'),
       s_lana.json_ext.get_string(j_obj,'SearchResult.FVictim.OtherPolicySeries'),
       s_lana.json_ext.get_number(j_obj,'SearchResult.FVictim.FVictim.OtherPolicyNo'),
       s_lana.json_ext.get_number(j_obj,'SearchResult.FCase.PolicyNo'),
       s_lana.json_ext.get_string(j_obj,'SearchResult.FCase.PolicySeries'),
       s_lana.json_ext.get_string(j_obj,'SearchResult.FVictim.FVehicle.RegNo'),
        s_lana.json_ext.get_string(j_obj,'SearchResult.FCase.FVehicle.RegNo'),
       s_lana.json_ext.get_date(j_obj,'SearchResult.FEvent.EventDate'),
       s_lana.json_ext.get_number(j_obj,'SearchResult.FCase.FCaseID'),
        s_lana.json_ext.get_date(j_obj,'SearchResult.FCase.__RecordDate'),
       s_lana.json_ext.get_date(j_obj,'SearchResult.FCase.__ModifyDate'));



Json имеет такую структуру:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
"SearchResult":
	[
		{
			"FVictim.DInsurerID":"3",
			"FCase.ClaimDate":"02.06.2016 00:00",
			"FVictim.OtherPolicySeries":"AI",
			"FVictim.OtherPolicyNo":"5795444",
			"FCase.PolicyNo":"8638408",
			"FCase.PolicySeries":"AI",
			"FVictim.FVehicle.RegNo":"AO7920AI",
			"FCase.FVehicle.RegNo":"AA6687KT",
			"FEvent.EventDate":"02.06.2016 00:00",
			"FCase.FCaseID":"1598448",
			"FCase.__RecordDate":"10.11.2016 15:23",
			"FCase.__ModifyDate":"12.11.2016 16:48"
		},
		{
			"FVictim.DInsurerID":"3",
			"FCase.ClaimDate":"01.06.2016 00:00",
			"FVictim.OtherPolicySeries":"AI",
			"FVictim.OtherPolicyNo":"8179959",
			"FCase.PolicyNo":"8816870",
			"FCase.PolicySeries":"AI",
			"FVictim.FVehicle.RegNo":"BI7116BA",
			"FCase.FVehicle.RegNo":"BB2708BO",
			"FEvent.EventDate":"01.06.2016 00:00",
			"FCase.FCaseID":"1598451",
			"FCase.__RecordDate":"10.11.2016 15:24",
			"FCase.__ModifyDate":"21.11.2016 15:32"
		},
		...
	]

}



нужно преобразовать в таблицу где параметры будут полями, а значения формировать строки.
Ребят строго не судите , для меня эта тема совсем новая...
...
Рейтинг: 0 / 0
23.11.2016, 18:10
    #39352945
FridayThe13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
ex8.sql
Код: plsql
1.
2.
3.
    if(obj.exist('b')) then
      if(obj.get('b').is_array) then
        temp := json_list(obj.get('b'));
...
Рейтинг: 0 / 0
23.11.2016, 18:35
    #39352973
slana
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
FridayThe13ex8.sql
Код: plsql
1.
2.
3.
    if(obj.exist('b')) then
      if(obj.get('b').is_array) then
        temp := json_list(obj.get('b'));



Это отсюда: ex8.sql : Использование добытчиками Path JSON..
Я его начала пробывать, но засовневалась...
спасибо, сейчас буду пробывать
...
Рейтинг: 0 / 0
23.11.2016, 18:41
    #39352980
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
slanaРебят строго не судите , для меня эта тема совсем новая...

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
SQL> CREATE TABLE json_tbl(
  2                        json_doc CLOB
  3                        CONSTRAINT ensure_json CHECK(json_doc IS JSON)
  4                       )
  5  /

Table created.

SQL> INSERT
  2    INTO json_tbl
  3    VALUES('{"SearchResult":
  4   [
  5    {
  6     "FVictim.DInsurerID":"3",
  7     "FCase.ClaimDate":"02.06.2016 00:00",
  8     "FVictim.OtherPolicySeries":"AI",
  9     "FVictim.OtherPolicyNo":"5795444",
 10     "FCase.PolicyNo":"8638408",
 11     "FCase.PolicySeries":"AI",
 12     "FVictim.FVehicle.RegNo":"AO7920AI",
 13     "FCase.FVehicle.RegNo":"AA6687KT",
 14     "FEvent.EventDate":"02.06.2016 00:00",
 15     "FCase.FCaseID":"1598448",
 16     "FCase.__RecordDate":"10.11.2016 15:23",
 17     "FCase.__ModifyDate":"12.11.2016 16:48"
 18    },
 19    {
 20     "FVictim.DInsurerID":"3",
 21     "FCase.ClaimDate":"01.06.2016 00:00",
 22     "FVictim.OtherPolicySeries":"AI",
 23     "FVictim.OtherPolicyNo":"8179959",
 24     "FCase.PolicyNo":"8816870",
 25     "FCase.PolicySeries":"AI",
 26     "FVictim.FVehicle.RegNo":"BI7116BA",
 27     "FCase.FVehicle.RegNo":"BB2708BO",
 28     "FEvent.EventDate":"01.06.2016 00:00",
 29     "FCase.FCaseID":"1598451",
 30     "FCase.__RecordDate":"10.11.2016 15:24",
 31     "FCase.__ModifyDate":"21.11.2016 15:32"
 32    }
 33          ]}')
 34  /

1 row created.

SQL> SELECT  FVictim_DInsurerID ,
  2          FCase_ClaimDate,
  3          FVictim_OtherPolicySeries,
  4          FVictim_OtherPolicyNo,
  5          FCase_PolicyNo,
  6          FCase_PolicySeries,
  7          FVictim_FVehicle_RegNo,
  8          FCase_FVehicle_RegNo,
  9          FEvent_EventDate,
 10          FCase_FCaseID,
 11          FCase__RecordDate,
 12          FCase__ModifyDate
 13    FROM  json_tbl,
 14          JSON_TABLE(
 15                     json_doc,'$'
 16                     COLUMNS
 17                       (
 18                        NESTED PATH '$.SearchResult[*]'
 19                          COLUMNS
 20                            (                           
 21                             FVictim_DInsurerID        VARCHAR2(20) PATH '$."FVictim.DInsurerID"',
 22                             FCase_ClaimDate           VARCHAR2(20) PATH '$."FCase.ClaimDate"',
 23                             FVictim_OtherPolicySeries VARCHAR2(20) PATH '$."FVictim.OtherPolicySeries"',
 24                             FVictim_OtherPolicyNo     VARCHAR2(20) PATH '$."FVictim.OtherPolicyNo"',
 25                             FCase_PolicyNo            VARCHAR2(20) PATH '$."FCase.PolicyNo"',
 26                             FCase_PolicySeries        VARCHAR2(20) PATH '$."FCase.PolicySeries"',
 27                             FVictim_FVehicle_RegNo    VARCHAR2(20) PATH '$."FVictim.FVehicle.RegNo"',
 28                             FCase_FVehicle_RegNo      VARCHAR2(20) PATH '$."FCase.FVehicle.RegNo"',
 29                             FEvent_EventDate          VARCHAR2(20) PATH '$."FEvent.EventDate"',
 30                             FCase_FCaseID             VARCHAR2(20) PATH '$."FCase.FCaseID"',
 31                             FCase__RecordDate         VARCHAR2(20) PATH '$."FCase.__RecordDate"',
 32                             FCase__ModifyDate         VARCHAR2(20) PATH '$."FCase.__ModifyDate"'
 33                            )
 34                       )
 35                    )
 36  /

FVICTIM_DINSURERID   FCASE_CLAIMDATE      FVICTIM_OTHERPOLICYS FVICTIM_OTHERPOLICYN FCASE_POLICYNO       FCASE_POLICYSERIES   FVICTIM_FVEHICLE_REG FCASE_FVEHICLE_REGNO FEVENT_EVENTDATE     FCASE_FCASEID        FCASE__RECORDDATE    FCASE__MODIFYDATE
-------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
3                    02.06.2016 00:00     AI                   5795444              8638408              AI                   AO7920AI             AA6687KT             02.06.2016 00:00     1598448              10.11.2016 15:23     12.11.2016 16:48
3                    01.06.2016 00:00     AI                   8179959              8816870              AI                   BI7116BA             BB2708BO             01.06.2016 00:00     1598451              10.11.2016 15:24     21.11.2016 15:32

SQL> 



SY.
...
Рейтинг: 0 / 0
23.11.2016, 18:52
    #39352989
slana
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
Я в ШОКЕ...... Вы использовали PLJSON?
SYslanaРебят строго не судите , для меня эта тема совсем новая...

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
SQL> CREATE TABLE json_tbl(
  2                        json_doc CLOB
  3                        CONSTRAINT ensure_json CHECK(json_doc IS JSON)
  4                       )
  5  /

Table created.

SQL> INSERT
  2    INTO json_tbl
  3    VALUES('{"SearchResult":
  4   [
  5    {
  6     "FVictim.DInsurerID":"3",
  7     "FCase.ClaimDate":"02.06.2016 00:00",
  8     "FVictim.OtherPolicySeries":"AI",
  9     "FVictim.OtherPolicyNo":"5795444",
 10     "FCase.PolicyNo":"8638408",
 11     "FCase.PolicySeries":"AI",
 12     "FVictim.FVehicle.RegNo":"AO7920AI",
 13     "FCase.FVehicle.RegNo":"AA6687KT",
 14     "FEvent.EventDate":"02.06.2016 00:00",
 15     "FCase.FCaseID":"1598448",
 16     "FCase.__RecordDate":"10.11.2016 15:23",
 17     "FCase.__ModifyDate":"12.11.2016 16:48"
 18    },
 19    {
 20     "FVictim.DInsurerID":"3",
 21     "FCase.ClaimDate":"01.06.2016 00:00",
 22     "FVictim.OtherPolicySeries":"AI",
 23     "FVictim.OtherPolicyNo":"8179959",
 24     "FCase.PolicyNo":"8816870",
 25     "FCase.PolicySeries":"AI",
 26     "FVictim.FVehicle.RegNo":"BI7116BA",
 27     "FCase.FVehicle.RegNo":"BB2708BO",
 28     "FEvent.EventDate":"01.06.2016 00:00",
 29     "FCase.FCaseID":"1598451",
 30     "FCase.__RecordDate":"10.11.2016 15:24",
 31     "FCase.__ModifyDate":"21.11.2016 15:32"
 32    }
 33          ]}')
 34  /

1 row created.

SQL> SELECT  FVictim_DInsurerID ,
  2          FCase_ClaimDate,
  3          FVictim_OtherPolicySeries,
  4          FVictim_OtherPolicyNo,
  5          FCase_PolicyNo,
  6          FCase_PolicySeries,
  7          FVictim_FVehicle_RegNo,
  8          FCase_FVehicle_RegNo,
  9          FEvent_EventDate,
 10          FCase_FCaseID,
 11          FCase__RecordDate,
 12          FCase__ModifyDate
 13    FROM  json_tbl,
 14          JSON_TABLE(
 15                     json_doc,'$'
 16                     COLUMNS
 17                       (
 18                        NESTED PATH '$.SearchResult[*]'
 19                          COLUMNS
 20                            (                           
 21                             FVictim_DInsurerID        VARCHAR2(20) PATH '$."FVictim.DInsurerID"',
 22                             FCase_ClaimDate           VARCHAR2(20) PATH '$."FCase.ClaimDate"',
 23                             FVictim_OtherPolicySeries VARCHAR2(20) PATH '$."FVictim.OtherPolicySeries"',
 24                             FVictim_OtherPolicyNo     VARCHAR2(20) PATH '$."FVictim.OtherPolicyNo"',
 25                             FCase_PolicyNo            VARCHAR2(20) PATH '$."FCase.PolicyNo"',
 26                             FCase_PolicySeries        VARCHAR2(20) PATH '$."FCase.PolicySeries"',
 27                             FVictim_FVehicle_RegNo    VARCHAR2(20) PATH '$."FVictim.FVehicle.RegNo"',
 28                             FCase_FVehicle_RegNo      VARCHAR2(20) PATH '$."FCase.FVehicle.RegNo"',
 29                             FEvent_EventDate          VARCHAR2(20) PATH '$."FEvent.EventDate"',
 30                             FCase_FCaseID             VARCHAR2(20) PATH '$."FCase.FCaseID"',
 31                             FCase__RecordDate         VARCHAR2(20) PATH '$."FCase.__RecordDate"',
 32                             FCase__ModifyDate         VARCHAR2(20) PATH '$."FCase.__ModifyDate"'
 33                            )
 34                       )
 35                    )
 36  /

FVICTIM_DINSURERID   FCASE_CLAIMDATE      FVICTIM_OTHERPOLICYS FVICTIM_OTHERPOLICYN FCASE_POLICYNO       FCASE_POLICYSERIES   FVICTIM_FVEHICLE_REG FCASE_FVEHICLE_REGNO FEVENT_EVENTDATE     FCASE_FCASEID        FCASE__RECORDDATE    FCASE__MODIFYDATE
-------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
3                    02.06.2016 00:00     AI                   5795444              8638408              AI                   AO7920AI             AA6687KT             02.06.2016 00:00     1598448              10.11.2016 15:23     12.11.2016 16:48
3                    01.06.2016 00:00     AI                   8179959              8816870              AI                   BI7116BA             BB2708BO             01.06.2016 00:00     1598451              10.11.2016 15:24     21.11.2016 15:32

SQL> 



SY.
...
Рейтинг: 0 / 0
23.11.2016, 19:09
    #39353002
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
slanaЯ в ШОКЕ...... Вы использовали PLJSON?


Упс - прочитaл по-диагонали и пропустил 11G.

SY.
...
Рейтинг: 0 / 0
23.11.2016, 21:58
    #39353092
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
а почему не использовать apex_json, там конвертацию в xml, а далее уже через xmltable разбор? Не вижу смысла ставить странные пакеты.
...
Рейтинг: 0 / 0
23.11.2016, 22:08
    #39353099
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
11.2.0.4.0, PLJSON:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
set serveroutput on format wrapped
declare
    v_json     json := json('{"SearchResult":
 [
  {
   "FVictim.DInsurerID":"3",
   "FCase.ClaimDate":"02.06.2016 00:00",
   "FVictim.OtherPolicySeries":"AI",
   "FVictim.OtherPolicyNo":"5795444",
   "FCase.PolicyNo":"8638408",
   "FCase.PolicySeries":"AI",
   "FVictim.FVehicle.RegNo":"AO7920AI",
   "FCase.FVehicle.RegNo":"AA6687KT",
   "FEvent.EventDate":"02.06.2016 00:00",
   "FCase.FCaseID":"1598448",
   "FCase.__RecordDate":"10.11.2016 15:23",
   "FCase.__ModifyDate":"12.11.2016 16:48"
  },
  {
   "FVictim.DInsurerID":"3",
   "FCase.ClaimDate":"01.06.2016 00:00",
   "FVictim.OtherPolicySeries":"AI",
   "FVictim.OtherPolicyNo":"8179959",
   "FCase.PolicyNo":"8816870",
   "FCase.PolicySeries":"AI",
   "FVictim.FVehicle.RegNo":"BI7116BA",
   "FCase.FVehicle.RegNo":"BB2708BO",
   "FEvent.EventDate":"01.06.2016 00:00",
   "FCase.FCaseID":"1598451",
   "FCase.__RecordDate":"10.11.2016 15:24",
   "FCase.__ModifyDate":"21.11.2016 15:32"
  }
        ]}');
    v_array         json_list;
    v_array_element json;
    v_keys          json_list;
    begin
        v_array := json_list(v_json.get('SearchResult'));
        for v_i in 1..v_array.count loop
          v_array_element := json(v_array.get(v_i));
          v_keys          := v_array_element.get_keys;
          dbms_output.put_line(' ');
          dbms_output.put_line('RECORD' || v_i);
          dbms_output.put_line(' ');
          for v_j in 1..v_keys.count loop
            dbms_output.put_line(RPAD('  KEY = ' || v_keys.get(v_j).get_string(),34) || ' ' || 'VALUE = ' || v_array_element.get(v_j).get_string());
          end loop;
        end loop;
    end;
/

RECORD1

  KEY = FVictim.DInsurerID         VALUE = 3
  KEY = FCase.ClaimDate            VALUE = 02.06.2016 00:00
  KEY = FVictim.OtherPolicySeries  VALUE = AI
  KEY = FVictim.OtherPolicyNo      VALUE = 5795444
  KEY = FCase.PolicyNo             VALUE = 8638408
  KEY = FCase.PolicySeries         VALUE = AI
  KEY = FVictim.FVehicle.RegNo     VALUE = AO7920AI
  KEY = FCase.FVehicle.RegNo       VALUE = AA6687KT
  KEY = FEvent.EventDate           VALUE = 02.06.2016 00:00
  KEY = FCase.FCaseID              VALUE = 1598448
  KEY = FCase.__RecordDate         VALUE = 10.11.2016 15:23
  KEY = FCase.__ModifyDate         VALUE = 12.11.2016 16:48

RECORD2

  KEY = FVictim.DInsurerID         VALUE = 3
  KEY = FCase.ClaimDate            VALUE = 01.06.2016 00:00
  KEY = FVictim.OtherPolicySeries  VALUE = AI
  KEY = FVictim.OtherPolicyNo      VALUE = 8179959
  KEY = FCase.PolicyNo             VALUE = 8816870
  KEY = FCase.PolicySeries         VALUE = AI
  KEY = FVictim.FVehicle.RegNo     VALUE = BI7116BA
  KEY = FCase.FVehicle.RegNo       VALUE = BB2708BO
  KEY = FEvent.EventDate           VALUE = 01.06.2016 00:00
  KEY = FCase.FCaseID              VALUE = 1598451
  KEY = FCase.__RecordDate         VALUE = 10.11.2016 15:24
  KEY = FCase.__ModifyDate         VALUE = 21.11.2016 15:32

PL/SQL procedure successfully completed.

SQL> 



SY.
...
Рейтинг: 0 / 0
24.11.2016, 10:53
    #39353434
slana
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
Shtock, Добрый день. Такой вариант тоже рассматривала, думаю к нему вернусь, если на прямую не получится... Спасибо!
...
Рейтинг: 0 / 0
24.11.2016, 10:56
    #39353437
slana
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
SY, Интересно..., сейчас попробую у себя нарисовать, может сразу и в таблицу загоню. Спасибо SY!
...
Рейтинг: 0 / 0
24.11.2016, 13:20
    #39353594
slana
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
Ура, заработало!!!
Отдельное спасибо SY!!!

Кидаю код, вдруг кому-нибудь пригодится!!!

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
procedure lexem(num number) as
    l_lob CLOB;
  
    f_id            number;
    FV_DI           varchar2(5);
    FC_CD           varchar(20); 
    FV_OPS          varchar2(2);
    FV_OPNo         varchar(16); 
    FC_PNo          varchar(16); --- Это переменные которым присваиваются 
    FC_PS           varchar2(2); -- значения переменных json
    FV_FVRNo        varchar(16);
    FC_FVRNo        varchar(16);
    FE_ED           varchar(16); 
    FC_FCID         varchar2(15);
    FC_RD           varchar(16); 
    FC_MD           varchar(16); 
    j_obj           json;
    v_array         json_list;
    v_array_element json;
    v_keys          json_list;
  begin
  
    select json_obj.obj1
      into l_lob          
      from json_obj
     wherejson_obj.id_obj = num
       for update;
    j_obj := json(l_lob); -- достаем из таблицы glob, где хранится json 

  
    begin -- далее обрабатываем его
      v_array := json_list(j_obj.get('SearchResult'));
      for v_i in 1 .. v_array.count loop
        v_array_element := json(v_array.get(v_i));
        v_keys          := v_array_element.get_keys;
        for v_j in 1 .. v_keys.count loop
          if v_keys.get(v_j).get_string() = ('FVictim.DInsurerID') then
            FV_DI := v_array_element.get(v_j).get_string();
          else
            if v_keys.get(v_j).get_string() = ('FCase.ClaimDate') then
              FC_CD := v_array_element.get(v_j).get_string();
            else
              if v_keys.get(v_j)
               .get_string() = ('FVictim.OtherPolicySeries') then
                FV_OPS := v_array_element.get(v_j).get_string();
              else
                if v_keys.get(v_j).get_string() = ('FVictim.OtherPolicyNo') then
                  FV_OPNo := v_array_element.get(v_j).get_string();
                else
                  if v_keys.get(v_j).get_string() = ('FCase.PolicyNo') then
                    FC_PNo := v_array_element.get(v_j).get_string();
                  else
                    if v_keys.get(v_j).get_string() = ('FCase.PolicySeries') then
                      FC_PS := v_array_element.get(v_j).get_string();
                    else
                      if v_keys.get(v_j)
                       .get_string() = ('FVictim.FVehicle.RegNo') then
                        FV_FVRNo := v_array_element.get(v_j).get_string();
                      else
                        if v_keys.get(v_j)
                         .get_string() = ('FCase.FVehicle.RegNo') then
                          FC_FVRNo := v_array_element.get(v_j).get_string();
                        else
                          if v_keys.get(v_j)
                           .get_string() = ('FEvent.EventDate') then
                            FE_ED := v_array_element.get(v_j).get_string();
                          else
                            if v_keys.get(v_j)
                             .get_string() = ('FCase.FCaseID') then
                              FC_FCID := v_array_element.get(v_j)
                                         .get_string();
                            else
                              if v_keys.get(v_j)
                               .get_string() = ('FCase.__RecordDate') then
                                FC_RD := v_array_element.get(v_j)
                                         .get_string();
                              else
                                if v_keys.get(v_j)
                                 .get_string() = ('FCase.__ModifyDate') then
                                  FC_MD := v_array_element.get(v_j)
                                           .get_string();
                                end if;
                              end if;
                            end if;
                          end if;
                        end if;
                      end if;
                    end if;
                  end if;
                end if;
              end if;
            end if;
          end if;
        
        end loop;
        insert into par_json
          (f_id,
           FV_DInsurerID,
           fc_claimdate,
           fv_otherpolicyseries,
           fv_otherpolicyno,
           fc_policyno,
           fc_policyseries,
           fv_fvehicle_regno,
           fc_fvehicle_regno,
           fe_eventdate,
           fc_fcaseid,
           fc_recorddate,
           fc_modifydate)
        values
          (ae_script_log_seq.nextval,
           FV_DI,
           FC_CD,
           FV_OPS,
           FV_OPNo,
           FC_PNo,
           FC_PS,
           FV_FVRNo,
           FC_FVRNo,
           FE_ED,
           FC_FCID,
           FC_RD,
           FC_MD);
      end loop;
    
    end;



в итоге имеем очень симпатичную табличку!!!

Всем еще раз спасибо и удачи!!!
...
Рейтинг: 0 / 0
24.11.2016, 13:45
    #39353623
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
Открой для себя ELSIF и/или CASE
...
Рейтинг: 0 / 0
24.11.2016, 13:45
    #39353625
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
slana
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
          if v_keys.get(v_j).get_string() = ('FVictim.DInsurerID') then
            FV_DI := v_array_element.get(v_j).get_string();
          else
            if v_keys.get(v_j).get_string() = ('FCase.ClaimDate') then
              FC_CD := v_array_element.get(v_j).get_string();
            else
              if v_keys.get(v_j)
               .get_string() = ('FVictim.OtherPolicySeries') then
                FV_OPS := v_array_element.get(v_j).get_string();
              else
                if v_keys.get(v_j).get_string() = ('FVictim.OtherPolicyNo') then
                  FV_OPNo := v_array_element.get(v_j).get_string();
                else
                  if v_keys.get(v_j).get_string() = ('FCase.PolicyNo') then
                    FC_PNo := v_array_element.get(v_j).get_string();
                  else
... 
                                if v_keys.get(v_j)
                                 .get_string() = ('FCase.__ModifyDate') then
                                  FC_MD := v_array_element.get(v_j)
                                           .get_string();




Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
case v_keys.get(v_j).get_string() 
when 'FVictim.DInsurerID' then
            FV_DI := v_array_element.get(v_j).get_string();
when 'FCase.ClaimDate' then
            FC_CD := v_array_element.get(v_j).get_string();
when 'FVictim.OtherPolicySeries' then
            FV_OPS := v_array_element.get(v_j).get_string();
when 'FVictim.OtherPolicyNo' then
            FV_OPNo := v_array_element.get(v_j).get_string();
when 'FCase.PolicyNo' then
...
when 'FCase.__ModifyDate' then
            FC_MD := v_array_element.get(v_j).get_string();
end case;
...
Рейтинг: 0 / 0
24.11.2016, 15:03
    #39353737
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
slanaУра, заработало!!!


Все это прекрасно, но ведь у тебя вcе тэги известны заранее. Я использовал get_keys только для того что на dbms_output писанины меньше.
Ты-бы почитала на сон грядущий методы типов json, json_list, json_value, etc. глядишь и наткнулась на метод json.get.
Тогда и не писала бы монстроидальные IFы . Лови:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
SQL> create table par_json(
  2                        FV_DInsurerID varchar2(20),
  3                        fc_claimdate varchar2(20),
  4                        fv_otherpolicyseries varchar2(20),
  5                        fv_otherpolicyno varchar2(20),
  6                        fc_policyno varchar2(20),
  7                        fc_policyseries varchar2(20),
  8                        fv_fvehicle_regno varchar2(20),
  9                        fc_fvehicle_regno varchar2(20),
 10                        fe_eventdate varchar2(20),
 11                        fc_fcaseid varchar2(20),
 12                        fc_recorddate varchar2(20),
 13                        fc_modifydate varchar2(20)
 14                       )
 15  /

Table created.

declare
    v_json     json := json('{"SearchResult":
 [
  {
   "FVictim.DInsurerID":"3",
   "FCase.ClaimDate":"02.06.2016 00:00",
   "FVictim.OtherPolicySeries":"AI",
   "FVictim.OtherPolicyNo":"5795444",
   "FCase.PolicyNo":"8638408",
   "FCase.PolicySeries":"AI",
   "FVictim.FVehicle.RegNo":"AO7920AI",
   "FCase.FVehicle.RegNo":"AA6687KT",
   "FEvent.EventDate":"02.06.2016 00:00",
   "FCase.FCaseID":"1598448",
   "FCase.__RecordDate":"10.11.2016 15:23",
   "FCase.__ModifyDate":"12.11.2016 16:48"
  },
  {
   "FVictim.DInsurerID":"3",
   "FCase.ClaimDate":"01.06.2016 00:00",
   "FVictim.OtherPolicySeries":"AI",
   "FVictim.OtherPolicyNo":"8179959",
   "FCase.PolicyNo":"8816870",
   "FCase.PolicySeries":"AI",
   "FVictim.FVehicle.RegNo":"BI7116BA",
   "FCase.FVehicle.RegNo":"BB2708BO",
   "FEvent.EventDate":"01.06.2016 00:00",
   "FCase.FCaseID":"1598451",
   "FCase.__RecordDate":"10.11.2016 15:24",
   "FCase.__ModifyDate":"21.11.2016 15:32"
  }
        ]}');
    v_array         json_list;
    v_array_element json;
    begin
        v_array := json_list(v_json.get('SearchResult'));
        for v_i in 1..v_array.count loop
          v_array_element := json(v_array.get(v_i));
          insert
            into par_json(
                          fv_dinsurerid,
                          fc_claimdate,
                          fv_otherpolicyseries,
                          fv_otherpolicyno,
                          fc_policyno,
                          fc_policyseries,
                          fv_fvehicle_regno,
                          fc_fvehicle_regno,
                          fe_eventdate,
                          fc_fcaseid,
                          fc_recorddate,
                          fc_modifydate
                         )
            values(
                   v_array_element.get('FVictim.DInsurerID').get_string(),
                   v_array_element.get('FCase.ClaimDate').get_string(),
                   v_array_element.get('FVictim.OtherPolicySeries').get_string(),
                   v_array_element.get('FVictim.OtherPolicyNo').get_string(),
                   v_array_element.get('FCase.PolicyNo').get_string(),
                   v_array_element.get('FCase.PolicySeries').get_string(),
                   v_array_element.get('FVictim.FVehicle.RegNo').get_string(),
                   v_array_element.get('FCase.FVehicle.RegNo').get_string(),
                   v_array_element.get('FEvent.EventDate').get_string(),
                   v_array_element.get('FCase.FCaseID').get_string(),
                   v_array_element.get('FCase.__RecordDate').get_string(),
                   v_array_element.get('FCase.__ModifyDate').get_string()
                  );
        end loop;
    end;
/

PL/SQL procedure successfully completed.

SQL> select  *
  2    from  par_json
  3  /

FV_DINSURERID        FC_CLAIMDATE         FV_OTHERPOLICYSERIES FV_OTHERPOLICYNO     FC_POLICYNO          FC_POLICYSERIES      FV_FVEHICLE_REGNO    FC_FVEHICLE_REGNO    FE_EVENTDATE         FC_FCASEID           FC_RECORDDATE        FC_MODIFYDATE
-------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -----------------
3                    02.06.2016 00:00     AI                   5795444              8638408              AI                   AO7920AI             AA6687KT             02.06.2016 00:00     1598448              10.11.2016 15:23     12.11.2016 16:48
3                    01.06.2016 00:00     AI                   8179959              8816870              AI                   BI7116BA             BB2708BO             01.06.2016 00:00     1598451              10.11.2016 15:24     21.11.2016 15:32

SQL> 



SY.
...
Рейтинг: 0 / 0
24.11.2016, 15:21
    #39353773
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
И еще. Твое решение (как и мое с insert) предполагает каждый элемент json array всегда содержитvalue pairs с тэгами:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
   "FVictim.DInsurerID"
   "FCase.ClaimDate"
   "FVictim.OtherPolicySeries"
   "FVictim.OtherPolicyNo"
   "FCase.PolicyNo"
   "FCase.PolicySeries"
   "FVictim.FVehicle.RegNo"
   "FCase.FVehicle.RegNo"
   "FEvent.EventDate"
   "FCase.FCaseID"
   "FCase.__RecordDate",
   "FCase.__ModifyDate"



Если это не так, то исользуй метод json.exist.

SY.
...
Рейтинг: 0 / 0
24.11.2016, 15:35
    #39353796
slana
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
SY,
Мне еще не с одной функцией нужно разобраться... буду модифицировать... Я догадываюсь что там много лишнего налеплено, но для меня это уже маленькая победа...
...
Рейтинг: 0 / 0
24.11.2016, 15:38
    #39353802
slana
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
SY, Да, этот json будет всегда содержать одинаковые поля. Я так понимаю что можно написать универсальную процедуру, которая будет обрабатывать любой json?
...
Рейтинг: 0 / 0
24.11.2016, 15:49
    #39353819
slana
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование данных из json в таблицу
Да как все оказывается просто... Честно чувствую себя полным user-ом...:( Спасибо.
SY
Все это прекрасно, но ведь у тебя вcе тэги известны заранее. Я использовал get_keys только для того что на dbms_output писанины меньше.
Ты-бы почитала на сон грядущий методы типов json, json_list, json_value, etc. глядишь и наткнулась на метод json.get.
Тогда и не писала бы монстроидальные IFы . Лови:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
SQL> create table par_json(
  2                        FV_DInsurerID varchar2(20),
  3                        fc_claimdate varchar2(20),
  4                        fv_otherpolicyseries varchar2(20),
  5                        fv_otherpolicyno varchar2(20),
  6                        fc_policyno varchar2(20),
  7                        fc_policyseries varchar2(20),
  8                        fv_fvehicle_regno varchar2(20),
  9                        fc_fvehicle_regno varchar2(20),
 10                        fe_eventdate varchar2(20),
 11                        fc_fcaseid varchar2(20),
 12                        fc_recorddate varchar2(20),
 13                        fc_modifydate varchar2(20)
 14                       )
 15  /

Table created.

declare
    v_json     json := json('{"SearchResult":
 [
  {
   "FVictim.DInsurerID":"3",
   "FCase.ClaimDate":"02.06.2016 00:00",
   "FVictim.OtherPolicySeries":"AI",
   "FVictim.OtherPolicyNo":"5795444",
   "FCase.PolicyNo":"8638408",
   "FCase.PolicySeries":"AI",
   "FVictim.FVehicle.RegNo":"AO7920AI",
   "FCase.FVehicle.RegNo":"AA6687KT",
   "FEvent.EventDate":"02.06.2016 00:00",
   "FCase.FCaseID":"1598448",
   "FCase.__RecordDate":"10.11.2016 15:23",
   "FCase.__ModifyDate":"12.11.2016 16:48"
  },
  {
   "FVictim.DInsurerID":"3",
   "FCase.ClaimDate":"01.06.2016 00:00",
   "FVictim.OtherPolicySeries":"AI",
   "FVictim.OtherPolicyNo":"8179959",
   "FCase.PolicyNo":"8816870",
   "FCase.PolicySeries":"AI",
   "FVictim.FVehicle.RegNo":"BI7116BA",
   "FCase.FVehicle.RegNo":"BB2708BO",
   "FEvent.EventDate":"01.06.2016 00:00",
   "FCase.FCaseID":"1598451",
   "FCase.__RecordDate":"10.11.2016 15:24",
   "FCase.__ModifyDate":"21.11.2016 15:32"
  }
        ]}');
    v_array         json_list;
    v_array_element json;
    begin
        v_array := json_list(v_json.get('SearchResult'));
        for v_i in 1..v_array.count loop
          v_array_element := json(v_array.get(v_i));
          insert
            into par_json(
                          fv_dinsurerid,
                          fc_claimdate,
                          fv_otherpolicyseries,
                          fv_otherpolicyno,
                          fc_policyno,
                          fc_policyseries,
                          fv_fvehicle_regno,
                          fc_fvehicle_regno,
                          fe_eventdate,
                          fc_fcaseid,
                          fc_recorddate,
                          fc_modifydate
                         )
            values(
                   v_array_element.get('FVictim.DInsurerID').get_string(),
                   v_array_element.get('FCase.ClaimDate').get_string(),
                   v_array_element.get('FVictim.OtherPolicySeries').get_string(),
                   v_array_element.get('FVictim.OtherPolicyNo').get_string(),
                   v_array_element.get('FCase.PolicyNo').get_string(),
                   v_array_element.get('FCase.PolicySeries').get_string(),
                   v_array_element.get('FVictim.FVehicle.RegNo').get_string(),
                   v_array_element.get('FCase.FVehicle.RegNo').get_string(),
                   v_array_element.get('FEvent.EventDate').get_string(),
                   v_array_element.get('FCase.FCaseID').get_string(),
                   v_array_element.get('FCase.__RecordDate').get_string(),
                   v_array_element.get('FCase.__ModifyDate').get_string()
                  );
        end loop;
    end;
/

PL/SQL procedure successfully completed.

SQL> select  *
  2    from  par_json
  3  /

FV_DINSURERID        FC_CLAIMDATE         FV_OTHERPOLICYSERIES FV_OTHERPOLICYNO     FC_POLICYNO          FC_POLICYSERIES      FV_FVEHICLE_REGNO    FC_FVEHICLE_REGNO    FE_EVENTDATE         FC_FCASEID           FC_RECORDDATE        FC_MODIFYDATE
-------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -----------------
3                    02.06.2016 00:00     AI                   5795444              8638408              AI                   AO7920AI             AA6687KT             02.06.2016 00:00     1598448              10.11.2016 15:23     12.11.2016 16:48
3                    01.06.2016 00:00     AI                   8179959              8816870              AI                   BI7116BA             BB2708BO             01.06.2016 00:00     1598451              10.11.2016 15:24     21.11.2016 15:32

SQL> 



SY.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / преобразование данных из json в таблицу / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]