0

我是 IBM db2 的新手。需要将下面提到的 SP 转换为 db2 语法。但我被 Db2 中使用或可用的许多等价物所困扰。甚至谷歌研究也没有显示我们如何准确地比较 db2 中表的对象 ID,就像我在 SQL Server 存储过程中所做的那样。任何人都可以建议我以正确的方式进行吗?

编辑:我已经更新了等效的 DB2 语法,但是在特定行部署时遇到了以下错误,任何人都可以识别并帮助我理解这种语法有什么问题,或者问题出在过程中的其他任何地方。

第 25 行:声明 v_sqlstate CHAR(5);

BACKUPTABLE: 25: 在"<variable declaration>"" 之后发现了一个意外的令牌。预期的标记可能包括:“”.. SQLCODE=-104、SQLSTATE=42601、DRIVER=4.18.60 在“”之后发现了意外的标记变量声明。预期的标记可能包括:“”.. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.18.60

SQL Server 存储过程语法:

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
4

1 回答 1

0

在 z/os 上你可以做到:

IF( EXISTS( SELECT 1 FROM QSYS2.SYSTABLES WHERE TABLE_SCHEMA = 'YOURLIB' AND TABLE_NAME = 'YOURTABLENAME')) THEN
DROP TABLE YOURLIB.YOURTABLENAME;
END IF;
于 2017-01-11T18:05:44.270 回答