あなたJSONはここでその代替だ、私はあなたが配列の配列を持っているためのものと仮定した場合、このような何かがあなた
SQL> create table SOURCE_DOCUMENTS (
2 ID NUMBER,
3 JSON_DOC CLOB CHECK (JSON_DOC IS JSON)
4 )
5/
Table created.
SQL> insert into SOURCE_DOCUMENTS values (1,'{
2 "data": [
3 [
4 "col_1", "col_2"
5 ], [
6 "test2", "201702"
7 ], [
8 "test2", "201702"
9 ]
10 ]
11 }')
12/
1 row created.
SQL> commit
2/
Commit complete.
SQL> create or replace procedure insertFromJSON(P_ID NUMBER)
2 AUTHID CURRENT_USER
3 IS
4 JSON_DOC CLOB;
5 JO JSON_OBJECT_T;
6 DATA JSON_ARRAY_T;
7 COLUMN_DETAILS JSON_ARRAY_T;
8 I PLS_INTEGER := 0;
9 COLUMN_LIST VARCHAR2(32767) := '';
10 COLUMN_PATTERN VARCHAR2(32767) := '';
11 STATEMENT VARCHAR2(32767) := '';
12 begin
13
14 SELECT JSON_DOC
15 into JSON_DOC
16 from SOURCE_DOCUMENTS
17 where ID = P_ID;
18
19 JO := JSON_OBJECT_T(JSON_DOC);
20 DATA := TREAT(JO.get('data') as JSON_ARRAY_T);
21 COLUMN_DETAILS := TREAT(DATA.get(0) as JSON_ARRAY_T);
22 DBMS_OUTPUT.put_line('Column Count = ' || COLUMN_DETAILS.get_size());
23 WHILE (i < COLUMN_DETAILS.get_size()) LOOP
24 COLUMN_LIST := COLUMN_LIST || ',' || '"' || COLUMN_DETAILS.get_string(i) || '"';
25 COLUMN_PATTERN := COLUMN_PATTERN || ',' || '"' || COLUMN_DETAILS.get_string(i) || '"' || ' VARCHAR2(32) PATH ''
$[' || i || ']''';
26 i := i + 1;
27 end loop;
28 COLUMN_LIST := SUBSTR(COLUMN_LIST,2);
29 COLUMN_PATTERN := SUBSTR(COLUMN_PATTERN,2);
30 -- COLUMN_PATTERN := 'IDX FOR ORDINALITY ' || COLUMN_PATTERN;
31 STATEMENT := 'CREATE TABLE TEST as select ' || COLUMN_LIST || ' from (select ROWNUM ROW_NUM, ' || COLUMN_LIST ||
' FROM SOURCE_DOCUMENTS, JSON_TABLE(JSON_DOC,''$.data[*]'' columns ' || COLUMN_PATTERN || ') where ID = ' || P_ID || ')
WHERE ROW_NUM > 1';
32 DBMS_OUTPUT.put_line('Statement = ' || STATEMENT);
33 EXECUTE IMMEDIATE STATEMENT;
34 end;
35/
Procedure created.
SQL> show errors
No errors.
SQL> --
SQL> set serveroutput on
SQL>/
Procedure created.
SQL> call insertFromJSON(1)
2/
Column Count = 2
Statement = CREATE TABLE TEST as select "col_1","col_2" from (select ROWNUM
ROW_NUM, "col_1","col_2" FROM SOURCE_DOCUMENTS, JSON_TABLE(JSON_DOC,'$.data[*]'
columns "col_1" VARCHAR2(32) PATH '$[0]',"col_2" VARCHAR2(32) PATH '$[1]') where
ID = 1) WHERE ROW_NUM > 1
Call completed.
SQL> commit
2/
Commit complete.
SQL> select *
2 from TEST
3/
col_1 col_2
-------------------------------- --------------------------------
test2 201702
test2 201702
SQL>
カラムが常に「常に動的」な場合は、毎回異なるテーブルが必要になることがあります。それはあなたが念頭に置いていることですか?このデータを読み込んだら、このデータで何をするつもりですか?なぜJSONのドキュメントをCLOBとして保存しないのですか? – APC
列名に基づいて私はテーブルに挿入クエリを構築する必要があります。私は同じテーブルに挿入されますが、ユーザーが1つだけの列の負荷を選択する場合はあまり適切ではありません。私のクエリは、テーブル(col_1、col2)の値( "test2"、 "201702")などに挿入するようなものです。 – Chinna
テーブルは一般的なものですか?すべてのスプレッドシート用の単一のテーブル?どの行が一緒に属しているかは、どのように分かりますか?スプレッドシートの列名をどのように保存しますか? – APC