文档菜单
文档首页
/
关系型数据库迁移器
/ /

转换存储过程

本页内容

  • 关于此任务
  • 开始之前
  • 步骤
  • 示例
  • 下一步
  • 了解更多

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

  • 查询转换器使用人工智能技术,可能无法转换长或复杂的查询、触发器或存储过程。某些查询可能无法正确转换,而其他查询可能根本无法转换。

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

  • 转换后的查询、触发器、视图和存储过程将保存在您的项目中,并通过项目导入和导出持久化。

  • SQL查询限制为40,000个文本字符。

  • 您可以在左侧查看之前转换的历史记录查询转换器面板。每个转换都有一个图标表示转换结果。如果对象旁边没有图标,则尚未尝试转换

    图标
    描述
    旋转器
    转换正在执行中。
    绿色勾号
    转换成功。
    红色感叹号
    上一次尝试转换失败。
  • MongoDB没有官方的同义词对象类型用于SQL存储过程。相反,MongoDB支持自定义JavaScript和驱动代码,以承载数据库逻辑。您应用程序现代化之旅的一部分是选择最适合您应用程序需求的编程语言和承载选项。您可以将转换后的存储过程代码托管在您的应用程序或使用MongoDB App Services Functions.

  • 在将代码部署到生产环境之前,请始终审查和测试查询转换器生成的代码。

1

代码生成选项卡中,点击查询转换器面板。

2
  • 如果您是首次在项目中使用查询转换器,请点击从数据库导入

  • 如果项目中已有转换后的SQL代码,请点击左侧面板上的管理数据库对象按钮。

3
  1. 指定您源数据库的连接详情。

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

  2. 点击 连接

4
  1. 导入数据库对象 对话框中,点击 数据库 旁边的 图标。

  2. 点击您的模式旁边的 图标。

  3. 点击 存储过程 旁边的 图标。

    提示

    要切换存储过程的转换,请点击存储过程名称旁边的 图标。

  4. 点击 保存

    您的数据库模式中每个存储过程的代码被导入到项目中,并在 查询转换器 下的 存储过程 中可见。

5
  1. 存储过程 下的左侧窗格中点击一个存储过程的名称。

    代码将在 导入的存储过程 窗格中显示。

  2. 从下拉菜单中选择一个目标语言

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

    注意

    如果您使用Java,还可以选择尽可能返回领域对象。当选中时,如果查询仅操作单个MongoDB集合,查询转换器将包含基于POJO类的强类型Java实体。

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

    转换后的MongoDB代码将在转换后的MongoDB查询面板中显示。

    如果查询转换器有错误,您可以在转换后的MongoDB查询面板中查看详细信息。

  4. 点击转换后的MongoDB查询面板上的图标,将MongoDB代码复制到您的剪贴板。

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

    提示

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

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

以下示例显示了将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;
}
}

以下示例展示了将 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;
}

以下示例展示了将 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);
}

返回

转换查询