0

私は IBM db2 の初心者です。下記の SP を db2 構文に変換する必要があります。しかし、私はDb2で使用または利用可能な多くの同等物にこだわっています。Google の調査でさえ、SQL Server ストアド プロシージャで行っているように、db2 でテーブルのオブジェクト ID を正確に比較できることを示していません。誰かが私に正しい進め方を提案してもらえますか?

編集: 同等の DB2 構文で更新しましたが、特定の行でデプロイ中に以下のエラーに直面しています。誰かがこの構文の何が問題なのかを特定して理解するのを手伝ってくれますか、または問題が手順の他の場所にあります。

25行目: DECLARE 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