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 |