Docs 菜单
Docs 主页
/
Relational Migrator
/ /

转换存储过程

在此页面上

  • 关于此任务
  • 开始之前
  • 步骤
  • 举例
  • 后续步骤
  • 了解详情

您可以使用查询转换器将 SQL 存储过程导入并转换为 MongoDB 代码。 转换 SQL 代码时,查询转换器会考虑项目中定义的映射规则和模式转换。

  • 查询转换器使用AI技术,该技术可能无法转换过长或复杂的查询、触发器或存储过程。某些查询可能无法正确转换,而另一些查询则可能根本无法转换。

  • 查询转换器使用当前项目中的关系模式、MongoDB 模式和映射规则来确定应如何转换查询。 如果查询引用的表不在关系模式中或者未映射到 MongoDB collection,则转换可能会失败或不正确。

  • 转换的查询、Atlas Triggers、视图和存储过程保存在项目中,并在项目导入和导出过程中持续存在。

  • SQL查询仅限于40 , 000文本字符。

  • 您可以在左侧 Query Converter窗格中查看以前转换的历史记录。 每次转换都有一个指示转换结果的图标。 如果对象旁边没有 图标,则尚未尝试转换:

    Icon
    说明
    转圈
    现在正在执行转换。
    绿色复选标记
    转换成功。
    红色感叹号
    上次转换尝试失败。
  • MongoDB 没有针对 SQL 存储过程的官方同义词对象类型。相反,MongoDB 支持托管数据库逻辑的自定义 JavaScript 和驱动程序代码。选择最能满足应用程序需求的编程语言和托管选项是应用程序现代化之旅的一部分。您可以在应用程序中托管转换的存储过程代码,也可以使用 MongoDB App Services Functions 托管。

  • 在将查询转换器部署到生产环境之前,请务必检查并测试查询转换器生成的代码。

1

Code Generation标签页中,单击Query Converter窗格。

2
  • 如果这是您第一次在项目中使用查询转换器,请单击Import From Database

  • 如果您的项目已经转换了 SQL 代码,请单击左侧窗格中的Manage Database Objects按钮。

3
  1. 指定源数据库的连接详细信息。

    有关详细信息,请参阅关系数据库连接字符串。

  2. 单击 Connect(连接)。

4
  1. Import Database Objects模式中,单击Database旁边的图标。

  2. 单击模式旁边的图标。

  3. 单击Stored Procedures旁边的图标。

    提示

    要切换存储过程以进行转换,请单击存储过程名称旁边的图标。

  4. 单击 Save(连接)。

    数据库模式中每个存储过程的代码都将导入到您的项目中,并显示在Stored Procedures下的Query Converter窗格中。

5
  1. 单击左侧窗格中Stored Procedures下的存储过程名称。

    代码显示在Imported Stored Procedure窗格中。

  2. 从下拉列表中选择Target Language

    查询转换器支持将存储过程转换为 Javascript、C# 和 Java。

  3. 单击Convert按钮。 等待查询转换器转换您的代码。

    转换后的 MongoDB 代码会显示在Converted MongoDB Query窗格中。

    如果查询转换器出现错误,您可以在 Converted MongoDB Query 窗格中查看详细信息。

  4. 单击 Converted MongoDB Query图标,将MongoDB代码复制到剪贴板。

  5. 测试并验证生成的 MongoDB 代码。

    提示

    您可以使用Filter文本框,根据对象名称和 SQL 语法筛选查询、存储过程、触发器和视图。

查询转换器可以将存储过程转换为 Javascript、C# 或 Java 代码。 以下示例显示了每种语言的转换。

以下示例显示了转换为 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# 的 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 的 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);
}

后退

转换查询