保存された手順の変換
クエリ 変換 を使用すると、SQL 保存済み手順を MongoDB コードにインポートして変換できます。 クエリ ドライバーは、SQL コードを変換する際にプロジェクトに定義されたマッピング ルールとスキーマ変換を考慮します。
このタスクについて
クエリ ドライバーはAIテクノロジーを使用しますが、長いクエリや複雑なクエリ、トリガー、または保存された手順を変換できない場合があります。 正しく変換されないクエリもあれば、まったく変換されないクエリもあります。
クエリ ドライバーは、リレーショナル スキーマ、MongoDB スキーマ、現在のプロジェクト内のマッピング ルールを使用して、クエリを変換する方法を決定します。 クエリがリレーショナル スキーマにないテーブルを参照する場合、または MongoDB コレクションにマップされていない場合、変換が失敗したり不正確になることがあります。
変換されたクエリ、trigger、ビュー、保存された手順はプロジェクトに保存され、プロジェクトのインポートおよびエクスポート後も保持されます。
SQLクエリは40 、 000テキスト文字に制限されています。
左側の [ Query Converterペインで以前の変換履歴を表示できます。 各変換には、変換の結果を示す アイコンがあります。 オブジェクトの横に アイコンがない場合、変換はまだ試行されていません。
Icon説明スピナー変換が実行中です。緑色のチェックマーク変換は成功しました。赤色の句読点前回の試行では変換は失敗しました。
始める前に
MongoDB には、SQL 保存手順の公式シノニム オブジェクトタイプはありません。 代わりに、MongoDB はデータベース ロジックをホストするカスタム JavaScript とドライバー コードをサポートしています。 アプリケーション モダナイゼーションのプロセスの一部は、アプリケーションのニーズに最も適したプログラミング言語とホスティング オプションを選択することです。 変換された保存された手順コードは、アプリケーション内または MongoDB App Services Functions を使用してホストできます。
クエリ 変換によって生成されたコードは、本番環境に配置する前に、必ず確認とテストを行ってください。
手順
リレーショナル データベースへの接続
ソース データベースへの接続の詳細を指定します。
詳細については、 「リレーショナルデータベース接続文字列」を参照してください。
[Connect] をクリックします。
変換とテスト コード
左側のペインからStored Proceduresの下の保存済み手順の名前をクリックします。
コードはImported Stored Procedureペインに表示されます。
ドロップダウンからTarget Languageを選択します。
クエリ 変換子は、 JavaScript 、 C# 、およびJavaへの保存済み手順の変換をサポートしています。
注意
Javaを使用している場合は、 Return a domain object where possible を選択することもできます。選択すると、クエリが単一のMongoDBコレクションでのみ動作する場合、クエリ 変換には POJO クラスに基づいて厳密に型指定されたJavaエンティティが含まれます。
[ Convert ] ボタンをクリックします。 クエリ ドライバーがコードを変換するまで待ちます。
変換された MongoDB コードはConverted MongoDB Queryペインに表示されます。
クエリ 変換にエラーが発生した場合は、 Converted MongoDB Queryペインで詳細を表示できます。
をクリックしますConverted MongoDB Queryペインの [] アイコンを使用して、MongoDB コードをクリップボードにコピーします。
生成された MongoDB コードをテストして検証します。
Tip
Filterテキスト ボックスを使用して、オブジェクト名と SQL 構文に基づいて、クエリ、保存済み手順、trigger、ビューをフィルタリングできます。
例
クエリ 変換は、保存された手順をJavaScript 、 C# 、またはJavaコードに変換できます。 以下の例は、各言語への変換を示しています。
JavaScript
次の例は、JavaScript に変換された MySQL 保存済みプロシージャを示しています。
BEGIN DECLARE v_rentals INT; DECLARE v_out INT; SELECT COUNT(*) INTO v_rentals FROM rental WHERE inventory_id = p_inventory_id; IF v_rentals = 0 THEN RETURN TRUE; END IF; SELECT COUNT(rental_id) INTO v_out FROM inventory LEFT JOIN rental USING(inventory_id) WHERE inventory.inventory_id = p_inventory_id AND rental.return_date IS NULL; IF v_out > 0 THEN RETURN FALSE; ELSE RETURN TRUE; END IF; END
async function query(db, p_inventory_id) { const v_rentals = await db.collection('rental').countDocuments( { inventoryId: p_inventory_id } ); if (v_rentals === 0) { return true; } const v_out = await db.collection('inventory').aggregate([ { $lookup: { from: 'rental', localField: 'inventoryId', foreignField: 'inventoryId', as: 'rentalData' } }, { $match: { inventoryId: p_inventory_id, 'rentalData.returnDate': { $exists: false } } }, { $count: 'rentalId' } ]).toArray(); if (v_out.length > 0 && v_out[0].rentalId > 0) { return false; } else { return true; } }
C#
次の例は、C# に変換された MySQL 保存済み手順を示しています。
BEGIN DECLARE v_customer_id INT; DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL; SELECT customer_id INTO v_customer_id FROM rental WHERE return_date IS NULL AND inventory_id = p_inventory_id; RETURN v_customer_id; END
async Task<int?> Query(IMongoDatabase db) { var rentalCollection = db.GetCollection<BsonDocument>("rental"); var filter = Builders<BsonDocument>.Filter.Eq("inventoryId", p_inventory_id) & Builders<BsonDocument>.Filter.Eq("returnDate", null); var result = await rentalCollection.Find(filter).FirstOrDefaultAsync(); return result != null ? result["customerId"].AsInt32 : (int?)null; }
Java
次の例は、Java に変換された MySQL 保存済み手順を示しています。
BEGIN SELECT inventory_id FROM inventory WHERE film_id = p_film_id AND store_id = p_store_id AND NOT inventory_in_stock(inventory_id); SELECT COUNT(*) FROM inventory WHERE film_id = p_film_id AND store_id = p_store_id AND NOT inventory_in_stock(inventory_id) INTO p_film_count; END
void query(MongoDatabase db) { int p_film_id = 0; int p_store_id = 0; int p_film_count = 0; MongoCollection<Document> inventoryCollection = db.getCollection("inventory"); Bson filter = Filters.and(Filters.eq("filmId", p_film_id), Filters.eq("storeId", p_store_id), Filters.not(inventory_in_stock("inventoryId"))); FindIterable<Document> result = inventoryCollection.find(filter); for (Document doc : result) { System.out.println(doc.getInteger("inventoryId")); } p_film_count = (int) inventoryCollection.countDocuments(filter); }