【问题标题】:JAVA call Stored Procedure with a delete and insert statement带有删除和插入语句的 JAVA 调用存储过程
【发布时间】:2013-09-25 16:12:19
【问题描述】:

我的 SP 确实包含一个 DELETE 和一个 INSERT INTO 语句。如果 DELETE 语句成功,而 INSERT INTO 不成功,JAVA 将只查看第一条语句并得出整个 SP 执行成功的结论,这可能是错误的。

如果只有一个语句失败,我如何执行多于一个语句并在 JAVA 中获得异常。 我在 SQL 中尝试过使用 TRY-CATCH,但所有的结论都是因为第一个语句成功,所以所有语句都正确执行了。

这是一个 MS SQL 2008 数据库

ALTER PROCEDURE [testing] 
    @bikes  varchar(8000), 
    @groupw varchar(4), 
    @name char(6)

AS
BEGIN


        DELETE CP_customer_kngr_corr_s WHERE knid in ('blue')

        DECLARE @pos INT
        DECLARE @len INT
        DECLARE @value varchar(8000)

        set @pos = 0
        set @len = 0
        set @bikes= @bikes  +','

        WHILE CHARINDEX(',', @bikes, @pos)>0 BEGIN
            set @len = CHARINDEX(',', @bikes, @pos+1) - @pos
            set @value = SUBSTRING(@bikes, @pos, @len)

            INSERT INTO [bikes]
               ([bikes])
            VALUES
                (@value)

            set @pos = CHARINDEX(',', @bikes, @pos+@len) +1
        END 
END

【问题讨论】:

  • "JAVA 只会看第一条语句就得出整个SP执行成功的结论"是什么意思?您可能误解了结果。请说明您如何从 Java 调用该过程,以及您如何得出仅执行第一条语句的结论。您可能需要在存储过程中添加SET NOCOUNT ON,或者您需要遍历返回给 JDBC 驱动程序的所有结果。

标签: java tsql stored-procedures resultset


【解决方案1】:

如果删除的行数为零,您可以获得删除行数并引发错误,对于插入语句,您可以使用 try/catch 并在 catch 块中引发错误。

//Perform delete
select @@ROWCOUNT

if @@ROWCOUNT = 0
  //RAISE ERROR

BEGIN TRY
 //perform insert here 
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;

SELECT @ErrorMessage = ERROR_MESSAGE(),
       @ErrorSeverity = ERROR_SEVERITY(),
       @ErrorState = ERROR_STATE();

-- Use RAISERROR inside the CATCH block to return 
-- error information about the original error that 
-- caused execution to jump to the CATCH block.
RAISERROR (@ErrorMessage, -- Message text.
           @ErrorSeverity, -- Severity.
           @ErrorState -- State.
           );

END CATCH;

还要检查ERROR_STATE 返回的错误状态,然后再将其作为值传递给RAISERROR 的状态参数

干杯!!

【讨论】:

  • 当我按照您的建议进行操作时,如果我在 SQL 服务器上调用 SP,它会按原样工作。它返回一个带有“错误”或“成功”的表。但是我的 JAVA 说它不返回结果集,因为它是由第一个 DELETE 语句返回的。
  • com.microsoft.sqlserver.jdbc.SQLServerException: 语句没有返回结果集。
  • 底层错误信息是什么,删除或插入是否有任何失败??
  • Sachin Thapa,您的解决方案适用于 DELETE 语句,因为这在大多数情况下都是正确的。我的问题也是 SET NOCOUNT ON;未设置。
【解决方案2】:

这是什么数据库?在大多数数据库中,您可以在操作失败时执行 RAISEERROR。这将导致抛出 JDBCException。

您可以通过检查@@rowcount 来检查插入是否成功。如果影响的行数为零,您可能需要抛出异常。

http://technet.microsoft.com/en-us/library/ms187316.aspx

【讨论】:

  • 这是一个 MS SQL 2008 数据库。我知道 RAISEERRROR 在这个愿景中起作用。但是您将如何重写 SP?
  • 您可能想使用@@rowcount 来跟踪插入是否成功。
【解决方案3】:

我的 SP 中的问题是 SET NOCOUNT ON; 未设置。在那里它返回删除是成功的,而不是 SELECT 语句。

这是最终结果。

ALTER PROCEDURE [testing] 
    @bikes  varchar(8000), 
    @groupw varchar(4), 
    @name char(6)

AS
BEGIN
    SET NOCOUNT ON;

        DELETE CP_customer_kngr_corr_s WHERE knid in ('blue')

        DECLARE @pos INT
        DECLARE @len INT
        DECLARE @value varchar(8000)

        set @pos = 0
        set @len = 0
        set @bikes= @bikes  +','

        WHILE CHARINDEX(',', @bikes, @pos)>0 BEGIN
            set @len = CHARINDEX(',', @bikes, @pos+1) - @pos
            set @value = SUBSTRING(@bikes, @pos, @len)

            INSERT INTO [bikes]
               ([bikes])
            VALUES
                (@value)

            set @pos = CHARINDEX(',', @bikes, @pos+@len) +1
        END 
END

【讨论】:

    猜你喜欢
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2018-06-14
    • 2014-06-23
    • 1970-01-01
    相关资源
    最近更新 更多