mysql - 我正在尝试将 MS SQL Server 存储过程转换为 MySQL
问题描述
我在 MSSQL 中有以下存储过程
USE [db_DEV]
GO
/****** Object: StoredProcedure [dbo].[DeleteInvoice] Script Date: 11-02-2021 15:29:39 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
CREATE PROCEDURE [dbo].[DeleteInvoice]
@InvoiceNo AS VARCHAR(50),
@ResultOutput BIT OUTPUT
AS
DECLARE @InvoiceId UNIQUEIDENTIFIER
DECLARE @PayrollId UNIQUEIDENTIFIER
DECLARE @CustomerId UNIQUEIDENTIFIER
DECLARE @Result AS BIT
DECLARE @TransactionTypeId AS INT
DECLARE @InvoiceStatus AS INT
BEGIN
SET XACT_ABORT ON
BEGIN TRY
SELECT @InvoiceId = Id, @CustomerId = CustomerId, @TransactionTypeId = TransactionTypeId, @InvoiceStatus = [Status] FROM Invoice WHERE InvoiceNo=@InvoiceNo;
/* Check if an invoice is in Open, In Review or Pending Approval status and if it's not of payment type */
IF (@InvoiceStatus = 1 OR @InvoiceStatus = 2 OR @InvoiceStatus = 3) AND (@TransactionTypeId < 6)
BEGIN
BEGIN TRAN
SELECT @PayrollId = Id FROM Payroll WHERE InvoiceId = @InvoiceId;
/* Check if an invoice is a payroll */
IF @TransactionTypeId = 1
BEGIN
DELETE FROM PayrollItemFee WHERE PayrollItemId IN (SELECT Id from PayrollItem WITH (NOLOCK) WHERE PayrollId = @PayrollId);
DELETE FROM PayrollItemBenefits WHERE PayrollItemId IN (SELECT Id from PayrollItem WITH (NOLOCK) WHERE PayrollId = @PayrollId);
DELETE FROM PayrollChangeItem WHERE PayrollId = @PayrollId;
DELETE FROM PayrollItem WHERE PayrollId = @PayrollId;
DELETE FROM PayrollFee WHERE PayrollId = @PayrollId;
DELETE FROM Payroll WHERE Id = @PayrollId;
DELETE FROM Activity WHERE CustomerId = @CustomerId AND [DATA] = 'New Payroll invoice added ' + @InvoiceNo
END
DELETE FROM TransactionHistory WHERE RecordId = @InvoiceId
DELETE FROM OpenTask WHERE RelatedEntityId = @InvoiceId
DELETE FROM InvoiceDocument WHERE InvoiceId = @InvoiceId;
DELETE FROM InvoiceNote WHERE InvoiceId = @InvoiceId;
DELETE FROM InvoiceRelated WHERE InvoiceId = @InvoiceId;
DELETE FROM InvoiceRelated WHERE RelatedInvoiceId = @InvoiceId;
DELETE FROM InvoiceItem WHERE InvoiceId = @InvoiceId;
DELETE FROM Invoice WHERE Id = @InvoiceId;
SET @Result=1
COMMIT TRAN
END
ELSE
SET @Result = 0
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN
PRINT(ERROR_MESSAGE())
SET @Result=0
END
END CATCH
SELECT @Result AS ResultOutput
END
GO
我试图将其转换为 MySQL
USE db_DEV;
DELIMITER //
CREATE PROCEDURE DeleteInvoice (
InvoiceNo VARCHAR(50),
OUT ResultOutput TINYINT )
BEGIN
DECLARE InvoiceId CHAR(36);
DECLARE PayrollId CHAR(36);
DECLARE CustomerId CHAR(36);
DECLARE Result TINYINT;
DECLARE TransactionTypeId INT;
DECLARE InvoiceStatus INT;
BEGIN
SET XACT_ABORT ON
BEGIN TRY
SELECT Id, CustomerId, TransactionTypeId, Status INTO InvoiceId, CustomerId, TransactionTypeId, InvoiceStatus FROM Invoice WHERE InvoiceNo=InvoiceNo;
IF (InvoiceStatus = 1 OR InvoiceStatus = 2 OR InvoiceStatus = 3) AND (TransactionTypeId < 6)
THEN
START TRANSACTION;
SELECT Id INTO PayrollId FROM Payroll WHERE InvoiceId = InvoiceId;
IF TransactionTypeId = 1
THEN
DELETE FROM PayrollItemFee WHERE PayrollItemId IN (SELECT Id from PayrollItem WITH; (NOLOCK) WHERE PayrollId = PayrollId);
DELETE FROM PayrollItemBenefits WHERE PayrollItemId IN (SELECT Id from PayrollItem WITH; (NOLOCK) WHERE PayrollId = PayrollId);
DELETE FROM PayrollChangeItem WHERE PayrollId = PayrollId;
DELETE FROM PayrollItem WHERE PayrollId = PayrollId;
DELETE FROM PayrollFee WHERE PayrollId = PayrollId;
DELETE FROM Payroll WHERE Id = PayrollId;
DELETE FROM Activity WHERE CustomerId = v_CustomerId AND `DATA` = CONCAT('New Payroll invoice added ' , p_InvoiceNo);
END IF;
DELETE FROM TransactionHistory WHERE RecordId = InvoiceId;
DELETE FROM OpenTask WHERE RelatedEntityId = InvoiceId;
DELETE FROM InvoiceDocument WHERE InvoiceId = InvoiceId;
DELETE FROM InvoiceNote WHERE InvoiceId = InvoiceId;
DELETE FROM InvoiceRelated WHERE InvoiceId = InvoiceId;
DELETE FROM InvoiceRelated WHERE RelatedInvoiceId = InvoiceId;
DELETE FROM InvoiceItem WHERE InvoiceId = InvoiceId;
DELETE FROM Invoice WHERE Id = InvoiceId;
SET Result=1;
COMMIT ;
ELSE
SET Result = 0;
END IF;
END; TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
THEN
ROLLBACK;
SET Result=0;
END IF;
END; CATCH
SELECT Result AS ResultOutput;
END//
//
DELIMITER ;
但我收到以下错误。
错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 14 行的“ON BEGIN TRY SELECT Id, CustomerId, TransactionTypeId, Status INTO”附近使用正确的语法
我怀疑该错误是否与使用
SET XACT_ABORT ON
在使用 EXIT HANDLER 转换 TRY CATCH 时也需要一些帮助
我对数据库比较陌生,我正在尝试在没有我们数据库团队帮助的情况下完成这项工作。有人可以指导我在这里做错什么吗?
解决方案
推荐阅读
- python - 为什么我不断收到“Cars() 没有参数”?
- ansible - 使用 Ansible 时如何操作数组中的每个项目
- apache-spark - spark可以忽略由于帐户数据问题导致的任务失败并继续其他帐户的作业流程吗?
- python - 使用输入功能后如何循环索引?
- mongodb - 按字段值删除 [MEAN]
- android - 在 Android Studio 中更新交换机上的蓝牙状态
- stack - “窥视”先前放入 yypush_buffer_state 的缓冲区?
- c++ - 拆分字符串输入并查找字符是否有效
- printing - 打印时删除水晶报表中的背景图片
- go - 使用 Golang http 服务器验证 SSL 错误?