转换存储过程
您可以使用查询转换器将 SQL 存储过程导入并转换为 MongoDB 代码。 转换 SQL 代码时,查询转换器会考虑项目中定义的映射规则和模式转换。
关于此任务
查询转换器使用AI技术,该技术可能无法转换过长或复杂的查询、触发器或存储过程。 某些查询可能无法正确转换,而另一些查询则可能根本无法转换。
查询转换器使用当前项目中的关系模式、MongoDB 模式和映射规则来确定应如何转换查询。 如果查询引用的表不在关系模式中或者未映射到 MongoDB collection,则转换可能会失败或不正确。
转换的查询、Atlas Triggers、视图和存储过程保存在项目中,并在项目导入和导出过程中持续存在。
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。
单击Convert按钮。 等待查询转换器转换您的代码。
转换后的 MongoDB 代码会显示在Converted MongoDB Query窗格中。
如果查询转换器出现错误,您可以在 Converted MongoDB Query 窗格中查看详细信息。
单击 Converted MongoDB Query图标,将MongoDB代码复制到剪贴板。
测试并验证生成的 MongoDB 代码。
提示
您可以使用Filter文本框,根据对象名称和 SQL 语法筛选查询、存储过程、触发器和视图。
示例
查询转换器可以将存储过程转换为 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); }