Эквивалентный синтаксис IBM DB2 для хранимой процедуры SQL Server - ошибка при развертывании

Я новичок в IBM db2.Need, чтобы преобразовать нижеупомянутый SP в синтаксис db2. Но я застрял со многими эквивалентами, используемыми или доступными в Db2. Даже исследования Google не показывают, как именно мы можем сравнивать идентификатор объекта таблиц в db2, как я делаю в хранимой процедуре 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

1 ответ

В z/os вы можете сделать это:

IF( EXISTS( SELECT 1 FROM QSYS2.SYSTABLES WHERE TABLE_SCHEMA = 'YOURLIB' AND TABLE_NAME = 'YOURTABLENAME')) THEN
DROP TABLE YOURLIB.YOURTABLENAME;
END IF;
Другие вопросы по тегам