转换存储过程
您可以使用查询转换器将SQL存储过程导入并转换为MongoDB代码。查询转换器在转换SQL代码时会考虑您项目中定义的映射规则和模式转换。
关于此任务
查询转换器使用人工智能技术,可能无法转换长或复杂的查询、触发器或存储过程。某些查询可能无法正确转换,而其他查询可能根本无法转换。
查询转换器使用您当前项目中的关系模式、MongoDB模式和映射规则来确定查询应该如何转换。如果查询引用的表不在您的关系模式中或未映射到MongoDB集合,则转换可能会失败或出现错误。
转换后的查询、触发器、视图和存储过程将保存在您的项目中,并通过项目导入和导出持久化。
SQL查询限制为40,000个文本字符。
您可以在左侧查看之前转换的历史记录查询转换器面板。每个转换都有一个图标表示转换结果。如果对象旁边没有图标,则尚未尝试转换
图标描述旋转器转换正在执行中。绿色勾号转换成功。红色感叹号上一次尝试转换失败。
开始之前
MongoDB没有官方的同义词对象类型用于SQL存储过程。相反,MongoDB支持自定义JavaScript和驱动代码,以承载数据库逻辑。您应用程序现代化之旅的一部分是选择最适合您应用程序需求的编程语言和承载选项。您可以将转换后的存储过程代码托管在您的应用程序或使用MongoDB App Services Functions.
在将代码部署到生产环境之前,请始终审查和测试查询转换器生成的代码。
步骤
连接到您的关系数据库
指定您源数据库的连接详情。
有关详细信息,请参阅关系数据库连接字符串.
点击 连接。
转换和测试代码
在 存储过程 下的左侧窗格中点击一个存储过程的名称。
代码将在 导入的存储过程 窗格中显示。
从下拉菜单中选择一个目标语言。
查询转换器支持将存储过程转换为JavaScript、C#和Java。
注意
如果您使用Java,还可以选择尽可能返回领域对象。当选中时,如果查询仅操作单个MongoDB集合,查询转换器将包含基于POJO类的强类型Java实体。
点击转换按钮。等待查询转换器转换您的代码。
转换后的MongoDB代码将在转换后的MongoDB查询面板中显示。
如果查询转换器有错误,您可以在转换后的MongoDB查询面板中查看详细信息。
点击转换后的MongoDB查询面板上的图标,将MongoDB代码复制到您的剪贴板。
测试和验证生成的MongoDB代码。
提示
您可以使用过滤文本框根据对象名称和SQL语法过滤查询、存储过程、触发器和视图。
示例
查询转换器可以将您的存储过程转换为JavaScript、C#或Java代码。下面的示例显示了每种语言的转换。
JavaScript
以下示例显示了将MySQL存储过程转换为JavaScript的示例
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#
以下示例展示了将 MySQL 存储过程转换为 C# 的示例
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
以下示例展示了将 MySQL 存储过程转换为 Java 的示例
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); }