Oracle向PG轉移建議以及注意點

Oracle向PG轉移建議以及注意點

? 一、語法差異與遷移建議

1. 包結構(Package)

  • Oracle 支持 PACKAGEPACKAGE BODY 分離定義。
  • PostgreSQL 不支持包結構,需將每個函數/過程單獨定義。

遷移建議:

  • PACKAGE 包中的每個函數和存儲過程拆分為獨立的 FUNCTIONPROCEDURE
  • 使用模式(Schema)來組織這些對象,模擬 Oracle 的包結構邏輯。

2. 變量聲明和賦值

  • Oracle 中變量在 DECLARE 部分聲明。
  • PostgreSQL 使用 %ROWTYPE 類似,但變量聲明需放在 DECLARE 塊中。

注意點:

  • SELECT INTO 在 PostgreSQL 中用于賦值。
  • 確保使用 PERFORM 替代無返回值的查詢(如日志插入)。
-- Oraclea A%Rowtype;-- PostgreSQL
DECLAREa A%ROWTYPE;

3. 異常處理

  • Oracle 使用 WHEN OTHERS THEN ...
  • PostgreSQL 使用 EXCEPTION WHEN OTHERS THEN ...

遷移建議:

  • 替換 RAISE_APPLICATION_ERROR(xxx, '錯誤信息')RAISE EXCEPTION '錯誤信息'
-- Oracle
Raise_Application_Error(xxx, 'DataNotFound' || Geterrmsg);
-- PostgreSQL
RAISE EXCEPTION 'DataNotFound: %', SQLERRM;

4. 表名大小寫敏感

  • Oracle 默認大寫表名。
  • PostgreSQL 默認小寫,引用原大小寫需加雙引號。

建議:

  • 表名統一使用小寫,避免問題。
  • 如有保留原名需求,用雙引號包裹。

5. 序列和 GUID

  • Oracle 使用 SYS_GUID()
  • PostgreSQL 可使用 uuid_generate_v4()(需安裝 uuid-ossp 擴展)

6. 日期計算

  • Oracle 中 Sysdate 獲取當前時間。
  • PostgreSQL 使用 NOW()CURRENT_TIMESTAMP
-- Oracle
createdate := Sysdate;
-- PostgreSQL
createdate := NOW();

7. 時間差計算

  • Oracle 時間差 (Sysdate - Starttime) * 24 * 60 * 60 * 1000
  • PostgreSQL 使用 EXTRACT(EPOCH FROM ...) 轉換為毫秒
-- Oracle
Durtime = (Sysdate - Starttime) * 24 * 60 * 60 * 1000
-- PostgreSQL
durtime := EXTRACT(EPOCH FROM (NOW() - starttime)) * 1000;

8. 數據庫鏈接(如 @Mysqlct

  • Oracle 支持通過數據庫鏈接訪問遠程表。
  • PostgreSQL 可以使用 dblinkpostgres_fdw 擴展實現。
-- 示例:使用 dblink 查詢遠程用戶
SELECT * FROM dblink('host=... dbname=... user=...', 'SELECT * FROM sys_user') AS t(user_id TEXT, user_name TEXT);

? 二、遷移工具建議

工具功能
ora2pg自動化轉換 Oracle 到 PostgreSQL(這種方式可以遷移表結構和數據,存儲過程和函數可能還是需要手工遷移)
AWS Schema Conversion Tool提供圖形界面輔助遷移
dataX提供表數據遷移(使用DataX遷移后需要注意數字類型精度!!)
手動調整對于復雜邏輯更可靠,尤其是異常處理、事務控制等

? 三、測試建議

  1. 單元測試

    • 每個函數/過程單獨驗證輸入輸出。
    • 使用 pgTAPPL/pgSQL 測試框架。
  2. 性能測試

    • 觀察執行計劃是否合理。
    • 檢查索引是否缺失或冗余。
  3. 日志記錄

    • 遷移過程中建議啟用 [LOG] 輸出調試信息。

? 四、存儲過程聲明結構對比

Oracle 函數

Function funcName(v_Text Varchar2) Return returnType%Rowtype AsfieldName fieldType%Rowtype;
Begin//具體邏輯/////Return fieldName;
Exception//異常處理When No_Data_Found ThenRaise_Application_Error(xxxx, 'Data Not Found' || Geterrmsg);When Too_Many_Rows ThenRaise_Application_Error(xxxx, 'Too Many Rows' || Geterrmsg);When Others ThenRaise_Application_Error(xxxx, 'Unknow Err' || Geterrmsg);
End;

PostgreSQL 函數

CREATE OR REPLACE FUNCTION funcName(v_text VARCHAR)
RETURNS returnType
LANGUAGE plpgsql
AS $$
DECLAREfiledName fieldType%ROWTYPE;
BEGIN//具體邏輯///////異常處理IF NOT FOUND THENRAISE EXCEPTION 'Data Not Found: %', SQLERRM;END IF;RETURN funcName;
EXCEPTIONWHEN TOO_MANY_ROWS THENRAISE EXCEPTION 'Too Many Rows: %', SQLERRM;WHEN OTHERS THENRAISE EXCEPTION 'Unknow Err: %', SQLERRM;
END;
$$;

? 五、總結

遷移要點OraclePostgreSQL
包結構支持不支持
異常處理WHEN OTHERS THENEXCEPTION WHEN OTHERS THEN
GUIDSYS_GUID()uuid_generate_v4()
時間函數SYSDATENOW()
表名大小寫默認大寫默認小寫
序列生成SEQUENCE.NEXTVALnextval('seq')
數據庫鏈接支持使用 dblink / fdw
函數定義FUNCTIONCREATE OR REPLACE FUNCTION
存儲過程PROCEDURECREATE OR REPLACE FUNCTION

注:

  1. 使用Ora2pg遷移時,對于復雜的存儲過程和函數無法正確轉換,需要手工遷移,若有更好的解決方案,可以評論或私聊,我們一起研究一下。
  2. 對于某些特殊的數據類型如bool,使用ora2pg遷移后,可能會被轉成數字類型,需要后置手動修改。
  3. psql schema postgres -c "SET session_replication_role = replica;" -f data.sql 使用 SET session_replication_role = replica可以忽略約束進行數據導入。

坑點記錄

一、語法相關

1. 異常對應關系

PostgreSQL Error Codes(PGSQL 異常Code文檔)

2. 觸發器不支持針對某個字段監控

Oracle遷移PGSQL_觸發器
...BEFORE UPDATE OF xxxxx ON xxxx...
需要結合功能,判斷修改方案。

3. PGSQL沒有Package概念,需要把OraclePackage包中的存儲過程和函數等,單獨拆出來,并按PGSQL方言修改。

二、ORM相關

1. Mybatis PGSQL CallableStatement 不支持命名參數綁定

解決方式:不使用命名參數綁定的方式,直接拼接

  • 轉義全包
<![CDATA[ CALL XXXXXXXX('${p1}','${p2}')
]]>
  • 使用{},這個方法暫時還沒有驗證

2. Mybatis 日志開放

<setting name="logImpl" value="STDOUT_LOGGING" />

3. @Select注解結尾不要分號 ;

相關SQL記錄

ORACLE查詢某個模式下所有number類型的字段信息

SELECT a.table_name,a.column_name,a.data_type,a.data_precision,a.data_scale
FROM all_tab_columns a
WHERE a.owner = 'SD'AND a.TABLE_NAME LIKE 'SD%'AND a.data_type = 'NUMBER'
ORDER BY TABLE_NAME ASC,COLUMN_NAME asc;

PostgreSQL查詢number類型字段信息

SELECT table_schema AS schema_name,table_name,column_name,data_type,numeric_precision AS precision,numeric_scale AS scale
FROM information_schema.columns
WHERE table_schema = 'public'AND data_type IN ('smallint', 'integer', 'bigint','decimal', 'numeric', 'real', 'double precision');

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85137.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85137.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85137.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PCIe-PCI、PCIe中斷機制概述

PCI、PCIe中斷概述 PCIe 中斷機制在繼承 PCI 傳統中斷&#xff08;INTx&#xff09;的基礎上&#xff0c;引入了更高效的 MSI/MSI-X 方案&#xff0c;以提升設備性能并減少 CPU 輪詢開銷。以下是核心要點及技術演進&#xff1a; ?? ??一、PCIe 中斷類型與演進?? ??IN…

改進自己的圖片 app

1. 起因&#xff0c; 目的: 前面我寫過一個圖片 app &#xff0c; 最新做了些改動。 把原來的一列&#xff0c;改為3列&#xff0c; 繼續使用瀑布流手機上使用&#xff0c;更流暢&#xff0c;橫屏顯示為2列。 2. 先看效果 3. 過程: 過程太細碎了&#xff0c;這里只是做一下…

【HTML-15】HTML表單:構建交互式網頁的基石

表單是HTML中最強大的功能之一&#xff0c;它允許網頁收集用戶輸入并與服務器進行交互。無論是簡單的搜索框、登錄頁面&#xff0c;還是復雜的多步驟調查問卷&#xff0c;表單都是實現這些功能的核心元素。本文將深入探討HTML表單的各個方面&#xff0c;幫助您構建高效、用戶友…

關于智能體接入后端,在Apifox能夠傳參數給智能體的測試

from flask import Flask, request, jsonify, render_template import requests import json # 用于解析嵌套的 JSON 字符串app Flask(__name__)COZE_BOT_ID 7508736911423963162 COZE_API_KEY pat_cHXqrFzcvtktfmmlp4pjF3O2qmjioQW46uU8UNbUugyvSlFZclklpunc53DbR8ws COZE…

SQL進階之旅 Day 8:窗口函數實用技巧

【SQL進階之旅 Day 8】窗口函數實用技巧 在現代數據庫開發中&#xff0c;處理復雜的業務邏輯和大規模數據時&#xff0c;僅僅依靠傳統的GROUP BY和JOIN操作已經無法滿足需求。**窗口函數&#xff08;Window Function&#xff09;**作為SQL標準的一部分&#xff0c;為開發者提供…

編譯rustdesk,使用flutter、hwcodec硬件編解碼

目錄 安裝相應的環境安裝visual studio安裝vpkg安裝rust開發環境安裝llvm和clang編譯源碼下載源碼使用Sciter作為UI的(已棄用)使用flutter作為UI的(主流)下載flutter sdk橋接靜默安裝最近某desk免費的限制越來越多,實在沒辦法,平時遠程控制用的比較多,只能用rustdesk了,…

由反匯編代碼確定結構體的完整聲明

C程序中遇到下面的代碼 typedef struct {int left;a_struct a[CNT];int right; } b_struct;void test( int i, b_struct *bp) {int nbp->leftbp->right;a_struct *ap&bp->a[i];ap->x[ap->idx]n; } 下面是test函數的反匯編代碼 結合C程序中的代碼與test函數…

鴻蒙OSUniApp復雜表單與動態驗證實踐:打造高效的移動端表單解決方案#三方框架 #Uniapp

UniApp復雜表單與動態驗證實踐&#xff1a;打造高效的移動端表單解決方案 引言 在移動應用開發中&#xff0c;表單處理一直是一個既常見又具有挑戰性的任務。隨著HarmonyOS生態的蓬勃發展&#xff0c;越來越多的開發者開始關注跨平臺解決方案。本文將深入探討如何使用UniApp框…

Python學習(2) ----- Python的數據類型及其集合操作

在 Python 中&#xff0c;一切皆對象&#xff0c;每個對象都有類型。下面是 Python 中的常見內置類型分類和示例&#xff1a; &#x1f7e1; 1. 數字類型&#xff08;Numeric Types&#xff09; 類型說明示例int整數5, -42float浮點數3.14, -0.5complex復數1 2j a 10 …

深入解析Go語言數據類型:從底層到高級應用

引言 Go語言的數據類型系統設計體現了??簡潔性??與??高效性??的完美平衡。作為靜態編譯型語言&#xff0c;Go提供了豐富的數據類型支持&#xff0c;從基礎數值類型到高級并發原語&#xff0c;都經過精心設計。本文將深入剖析Go語言數據類型體系&#xff0c;揭示其底層…

數據交易場景的數據質量評估

在現代數字化時代&#xff0c;數據已成為推動商業發展的核心驅動力。基于不同的交易產品和業務場景&#xff0c;數據產品的質量和準確性直接影響到數據資產的價值及其在市場中的流通性。因此&#xff0c;為數據產品提供全面、深入的數據質量評估報告&#xff0c;不僅有助于提升…

Java 對接 Office 365 郵箱全攻略:OAuth2 認證 + JDK8 兼容 + Spring Boot 集成(2025 版)

&#x1f6a8; 重要通知&#xff1a;微軟強制 OAuth2&#xff0c;傳統認證已失效&#xff01; 2023 年 10 月起&#xff0c;Office 365 全面禁用用戶名 密碼認證&#xff0c;Java 開發者必須通過OAuth 2.0實現郵件發送。本文針對 CSDN 技術棧&#xff0c;提供從 Azure AD 配置…

一文詳談Linux中的時間管理和定時器編程

&#xff08;目錄&#xff09; 先說一些在計算機中需要用到時間的地方&#xff1a;系統日志log、OS調度(時間片、定時器)等等~~ 時間的計量 計時的方式發展&#xff1a;日晷、沙漏 -> 機械鐘 -> 石英振蕩器、晶振 -> 銫原子鐘 -> 氫原子鐘 計算機中的計時方式&…

使用FastAPI+Sqlalchemy從一個數據庫向另一個數據庫更新數據(sql語句版)

from sqlalchemy import create_engine, text from sqlalchemy.orm import sessionmaker # 配置數據庫連接&#xff08;示例為PostgreSQL->MySQL&#xff09; SRC_DB_URL postgresql://user:passsource_host:5432/source_db DST_DB_URL mysqlpymysql://user:passdest_hos…

基于python腳本進行Maxwell自動化仿真

本文為博主進行Maxwell自動化研究過程的學習記錄&#xff0c;同時對Maxwell自動化腳本&#xff08;pythonIron&#xff09;實現方法進行分享。 文章目錄 腳本使用方法腳本錄制與查看常用腳本代碼通用開頭定義項目調整設計變量軟件內對應位置腳本 設置求解器軟件內對應位置腳本…

pikachu通關教程-RCE

目錄 RCE(remote command/code execute)概述: exec "ping" 管道符 亂碼問題 RCE(remote command/code execute)概述: RCE漏洞&#xff0c;可以讓攻擊者直接向后臺服務器遠程注入操作系統命令或者代碼&#xff0c;從而控制后臺系統 分為遠程代碼和遠程命令兩種.當…

JavaScript性能優化全景指南

JavaScript性能優化全景指南 Ⅰ. 加載性能優化 1.1 代碼分割與懶加載 動態導入(ES2020) javascript // 路由級代碼分割 const ProductPage () > import(/* webpackChunkName: "product" */ ./ProductPage.vue); // 交互驅動加載 document.querySelector(#char…

BaseTypeHandler用法-筆記

1.BaseTypeHandler簡介 org.apache.ibatis.type.BaseTypeHandler 是 MyBatis 提供的一個抽象類&#xff0c;通過繼承該類并實現關鍵方法&#xff0c;可用于實現 Java 類型 與 JDBC 類型 之間的雙向轉換。當數據庫字段類型與 Java 對象屬性類型不一致時&#xff08;如&#xff…

t015-預報名管理系統設計與實現 【含源碼!!!】

項目演示地址 摘 要 傳統辦法管理信息首先需要花費的時間比較多&#xff0c;其次數據出錯率比較高&#xff0c;而且對錯誤的數據進行更改也比較困難&#xff0c;最后&#xff0c;檢索數據費事費力。因此&#xff0c;在計算機上安裝預報名管理系統軟件來發揮其高效地信息處理的…

Day12 - 計算機網絡 - HTTP

HTTP常用狀態碼及含義&#xff1f; 301和302區別&#xff1f; 301&#xff1a;永久性移動&#xff0c;請求的資源已被永久移動到新位置。服務器返回此響應時&#xff0c;會返回新的資源地址。302&#xff1a;臨時性性移動&#xff0c;服務器從另外的地址響應資源&#xff0c;但…