欢迎投稿

今日深度:

Oracle与MSSQL过程之间的转化(1)

Oracle与MSSQL过程之间的转化(1)


这两天写数据库升级脚本,发现MSSQLOracle之间的转化还是比较容易的。

以下面两个过程为例。两者的功能相似。

1.MSSQL脚本

 /** 更改表名 **/
 Begin
     declare @tempPoTableName varchar(50)        --性能对象表名
    declare @tempPoSpName varchar(50)            --性能过程名
    declare @errorInfo varchar(200)             --错误信息
    declare @cnt int                            --计数器
    
     declare @tempSQL    varchar(1000)
--定义表名、同步表名和存储过程游标   
 set @tempSQL = ' declare allValues_Cursor cursor for '+CHAR(13+ CHAR(10)        
 set @tempSQL =  @tempSQL + ' select POTABLENAME,POSPNAME from PM_NEPODEF_TABLE 
   WHERE POID>110499 and POID<110580'
EXEC (@tempSQL)
OPEN allValues_Cursor
--判断是否由符合游标条件的行,如果没有则关闭和释放游标,异常返回
    IF(@@CURSOR_ROWS = 0 )
    BEGIN
        CLOSE allValues_Cursor
        DEALLOCATE allValues_Cursor
        set @errorInfo = '没有指定表名或存储过程名!'
        print @errorInfo
        return
   END    
       print '开始更改原有表名……'
    FETCH  NEXT FROM allValues_Cursor INTO @tempPoTableName,@tempPoSpName
    --根据给定的表名、存储过程名 创建相应的数据存储存储过程
    WHILE  (@@FETCH_STATUS <> -1)
    BEGIN
        print @tempPoTableName
        
        IF (EXISTS (SELECT name from sysobjects WHERE name=@tempPoTableName))
      BEGIN
       set @tempSQL = 'ALTER TABLE '+ @tempPoTableName+' DROP 
          constraint PK_'+@tempPoTableName
      EXEC (@tempSQL)
       set @tempSQL = @tempPoTableName+'_TMP'
        EXEC Sp_rename @tempPoTableName,@tempSQL
        END
        ELSE
       BEGIN
       print '没有找到表'+@tempPoTableName;
        END   
IF (EXISTS (SELECT name from sysobjects WHERE name=@tempPoSpName))
        BEGIN
        set @tempSQL = 'DROP PROCEDURE '+@tempPoSpName;
        EXEC (@tempSQL)
       END
       ELSE
        BEGIN
       print '没有找到过程'+@tempPoSpName;
        END
FETCH  NEXT FROM allValues_Cursor INTO @tempPoTableName,@tempPoSpName
    END
    CLOSE allValues_Cursor
    DEALLOCATE allValues_Cursor
    print '结束更改原有表名……'
    print '------------------------'
END
GO

2.ORACLE脚本

BEGIN
 DECLARE
    tempPoTableName varchar2(50);        --性能对象表名
    tempPoSpName varchar2(50);            --性能过程名
     errorInfo varchar2(200);             --错误信息
     tempSQL    varchar2(1000);
     cnt1   number(1);
     cnt2   number(2);
     
    --定义表名、同步表名和存储过程游标
    Cursor allValues_Cursor is
         select UPPER(TRIM(POTABLENAME)),UPPER(TRIM(POSPNAME)) from 
            PM_NEPODEF_TABLE WHERE POID>110499 and POID<110580;
    BEGIN
    OPEN allValues_Cursor;

    --判断是否由符合游标条件的行,如果没有则关闭和释放游标,异常返回
    
    DBMS_OUTPUT.PUT_LINE('开始更改原有表名……');
    FETCH  allValues_Cursor INTO tempPoTableName,tempPoSpName;
    --根据给定的表名、存储过程名 创建相应的数据存储存储过程
    WHILE allValues_Cursor%found LOOP
    
    cnt1:=0;
    cnt2:=0;
    BEGIN
        SELECT 1 INTO cnt1 FROM dual WHERE exists(SELECT table_name 
           FROM user_tables WHERE table_name = tempPoTableName);
        SELECT 1 INTO cnt2 FROM dual WHERE exists(SELECT OBJECT_NAME 
           FROM user_procedures WHERE OBJECT_NAME = tempPoSpName);
    exception
    WHEN no_data_found  THEN
        null;
    END;
    
    IF cnt1 = 1 THEN
        DBMS_OUTPUT.PUT_LINE(tempPoTableName);
        tempSQL := 'ALTER TABLE '||tempPoTableName||' DROP constraint 
           PK_'||tempPoTableName;
        EXECUTE IMMEDIATE tempSQL;
        tempSQL := 'ALTER TABLE '||tempPoTableName||' RENAME 
           TO '||tempPoTableName||'_TMP';
        EXECUTE IMMEDIATE tempSQL;
    ELSE
        DBMS_OUTPUT.PUT_LINE('没有找到表'||tempPoTableName);
    END IF;
    
    IF cnt2 = 1 THEN
        tempSQL := 'DROP PROCEDURE '||tempPoSpName;
        EXECUTE IMMEDIATE tempSQL;
    ELSE
        DBMS_OUTPUT.PUT_LINE('没有找到过程'||tempPoSpName);
    END IF;
    
        FETCH allValues_Cursor INTO tempPoTableName,tempPoSpName;
    END LOOP;
    CLOSE allValues_Cursor;
    DBMS_OUTPUT.PUT_LINE('结束更改原有表名……');
    DBMS_OUTPUT.PUT_LINE('------------------------');
    END;
END;
/


www.htsjk.Com true http://www.htsjk.com/shujukukf/17384.html NewsArticle Oracle与MSSQL过程之间的转化(1) 这两天写数据库升级脚本,发现 MSSQL 和 Oracle 之间的转化还是比较容易的。 以下面两个过程为例。两者的功能相似。 1.MSSQL 脚本 /** 更改表名 **/ Begin decl...
评论暂时关闭