exec sql whenever作用范围可以跨函数吗?
我在pro*c程序的时候出现上边一个已经注释掉的EXECSQLWHENEVERNOTFOUNDDOBREAK;语句和下边的EXECSQLSELECTCOUNT(*)INT...
我在pro*c程序的时候出现上边一个已经注释掉的EXEC SQL WHENEVER NOT FOUND DO BREAK;语句和下边的EXEC SQL SELECT COUNT(*) INTO :count FROM TABLES;
系统编译的时候就会报下边的这行代码错误,当我把上边的WHENEVER语句去除的时候,错误就消失了,请问大神,这是什么原因。 展开
系统编译的时候就会报下边的这行代码错误,当我把上边的WHENEVER语句去除的时候,错误就消失了,请问大神,这是什么原因。 展开
1个回答
推荐于2016-03-19
展开全部
DROP FUNCTION dbo.NumAdd
GO
CREATE FUNCTION dbo.NumAdd
( @A SMALLINT,
@B SMALLINT
)
RETURNS INT
AS
BEGIN
DECLARE @Ret INT
SET @Ret = ISNULL(@A,0) + ISNULL(@B,0)
RETURN @Ret
END
你可以使用这样的方式调用函数并得到返回值:
DECLARE @M INT
SET @M = dbo.NumAdd(500,700)
select @M
现在,把这个函数修改成第一种使用存储过程的方式:
DROP Procedure dbo.NumAdd1
GO
CREATE Procedure dbo.NumAdd1
( @A SMALLINT,
@B SMALLINT,
@Ret INT OUTPUT
)
AS
BEGIN
SET @Ret = ISNULL(@A,0) + ISNULL(@B,0)
END
GO
那么,你就可以通过下列的方法调用这个实际和函数dbo.NumAdd功能相同的存储过程:
DECLARE @M1 INT
EXEC dbo.NumAdd1 500,600,@M1 OUTPUT
SELECT @M1
这种方法是对标量函数较好的处理方法,而且,一个存储过程可以使用一个或者多个带有OUTPUT的参数来返回值。
再看第二种方法修改为存储过程的方式:
DROP Procedure dbo.NumAdd2
GO
CREATE Procedure dbo.NumAdd2
( @A SMALLINT,
@B SMALLINT
)
AS
BEGIN
DECLARE @Ret INT
SET @Ret = ISNULL(@A,0) + ISNULL(@B,0)
SELECT @Ret
END
GO
这样,你就可以使用下面的方法来调用:
DECLARE @M2 INT
CREATE TABLE #Temp (Result INT)
INSERT #Temp EXEC dbo.NumAdd2 800,600
SELECT TOP 1 @M2 = Result FROM #Temp
DROP TABLE #Temp
SELECT @M2
列出的这两种方法都是把函数改成存储过程的方法,而且在存储过程中可以使用EXEC、PRINT等函数中不能使用的内容。
GO
CREATE FUNCTION dbo.NumAdd
( @A SMALLINT,
@B SMALLINT
)
RETURNS INT
AS
BEGIN
DECLARE @Ret INT
SET @Ret = ISNULL(@A,0) + ISNULL(@B,0)
RETURN @Ret
END
你可以使用这样的方式调用函数并得到返回值:
DECLARE @M INT
SET @M = dbo.NumAdd(500,700)
select @M
现在,把这个函数修改成第一种使用存储过程的方式:
DROP Procedure dbo.NumAdd1
GO
CREATE Procedure dbo.NumAdd1
( @A SMALLINT,
@B SMALLINT,
@Ret INT OUTPUT
)
AS
BEGIN
SET @Ret = ISNULL(@A,0) + ISNULL(@B,0)
END
GO
那么,你就可以通过下列的方法调用这个实际和函数dbo.NumAdd功能相同的存储过程:
DECLARE @M1 INT
EXEC dbo.NumAdd1 500,600,@M1 OUTPUT
SELECT @M1
这种方法是对标量函数较好的处理方法,而且,一个存储过程可以使用一个或者多个带有OUTPUT的参数来返回值。
再看第二种方法修改为存储过程的方式:
DROP Procedure dbo.NumAdd2
GO
CREATE Procedure dbo.NumAdd2
( @A SMALLINT,
@B SMALLINT
)
AS
BEGIN
DECLARE @Ret INT
SET @Ret = ISNULL(@A,0) + ISNULL(@B,0)
SELECT @Ret
END
GO
这样,你就可以使用下面的方法来调用:
DECLARE @M2 INT
CREATE TABLE #Temp (Result INT)
INSERT #Temp EXEC dbo.NumAdd2 800,600
SELECT TOP 1 @M2 = Result FROM #Temp
DROP TABLE #Temp
SELECT @M2
列出的这两种方法都是把函数改成存储过程的方法,而且在存储过程中可以使用EXEC、PRINT等函数中不能使用的内容。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询