oracle存儲過程遷移達夢心得

来源:https://www.cnblogs.com/kingstarer/archive/2020/05/24/12952155.html
-Advertisement-
Play Games

這幾天把項目的存儲過程從oracle遷移到了達夢8,記錄一下心得。國產資料庫做到這樣,已經算很了不起了,跟oracle相容性確實很高。 但還是有一些細節沒做好,主要是出錯提示不友好,另外一個網上的資料也很少,出問題不好定位。(達夢的錯誤碼比較簡單,就是一個負數,不像oracle是ora 錯誤碼,在百 ...


這幾天把項目的存儲過程從oracle遷移到了達夢8,記錄一下心得。國產資料庫做到這樣,已經算很了不起了,跟oracle相容性確實很高。

但還是有一些細節沒做好,主要是出錯提示不友好,另外一個網上的資料也很少,出問題不好定位。(達夢的錯誤碼比較簡單,就是一個負數,不像oracle是ora-錯誤碼,在百度時輸入一個負數搜索信息,跟一長串錯誤碼搜索效率差很遠)

準備工作:

1 達夢的資料庫管理工具預設不顯示行號,也不能自動補全,需要手動設置。行號設置方法:在sql編輯頁面,左側空白豎欄(一般編輯器顯示行號的地方)右擊,選擇”顯示行號“。自動補全設置方法:在sql編輯頁面空白處右擊,選擇“選項”,彈出的界面展開“查詢分析器”,進入“編輯器”配置頁面,選中“啟用SQL輸入助手”

2 裝完達夢資料庫後,需要啟動oracle相容模式sp_set_para_value(2,‘COMPATIBLE_MODE’,2);,另外,需要啟動dbms_job包,SP_INIT_JOB_SYS(1)。改完設置後記得重啟。

遷移碰上的問題及解決方法:

1 使用達夢的資料庫遷移工具,把oracle的用戶整體遷移到達夢後,是變成一個模式,而不是用戶,使用起來不方便。

​ 解決方法:達夢資料庫有用戶和模式兩個概念,庫表和存儲過程等是建在模式下麵的,而用戶則是獨立的,與安全和許可權功能掛鉤,這跟mysql比較像。達夢的用戶進行資料庫操作時,預設使用同名的模式,想訪問其它模式的元數據,需要顯式加模式名。所以為了跟oracle保持一致,在遷移完後,需要手工給達夢添加oracle同名用戶。

2 遷移後發現有一些存儲過程,包等缺失。

​ 解決方法:遷移工具做得不是太好,有一些oracle資料庫的元素是不會自動遷移的,需要手工處理。例如oracle的type(達夢叫“類”),一些包含達夢資料庫關鍵字的存儲過程等。(在遷移日誌裡面沒報錯的,但也是可能沒遷成功,需要仔細檢查)

3 oracle建SEQUENCE裡面的關鍵字MINVALUE達夢不支持

4 達夢的關鍵字比oracle多很多,例如CONTEXT,bool,class,decode這些,oracle不是關鍵字,但達夢是。

​ 解決方法:給這些使用了關鍵字的欄位名或者變數名加上"",並且轉換成大寫就可以了。例如"CLASS"

5 建了包,提示創建成功,編譯有錯,但沒有具體說明錯誤地方。

​ 解決方法:可以在後面增加語句:alter package q$err_mgr compile;

6 提示“第3156 行附近出現錯誤[-3719]: 非法的基類名[DBMS_SQL]”

​ 解決方法:首先確認DBMS_SQL包是否啟用(在左側“工具包”菜單右鍵,選擇啟用)。如果啟用了後還報這個錯,則需要檢查是否使用了某些DBMS_SQL的類型或者函數,在oracle有,但是在達夢沒有的。

7 編譯包時提示“第3494 行附近出現錯誤[-2193]:無效的方法名[func_name]"

​ 解決方法:這種提示原因有很多,可能是確定在包裡面沒有定義這個func_name,也可能是func_name不在包頭裡面聲明,但在初始化代碼裡面調用。(oracle允許只在包體裡面定義,達夢不允許)。也可能是調用func_name的函數跟func_name都不在包頭聲明,但是在包體定義時,func_name出現位置比調用處更晚,在達夢這種是不允許的。

8 regexp系統函數提示“參數不相容”

​ 解決方法:達夢的regexp系統函數的參數名與oracle的不一樣,如果原來在oracle指定了參數名,搬到達夢編譯時容易出現這個錯。改為非顯示命名函數參數就好。

9 出現提示“第646 行附近出現錯誤[-3325]:包/對象[package_name]解析失敗”,但646行代碼是空白行

​ 解決方法:達夢的報錯位置不是太準確,這種情況下一般是上下文語法解析出現問題導致的。我碰到比較多的情況是在for迴圈語句裡面使用了case when ... end子句。達夢8對於case when支持不太好,容易把case when的end關鍵字與begin配對了,導致語法錯亂。我的解決方法是使用decode改寫case when

10 報錯提示“無法解析的成員訪問表達式[XXX] ”

​ 解決方法:這類錯誤主要是因為其它包之類的編譯失效導致,需要具體分析再解決。有時會出現迴圈引用的情況(a包引用b包的函數,b包引用a的函數),達夢支持不太好,編譯a時提示b的函數有問題,編譯b時提示a的函數有問題。我的解決方法是建立一個c包,把一些代碼從a和b抽出來,避免迴圈引用。大部分時候迴圈引用是可以編譯過的,也可能是由於其它錯誤引起包編譯不過,但是系統沒提示好。這種情況下只要解決了另外的錯誤,這個迴圈引用編譯失敗的問題也就解決了。

11 提示“非法的基類名[ROWID]”

​ 解決方法:我的代碼裡面使用了rowid類型變數,我直接改成number了

12 達夢對於重載(覆蓋)支持不太好

​ 解決方法:oracle裡面兩個同名函數,參數一樣,只是一個是IN類型參數 ,一個是IN OUT參數,是被認為是兩個不同類型的函數,可以正常重載。但達夢認為是同一個函數,編譯時會出錯。解決辦法是把其中一個改名。另外,oracle裡面varchar2(64),varchar2(1024)是兩種不同的類型,可以支持重載兩個函數,參數為這兩種類型,但在達夢不支持。oracle裡面同名的CONSTANT變數定義,後出現的會覆蓋先出現的。但在達夢裡面不支持。提示“錯誤號: -2120 無效的變數名”

遷移過程中也許還會碰上其它問題,處理原則是查官方幫助文檔(在幫助菜單下麵搜索,同時在安裝目錄下麵也有很多pdf文件介紹),查百度,問官方支持。(我另了達夢的技術支持群,群里的南網工作人員還是挺熱心的)

有時官方支持也搞不清楚,需要自己通過刪減代碼,慢慢定位問題,再自己猜測出錯原因並嘗試解決。

另外,之前有人寫過一份教程《oracle遷移達夢常見問題彙總》 https://www.cndba.cn/foucus/article/4142 ,裡面介紹了不少遷移的經驗,也是值得借鑒的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 預設情況下啟動docker容器都是bridge網路,橋接到docker0橋;對於docker容器來講,各個容器之間的網路上相互隔離的;相互隔離就表示在第一個容器里監聽某個埠,對於第二個容器是不可見的;對於宿主機來講,兩個容器的網路都是共用docker0橋的網路;同時在宿主機上的網路名稱空間中是可... ...
  • 今天同事說新裝了一臺雲伺服器,使用ssh登錄正常,但是上面的達夢資料庫服務埠不能訪問。 用netstat anp查看埠是正常監聽的,監聽的地址也是允許任意ip訪問 並且防火牆和iptables都是關閉的 我也覺得奇怪,於是遠程登錄上去伺服器。查看了達夢的埠,看起來是正常的。 Active In ...
  • [TOC] 1.打開VMware,進入虛擬網路編輯器 2.進行如下配置 3.進入虛擬機設置 4.進行如下設置 5.進入CentOS7終端 6.重新啟動網路 ...
  • 你以為只有馬雲會灌雞湯?Linux 命令行也會! “Linux 太南了o(╥﹏╥)o”,“我累了不想奮鬥了o(︶︿︶)o”... 不知道你有沒有想過,在你快喪失鬥志的時候,Linux 還能牛逼得給你來一碗香噴噴的心靈雞湯? 和 能夠在終端隨機顯示一些激勵性的名句,可謂是兩大心靈雞湯烹飪師。 安裝 m ...
  • which 命令 功能說明:查找命令對應的程式文件的路徑。 which命令會在PATH環境變數設定的目錄里查找符合條件的可執行文件。 用法:which [options] programname [...] | 選項 | 作用 | | | | | skip alias | 忽略別名 | 示例1:查找 ...
  • [toc] 在RHEL系列中,Bash中的快捷鍵是由readline庫來提供,預設是emacs風格的鍵綁定。 使用set命令可以查看當前的模式 快捷鍵的一些說明 Control鍵:PC鍵盤上的Ctrl鍵 Meta鍵:PC鍵盤上的ALT鍵,如果你鍵盤上沒有這個鍵,可以使用ESC鍵代替 ctrl開頭的快 ...
  • Zookeeper 的集群角色 集群中的 server 分為三種角色: , , 。 其中 是配置 明確定義的,角色 在一個zookeeper集群中有且只能有一個,是通過內部的選舉機制臨時產生的。 是集群中最重要的角色。負責響應集群的所有對Zookeeper數據狀態變更的請求。它會將每個狀態更新請求進 ...
  • mysql服務啟動異常:windows無法啟動Mysql服務,位於本地電腦上的錯誤1053, 找到服務對應的mysql.exe位置,比如 G:\MySQL\MySQL Server 5.7\bin\mysql.exe 雙擊,出現缺失MSVCP120.dll 哈哈,找到了問題所在。 解決方法 微軟上 ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...