数据库迁移mssql to pgsql之函数转换

简介: 数据库迁移mssql to pgsql之函数转换

将MS SQL数据库中的存储过程转换为PG SQL的函数,我编了一段代码,将大部分区别转换了一下,之后再手工整理,还是能快一些。

当然也可以使用一些工具来处理这一问题。

下面是一段VB.NET代码,仅供参考。

Private Sub MakeFunc(ByVal FNname As String, ByVal Gc As Integer)
'转换过程
Dim BjStr As String = ""    '代码行
Try
    Dim dtdsql As String = ""
    Dim dqtext As String = ""
    Dim nexttext As String = ""
    Dim nextnext As String = ""
    Dim utext As String = ""
    Dim intotext As String = ""
    Dim fulltext As String = ""
    Dim dqas As Integer = 0
    BjStr += "--" & FNname & vbCrLf
    Dim dtd As New DataTable
    dtdsql = "exec sys.sp_helptext '" & FNname & "'"
    dtd = hyDB.DtRead(dtdsql).Tables(0)
    For L As Integer = 0 To dtd.Rows.Count - 1
        fulltext += dtd.Rows(L).Item("text")
    Next
    fulltext = ""
    fulltext = Nothing
    Dim dtp As New DataTable    '获取参数
    dtp = hyDB.DtRead("EXEC DBO.GETPT '" & FNname & "'").Tables(0)
    Dim pt(15, 1) As String
    For C As Integer = 0 To 15
        pt(C, 0) = ""
    Next
    If Not IsNothing(dtp) Then
        If dtp.Rows.Count > 0 Then
            If Gc = 0 Then
                For C As Integer = 0 To dtp.Rows.Count - 1
                    If dtp.Rows(C).Item("ParamType") = "OUTPUT" Then
                        dtp.Rows(C).Delete()
                    End If
                Next
            End If
            dtp.AcceptChanges()
            For C As Integer = 0 To dtp.Rows.Count - 1
                pt(C, 0) = dtp.Rows(C).Item("ParamName")
                pt(C, 1) = "$" & (C + 1).ToString.Trim
            Next
        End If
    End If
    For L As Integer = 0 To dtd.Rows.Count - 1
        dqtext = UCase(dtd.Rows(L).Item("text"))
        If L < dtd.Rows.Count - 1 Then
            nexttext = dtd.Rows(L + 1).Item("text")
        Else
            nexttext = ""
        End If
        If L < dtd.Rows.Count - 2 Then
            nextnext = dtd.Rows(L + 2).Item("text")
        Else
            nextnext = ""
        End If
        dqtext = Replace(dqtext, "  ", " ")
        dqtext = Replace(dqtext, "  ", " ")
        dqtext = Replace(dqtext, "  ", " ")
        dqtext = Replace(dqtext, "  ", " ")
        dqtext = Replace(dqtext, "[", "")
        dqtext = Replace(dqtext, "]", "")
        utext = dqtext
        If InStr(utext, "BEGIN CATCH") > 0 Then
            Exit For
        End If
        If UCase(Strings.Left(utext, 2)) = "GO" Then
            Continue For
        End If
        If Trim(dqtext) = vbCrLf Then
            Continue For
        End If
        If InStr(utext, "NOCOUNT") > 0 Then
            Continue For
        End If
        If InStr(utext, "BEGIN TRY") > 0 Then
            Continue For
        End If
        If InStr(utext, "TRANS") > 0 Then
            Continue For
        End If
        If InStr(utext, "COMMIT") > 0 Then
            Continue For
        End If
        If InStr(utext, "END TRY") > 0 Then
            Continue For
        End If
        If InStr(utext, "DEALLOCATE") > 0 Then
            Continue For
        End If
        If InStr(utext, "FETCH ") > 0 Then
            Continue For
        End If
        If InStr(dqtext, "ErrorLogID ") > 0 Then
            Continue For
        End If
        If InStr(utext, "BEGIN") > 0 And InStr(utext, "CASE") <= 0 Then
            Continue For
        End If
        If InStr(utext, "CREATE") > 0 Then
            dqtext = Replace(dqtext, "[", "")
            dqtext = Replace(dqtext, "]", "")
            dqtext = Replace(dqtext, "PROCEDURE", "FUNCTION")
        End If
        If InStr(utext, "AS") > 0 And dqas = 0 Then
            dqas = L
            dqtext = " RETURNS VARCHAR" & vbCrLf & dqtext
            dqtext = Replace(dqtext, "AS", " AS $$ ") & vbCrLf & vbCrLf
            dqtext += "-- ===========================================================================" & vbCrLf
            dqtext += "-- Author: " & vbCrLf
            dqtext += "-- Create date: " & Format(Now, "yyyy-MM-dd") & vbCrLf
            dqtext += "-- Description:  " & vbCrLf
            dqtext += "-- ===========================================================================" & vbCrLf
            dqtext += "DECLARE " & vbCrLf
            'dqtext += vbTab & "ssmsg text;ssdet text;sstname text;sshint text;ssctt text; --错误处理 " & vbCrLf
            dqtext += vbTab & "--RD RECORD;" & vbCrLf & vbCrLf
            dqtext += "BEGIN" & vbCrLf
            For C As Integer = 0 To 15
                If pt(C, 0) <> "" Then
                    BjStr = Replace(BjStr, "@", "SS")
                End If
            Next
            BjStr += dqtext
            Continue For
        End If
        If InStr(utext, "INTO") > 0 And InStr(utext, "SELECT") <= 0 And InStr(utext, "INSERT") <= 0 And
                InStr(utext, "@") > 0 And L > dqas And dqas > 0 Then
            intotext = Replace(utext, "INTO", "")
            intotext = Replace(intotext, " ", "")
            intotext = Replace(intotext, vbTab, "")
            intotext = Replace(intotext, ";", "")
            intotext = Replace(intotext, vbCrLf, "")
        End If
        If InStr(utext, "SELECT") <= 0 And InStr(utext, "INSERT") <= 0 And InStr(utext, "INTO") > 0 Then
            dqtext = Replace(dqtext, "INTO", "--INTO")
        End If
        If InStr(utext, "SELECT") > 0 And InStr(utext, "=") > 0 And InStr(utext, "@") > 0 And InStr(utext, "FROM") <= 0 Then
            dqtext = Replace(dqtext, "SELECT", "")
        End If
        '查询赋值
        If InStr(utext, "SELECT") > 0 Then
            Dim Si As Integer = 0
            Dim Fi As Integer = 0
            Si = InStr(dqtext, "SELECT")
            Fi = InStr(dqtext, "FROM")
            If Fi > 0 And InStr(utext, "=") > 0 And Fi > InStr(utext, "=") And InStr(utext, "EXISTS") <= 0 And
                InStr(utext, "@") > 0 And Fi > InStr(utext, "@") Then
                Dim fzstr As String
                fzstr = Mid(dqtext, Si + 6, Fi - Si - 6).Trim
                Dim fz() As String = Split(fzstr, ",")
                Dim fzcd As Integer = fz.Length
                Dim ly As String = ""
                Dim bl As String = ""
                For I As Integer = 0 To fzcd - 1
                    Dim dqz As String
                    dqz = fz(I)
                    If InStr(dqz, "=") > 0 Then
                        Dim xz() As String = Split(dqz, "=")
                        If xz.Length = 2 Then
                            ly += xz(1) & ","
                            bl += xz(0) & ","
                        End If
                    End If
                Next
                If ly.Length > 2 Then
                    ly = Strings.Left(ly, ly.Length - 1)
                End If
                If bl.Length > 2 Then
                    bl = Strings.Left(bl, bl.Length - 1)
                End If
                Dim fzth As String
                fzth = " " & ly & " INTO " & bl & " "
                dqtext = Replace(dqtext, fzstr, fzth)
            End If
        End If
        If InStr(utext, "END") > 0 And InStr(utext, "IF") <= 0 And InStr(utext, "CASE") <= 0 Then
            dqtext = ""
            If InStr(nexttext, "ELSE") <= 0 Then
                Dim kg As Integer = 0
                Dim jstext As String = utext
                While Strings.Left(jstext, 3) <> "END"
                    jstext = Strings.Replace(jstext, vbTab, "", 1, 1)
                    kg += 1
                    If kg > 7 Then
                        Exit While
                    End If
                End While
                If nexttext <> "" And InStr(nexttext, "CLOSE") > 0 Then
                    If kg > 2 Then
                        dqtext += Strings.StrDup(kg - 1, vbTab) & "END LOOP;" & vbCrLf
                    Else
                        dqtext += vbTab & "END LOOP;" & vbCrLf
                    End If
                Else
                    If kg > 2 Then
                        dqtext += Strings.StrDup(kg - 1, vbTab) & "END IF;" & vbCrLf
                    Else
                        dqtext += vbTab & "END IF;" & vbCrLf
                    End If
                End If
            End If
        End If
        If InStr(utext, "CHAR(13)+CHAR(10)") > 0 Then
            dqtext = Replace(dqtext, "CHAR(13)+CHAR(10)", "CHR(13)+CHR(10)")
        End If
        If InStr(utext, "UPDATE") <= 0 And InStr(utext, "IF") > 0 And InStr(utext, "IIF(") < 0 And InStr(utext, "SET") > 0 Then
            dqtext = Replace(dqtext, "SET", " THEN ")
        End If
        If InStr(utext, "IF ") <= 0 And InStr(utext, "IIF(") <= 0 And InStr(utext, "UPDATE") <= 0 And InStr(utext, "SET") > 0 Then
            dqtext = Replace(dqtext, "SET ", "")
        End If
        If InStr(utext, "IF") > 0 And InStr(utext, "END") <= 0 And InStr(utext, "IIF(") <= 0 Then
            dqtext = Replace(dqtext, vbCrLf, " THEN" & vbCrLf)
        End If
        If nexttext <> "" And InStr(utext, "IF") > 0 And InStr(utext, "IIF(") <= 0 
            And InStr(nexttext, "BEGIN") <= 0 And InStr(nexttext, ";") > 0 Then
            dtd.Rows(L + 1).Item("text") += Strings.StrDup(Tabs(utext), vbTab) & "END IF;" & vbCrLf
        End If
        If InStr(utext, "IIF(") > 0 Then
            dqtext = Replace(dqtext, "IIF(", "X9_IIF(")
        End If
        If InStr(utext, "DECLARE") > 0 Then
            If InStr(utext, "@") > 0 Then
                dqtext = Replace(dqtext, ",", ";")
            End If
            dqtext = Replace(dqtext, "DECLARE ", "")
            dqtext = Replace(dqtext, "DECLARE", "")
        End If
        If InStr(utext, "=") > 0 Then
            If (InStr(utext, "SELECT") > 0 Or InStr(utext, "SET") > 0) Then
                If InStr(utext, "WHERE") <= 0 And InStr(utext, " AND ") <= 0 And
                    InStr(utext, " OR ") <= 0 And InStr(utext, "UPDATE") <= 0 And InStr(utext, "FROM") <= 0 And
                    InStr(utext, "IF ") <= 0 And (InStr(nexttext, "FROM") <= 0 Or InStr(nexttext, "FETCH") > 0) Then
                    dqtext = Replace(dqtext, "=", ":=")
                End If
            End If
        End If
        If InStr(utext, "FORMAT(") > 0 Then
            dqtext = Replace(dqtext, "FORMAT", "TO_CHAR(")
        End If
        If InStr(utext, "CONVERT(") > 0 Then
            dqtext = Replace(dqtext, "CONVERT(", "CAST(")
        End If
        If InStr(utext, "CURSOR") > 0 And InStr(utext, "LOCAL") > 0 Then
            dqtext = Replace(dqtext, "LOCAL", "")
        End If
        If InStr(utext, "FORMAT(") > 0 Then
            dqtext = Replace(dqtext, "FORMAT", "TO_CHAR(")
        End If
        If InStr(utext, "CHARINDEX(") > 0 Then
            dqtext = Replace(dqtext, "CHARINDEX(", "position(")
        End If
        If InStr(utext, "DELETE") > 0 Then
            dqtext = Replace(dqtext, "DELETE", "DELETE FROM")
        End If
        If InStr(utext, "(MAX)") > 0 Then
            dqtext = Replace(dqtext, "(MAX)", "")
        End If
        If InStr(utext, "LEN(") > 0 Then
            dqtext = Replace(dqtext, "LEN(", "LENGTH(")
        End If
        If InStr(utext, "CONVERT(") > 0 Then
            dqtext = Replace(dqtext, "CONVERT(", "CAST(")
        End If
        Dim lstext = Replace(utext, " ", "")
        If InStr(lstext, "'+") > 0 Or InStr(lstext, "+'") > 0 Then
            dqtext = Replace(dqtext, "' +", "'+")
            dqtext = Replace(dqtext, "+ '", "+'")
            dqtext = Replace(dqtext, "'+", "'||")
            dqtext = Replace(dqtext, "+'", "||'")
        End If
        If InStr(utext, "WHILE ") > 0 Then
            Dim kg As Integer = 0
            kg = Tabs(utext)
            dqtext = ""
            dqtext += Strings.StrDup(kg, vbTab) & "LOOP" & vbCrLf
            dqtext += Strings.StrDup(kg + 2, vbTab) & "FETCH CS_DJM INTO RD;" & vbCrLf
            dqtext += Strings.StrDup(kg + 2, vbTab) & "EXIT WHEN NOT FOUND;" & vbCrLf
        End If
        dqtext = Replace(dqtext, "--", "-- ")
        dqtext = Replace(dqtext, "DECIMAL", "NUMERIC")
        dqtext = Replace(dqtext, "(16;2)", "(16,2)")
        dqtext = Replace(dqtext, "(16;4)", "(16,4)")
        dqtext = Replace(dqtext, "(18;2)", "(16,2)")
        dqtext = Replace(dqtext, "DBO.", "")
        dqtext = Replace(dqtext, "NVARCHAR", "VARCHAR")
        dqtext = Replace(dqtext, "GETDATE()", "CURRENT_DATE")
        BjStr = BjStr & dqtext
    Next
    For C As Integer = 0 To 15
        If pt(C, 0) <> "" Then
            BjStr = Replace(BjStr, pt(C, 0), pt(C, 1))
        End If
    Next
    If intotext <> "" Then
        Dim Ybbl() As String = Split(intotext, ",")
        For Y As Integer = 0 To Ybbl.Length - 1
            Dim dqbl As String = Ybbl(Y).Trim
            Dim thbl As String = ""
            If InStr(dqbl, "@") > 0 Then
                thbl = Strings.Replace(dqbl, "@", "RD.")
                BjStr = Replace(BjStr, dqbl, thbl)
            End If
        Next
    End If
    BjStr = Replace(BjStr, vbTab & vbTab, vbTab)
    BjStr = Replace(BjStr, "@", "SS")
    BjStr = BjStr.ToLower
    'BjStr += "EXCEPTION WHEN OTHERS THEN" & vbCrLf
    'BjStr += vbTab & "GET STACKED DIAGNOSTICS ssmsg = MESSAGE_TEXT,ssdet = PG_EXCEPTION_DETAIL," & vbCrLf
    'BjStr += vbTab & vbTab & "sstname = TABLE_NAME, sshint = PG_EXCEPTION_HINT, ssctt = PG_EXCEPTION_CONTEXT;" & vbCrLf
    'BjStr += vbTab & "CALL x9_jlproc(ssmsg, ssdet, sstname, sshint, ssctt); " & vbCrLf
    BjStr += "END;" & vbCrLf
    BjStr = BjStr & "$$ LANGUAGE plpgsql;" & vbCrLf
    MM1.Text += BjStr & vbCrLf
Catch ex As Exception
    MM1.Text = ""
    MessageBox.Show(ex.Message)
End Try
End Sub


相关文章
|
8月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
9月前
|
存储 运维 关系型数据库
从MySQL到云数据库,数据库迁移真的有必要吗?
本文探讨了企业在业务增长背景下,是否应从 MySQL 迁移至云数据库的决策问题。分析了 MySQL 的优势与瓶颈,对比了云数据库在存储计算分离、自动化运维、多负载支持等方面的优势,并提出判断迁移必要性的五个关键问题及实施路径,帮助企业理性决策并落地迁移方案。
|
11月前
|
人工智能 运维 关系型数据库
数据库运维:mysql 数据库迁移方法-mysqldump
本文介绍了MySQL数据库迁移的方法与技巧,重点探讨了数据量大小对迁移方式的影响。对于10GB以下的小型数据库,推荐使用mysqldump进行逻辑导出和source导入;10GB以上可考虑mydumper与myloader工具;100GB以上则建议物理迁移。文中还提供了统计数据库及表空间大小的SQL语句,并讲解了如何使用mysqldump导出存储过程、函数和数据结构。通过结合实际应用场景选择合适的工具与方法,可实现高效的数据迁移。
1599 1
|
存储 关系型数据库 数据挖掘
【瑶池数据库动手活动及话题本周精选(体验ADB、 SelectDB,参与 RDS 迁移训练营)】(4.21-4.27)
本文为 “瑶池数据库动手活动及话题精选” 系列第一期,聚焦 SelectDB 日志分析、AnalyticDB Zero-ETL 集成、RDS 迁移训练营三大实战,设积分、实物等多重奖励,同步开启话题互动。点击链接参与,每周解锁数据库实战新场景。
|
SQL Oracle 关系型数据库
用 YashanDB Migration Platform,数据库迁移不再是“高风险动作”
数据库迁移一直是企业信息化中的难题,耗时长、风险高。YashanDB Migration Platform(YMP)提供一站式解决方案,涵盖评估、改写、迁移与校验全流程。其核心能力包括SQL自动适配、智能对象迁移、高性能数据通道及数据对比校验,显著降低人力成本与业务风险。适合从Oracle、MySQL等迁移到YashanDB的企业,以及需异构整合或国产化替代的集团、政府和国企项目。YMP不仅是工具,更是推动数据库国产化的关键平台。
|
11月前
|
关系型数据库 MySQL 数据库
MySQL数据库上云迁移
本文介绍了将数据库迁移到RDS for Mysql的两种主要方法:停服迁移和不停服迁移。停服迁移适合可短暂中断服务的场景,通过mysqldump或DTS完成;不停服迁移适用于需保持业务连续性的场景,推荐使用DTS实现结构、全量及增量数据迁移。文中详细列出了每种方法的具体操作步骤,帮助企业根据需求选择合适的迁移方案。
347 1
MySQL数据库上云迁移
|
SQL Oracle 关系型数据库
迁移方案详解 | 使用YMP从异构数据库迁移到YashanDB
迁移方案详解 | 使用YMP从异构数据库迁移到YashanDB

热门文章

最新文章