Stored procedures SQL Server存储过程的IBM DB2等效语法-部署时出错
我是IBMDB2的新手。需要将下面提到的SP转换为db2语法。但我一直在使用Db2中使用或可用的许多等价物。甚至谷歌研究也没有像我在SQLServer存储过程中所做的那样,展示如何准确地比较db2中表的对象id。有人能给我建议正确的方法吗 编辑:我已经用等效的DB2语法进行了更新,但在特定行部署时遇到以下错误,有人能确定并帮助我理解此语法的错误或过程中其他地方的问题吗 第25行:声明v_sqlstate CHAR5 BACKUPTABLE:25:发现以下意外标记。预期代币可能包括:。。SQLCODE=-104,SQLSTATE=42601,DRIVER=4.18.60 发现以下意外的令牌变量声明。预期代币可能包括:。。SQLCODE=-104,SQLSTATE=42601,DRIVER=4.18.60 SQL Server存储过程语法:Stored procedures SQL Server存储过程的IBM DB2等效语法-部署时出错,stored-procedures,db2,ibm-data-studio,Stored Procedures,Db2,Ibm Data Studio,我是IBMDB2的新手。需要将下面提到的SP转换为db2语法。但我一直在使用Db2中使用或可用的许多等价物。甚至谷歌研究也没有像我在SQLServer存储过程中所做的那样,展示如何准确地比较db2中表的对象id。有人能给我建议正确的方法吗 编辑:我已经用等效的DB2语法进行了更新,但在特定行部署时遇到以下错误,有人能确定并帮助我理解此语法的错误或过程中其他地方的问题吗 第25行:声明v_sqlstate CHAR5 BACKUPTABLE:25:发现以下意外标记。预期代币可能包括:。。SQLCO
CREATE PROCEDURE [dbo].[BackUpTable]
@TableName sysname
AS
BEGIN
SET nocount ON
DECLARE @sql VARCHAR(500)
IF EXISTS (SELECT *
FROM sys.objects
WHERE object_id = Object_id(N'[dbo].[' + @TableName+'_EST' + ']')
AND TYPE IN ( N'U' ))
BEGIN
SET @sql = 'declare @Done bit
set @Done = 0
while @Done = 0
begin
delete top (100000)
from ' + @TableName + '_Bak' +
' if @@rowcount = 0
set @Done = 1
end;'
SET @sql = @sql + 'insert into ' + @TableName + '_Bak select * from ' +
@TableName +'_EST'
EXEC(@sql)
END
ELSE
BEGIN
DECLARE @err_message VARCHAR(300)
SELECT @err_message = 'The table "' + Isnull(@TableName, 'null') +
'" does not exist'
RAISERROR (@err_message, 16, 1)
END
END
迄今为止创建的DB2语法:
CREATE OR REPLACE PROCEDURE BackUpTable (IN TableName VARCHAR(128))
DYNAMIC RESULT SETS 1
BEGIN
DECLARE dynamicSql VARCHAR(500);
IF(EXISTS(
SELECT * FROM SYSIBM.SYSTABLES
WHERE NAME = TableName||'_EST'
)
)
THEN
SET dynamicSql = 'DELETE FROM '||TableName ||'_BAK';
SET dynamicSql = dynamicSql ||'insert into ' || TableName || '_BAK select * from ' ||
TableName || '_EST';
EXECUTE IMMEDIATE dynamicSql;
ELSE
DECLARE v_sqlstate CHAR(5);
DECLARE v_sqlcode INT;
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
DECLARE SQLCODE INT DEFAULT 0;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SELECT SQLSTATE, SQLCODE
INTO v_sqlstate, v_sqlcode
FROM sysibm.sysdummy1;
SET O_Error_Msg = 'TABLE IS NOT AVAILABLE:: SQLState : '||v_sqlstate||' SQLCode : '||v_sqlcode ;
END;
END IF;
END
在z/os上,您可以执行以下操作:
IF( EXISTS( SELECT 1 FROM QSYS2.SYSTABLES WHERE TABLE_SCHEMA = 'YOURLIB' AND TABLE_NAME = 'YOURTABLENAME')) THEN
DROP TABLE YOURLIB.YOURTABLENAME;
END IF;
谢谢你的回复。我正在尝试这样的方法:IFEXISTS从SYSIBM.SYSTABLES中选择*,其中NAME=TableName