VARCHARまたはCLOBとして表わされる既存のCSVデータを、データベースの既存のリレーショナル テーブルにインポートすることができます。これは「シュレッディング」と呼ばれ、DATASET_TABLEテーブル演算子を使用します。
例: CSVデータのデータベース テーブルへのシュレッディング
CreateDATASETを使用して、CSVデータをCSV格納形式のDATASET値に変換します。CSVデータが標準のCSV形式に従わない場合(例えば、異なる列またはレコードの区切り記号がある場合)、スキーマを指定します。次にDATASET_TABLEはCSVデータをデータベース テーブルにシュレッディングします。DATASET_TABLEを使用して、'column_expression_literal' USING仕様を使用してCSV値で各列データ型を指定します。
CREATE TABLE empTableFromCSV( empID INTEGER, empName VARCHAR(20), empSalary INTEGER);
例: CSV列とテーブル列の位置合わせ
*+csv11.txt+* empID,empName,empSalary 1,John,100000 2,Sam,50000 3,Mary,75000 .import vartext file csv11.txt USING (c1 VARCHAR(1000)) INSERT INTO empTableFromCSV SELECT * FROM DATASET_TABLE ( ON (SELECT CreateDATASET(NULL, :c1, CSV)) USING rowexpr('') colexpr( '[ {"dotnotation" : "$..empID", "type" : "INTEGER"}, {"dotnotation" : "$..empName", "type" : "VARCHAR(20)"} , {"dotnotation" : "$..empSalary", "type" : "INTEGER"} ]') ) AS Emp(empID, empName, empSalary); SELECT * FROM empTableFromCSV ORDER BY 1;
結果のテーブルには次の3つの行があります。
empID | empName | empSalary |
---|---|---|
1 | John | 100000 |
2 | Sam | 50000 |
3 | Mary | 75000 |
例: CSV列とテーブル名は同じであるが、位置合わせされない
*+csv12.txt+* empID,empSalary,empName 4,100000,Kate 5,50000,Rob 6,75000,Peter
CSV列とテーブル名を位置合わせする手順:
.import vartext file csv12.txt USING (c1 VARCHAR(1000)) INSERT INTO empTableFromCSV(empID,empSalary,empName) SELECT * FROM DATASET_TABLE ( ON (SELECT CreateDATASET(NULL, :c1, CSV)) USING rowexpr('') colexpr( '[ {"dotnotation" : "$..empID", "type" : "INTEGER"}, {"dotnotation" : "$..empSalary", "type" : "INTEGER"} , {"dotnotation" : "$..empName", "type" : "VARCHAR(20)"} ]') ) AS Emp(empID, empSalary, empName);
例: スキーマをCreateDATASETに渡す
この例では、CSVにはヘッダーはありませんが、値はターゲット テーブルに完全に位置合わせされます。スキーマをCreateDATASET関数に渡して、CSV値にヘッダー行がないことを示すことができます。
*+csv13.txt+* 7,Matt,100000 8,Mark,50000 9,Luke,75000 .import vartext file csv13.txt USING (c1 VARCHAR(1000)) INSERT INTO empTableFromCSV SELECT * FROM DATASET_TABLE ( ON (SELECT CreateDATASET('{"field_names":NULL}':c1, CSV)) USING rowexpr('') colexpr( '[ {"dotnotation" : "$..empID", "type" : "INTEGER"}, {"dotnotation" : "$..empName", "type" : "VARCHAR(20)"} , {"dotnotation" : "$..empSalary", "type" : "INTEGER"} ]') ) AS Emp(empID, empName, empSalary);
例: テーブル内のすべての従業員を返す
SELECT * FROM empTableFromCSV ORDER BY 1;
empID | empName | empSalary |
---|---|---|
1 | John | 100000 |
2 | Sam | 50000 |
3 | Mary | 75000 |
4 | Kate | 100000 |
5 | Rob | 50000 |
6 | Peter | 75000 |
7 | Matt | 100000 |
8 | Mark | 50000 |
9 | Luke | 75000 |