初めに
こんにちは。
最近「非構造化データをテーブルに突っ込みたいけど、INSERT文を手書きするのは面倒…」という悩みがチーム内で発生しました。
そこで Dify(低コードLLMオーケストレーションツール)を使って「非構造化テキスト → Oracle SQL INSERT文」をワンクリックで自動生成するワークフローを作ってみました。
今回はその構築手順を Qiita 初投稿としてまとめます。
完成イメージ
完成したワークフローは以下のような流れです。
- 長文を投げる
- テーブル定義を自動取得
- LLM が最適な INSERT 文を生成
- 実行可能な SQL が出力される
手順詳細
1. Start ノードに「query」と「table_name」を追加
Dify の Workflow エディタで「Start」ノードを開き、入力フィールドを 2 つ追加します。
| フィールド名 | 型 | 説明 |
|---|---|---|
| query | 文字列 | 挿入したい非構造化テキスト(長文 OK) |
| table_name | 文字列 | INSERT 先のテーブル名 |
文字数制限が厳しい場合があるので、query の「最大長」は大きめに設定しておくと安心です。
2. Database ツールで「Get Table Schema」を実行
続けて「Database」ツールを配置し、以下のように設定します。
- Action: Get Table Schema
-
Table Name:
{{start.table_name}}
これで実行時に動的にスキーマ情報が取得されます。
3. Table Schema を文字列化する Code ノード
LLM に渡すために、取得したスキーマをプレーンテキストに変換します。
Python コード例:
def main(schema_dict: dict) -> str:
# dict → CREATE TABLE 風文字列に整形
columns = []
for col in schema_dict.get("columns", []):
columns.append(f"{col['name']} {col['type']}")
return "CREATE TABLE " + schema_dict["name"] + "(\n " + ",\n ".join(columns) + "\n);"
4. LLM ノードで INSERT SQL を生成
最も重要な LLM ノードの設定です。
- Model: grok-3 など高機能モデルを推奨
- SYSTEM プロンプト:
## 役割
あなたはOracle SQLの専門家です。テーブル定義を正確に理解し、ユーザーの要求に基づいて適切なINSERT SQL文を生成することが役割です。
## 入力形式
- テーブル定義: ---table_definition--- セクション
- ユーザークエリ: ---query--- セクション
## 出力要件
1. 生成されたINSERT SQL文のみを出力
2. 説明文・コメントは一切出力しない
3. Oracle SQLとして文法的に正しいこと
## 処理ガイドライン
- カラム名・型・制約を正確に把握
- 非構造化テキストから必要な値を抽出
- 文字列はシングルクォート、日付は TO_DATE 等、データ型に応じた記法を使用
- 必須カラムは必ず値を設定
- 複数レコード挿入の場合は、UNION ALL 構文を使用
---
## 入力セクション
---table_definition---
{{context}}
- USER プロンプト:
### ユーザークエリ
---query---
{{start.query}}
5. 末尾の「;」を除去する Code ノード
アプリケーションによっては「;」が不要な場合があるので、簡易コードで削除します。
def main(text: str) -> dict:
return {
"result": text.rstrip(';'),
}
6. End ノードで SQL を返却
最後に End ノードを配置し、出力変数に {{code_2.result}} を指定。
動作例
まとめ
以上、Dify を使って「非構造化データ → INSERT SQL」を自動化するワークフローの紹介でした。
・ノーコードで高速にプロトタイピング
・LLM の指示をシンプルに保つことで精度向上
・スキーマ取得も動的に行えるため、テーブル変更に柔軟に対応
社内で CSV 変換ツールを作る前に、まず Dify で検証してみるとコストを大幅に削減できます。
気になる方はぜひお試しください!








