2017-05-02 18 views
0
var hot = new Handsontable(container, {} 
JSON.stringify({data: hot.getData()}) 

JSON: { data: [ 
     "col_1" // These are the table columns 
     "col_2"  
    ], 
    [ 
     "test2",// there are values 
     "201702"  
    ], 
    [ 
     "test2",// there are values 
     "201702" 
    ] 
} 

ここでは、列は常に動的です.iは、挿入クエリを適切に作成する必要があります。いくつかの手助けのデータをテーブルに挿入する方法を教えてください。Handsontable JsonアレイをOracleテーブルに挿入する方法(バルク)

+0

カラムが常に「常に動的」な場合は、毎回異なるテーブルが必要になることがあります。それはあなたが念頭に置いていることですか?このデータを読み込んだら、このデータで何をするつもりですか?なぜJSONのドキュメントをCLOBとして保存しないのですか? – APC

+0

列名に基づいて私はテーブルに挿入クエリを構築する必要があります。私は同じテーブルに挿入されますが、ユーザーが1つだけの列の負荷を選択する場合はあまり適切ではありません。私のクエリは、テーブル(col_1、col2)の値( "test2"、 "201702")などに挿入するようなものです。 – Chinna

+0

テーブルは一般的なものですか?すべてのスプレッドシート用の単一のテーブル?どの行が一緒に属しているかは、どのように分かりますか?スプレッドシートの列名をどのように保存しますか? – APC

答えて

0

あなた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> 
+0

ありがとうあなたのprocを実行しようとしていますが、コンパイルエラーを出そうとしています。なぜですか? エラー:PLS-00201:識別子 'JSON_OBJECT_T'を宣言する必要があります。 行:5 テキスト:JO JSON_OBJECT_T; エラー:PL/SQL:項目が無視されました 行:5 テキスト:JO JSON_OBJECT_T; エラー:PLS-00201:識別子 'JSON_ARRAY_T'を宣言する必要があります 行:6 テキスト:DATA JSON_ARRAY_T; – Chinna

+0

申し訳ありませんが、このソリューションにはOracle 12.2.0.1.0が必要です。今回のリリースでは、PL/SQL JSONのサポートが新しくなりました。 –

0

のために働く必要があります。しかしながらまず第

有効ではありません12.1.0.2.0で動作するはずです

SQL> create or replace procedure insertFromJSON(P_ID NUMBER) 
    2 AUTHID CURRENT_USER 
    3 IS 
    8  I    PLS_INTEGER := 0; 
    9  COLUMN_LIST  VARCHAR2(32767) := ''; 
    10  COLUMN_PATTERN VARCHAR2(32767) := ''; 
    11  STATEMENT  VARCHAR2(32767) := ''; 
    12 
    13  CURSOR COL_CURSOR 
    14  is 
    15  select COLUMN_NAME 
    16  from SOURCE_DOCUMENTS, 
    17   JSON_TABLE(
    18    JSON_DOC, 
    19    '$.data[0][*]' 
    20    columns 
    21    COLUMN_NAME VARCHAR2(32) path '$' 
    22   ); 
    23 
    24 begin 
    25 
    26 for C in COL_CURSOR LOOP 
    27  COLUMN_LIST := COLUMN_LIST || ',' || '"' || c.COLUMN_NAME || '"'; 
    28  COLUMN_PATTERN := COLUMN_PATTERN || ',' || '"' || c.COLUMN_NAME || '"' || ' VARCHAR2(32) PATH '' $[' || i || ' 
'''; 
    29  i := i + 1; 
    30 end loop; 
    31 
    32 COLUMN_LIST := SUBSTR(COLUMN_LIST,2); 
    33 COLUMN_PATTERN := SUBSTR(COLUMN_PATTERN,2); 
    34 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'; 
    35 DBMS_OUTPUT.put_line('Statement = ' || STATEMENT); 
    36 EXECUTE IMMEDIATE STATEMENT; 
    37 end; 
    38/

Procedure created. 

SQL> drop table TEST 
    2/

Table dropped. 

SQL> call insertFromJSON(1) 
    2/

Call completed. 

SQL> commit 
    2/

Commit complete. 

SQL> select * 
    2 from TEST 
    3/

col_1       col_2 
-------------------------------- -------------------------------- 
test2       201702 
test2       201702 
関連する問題