處理 Aurora Postgre 中過載的 Oracle 函數 SQL- 相容 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

處理 Aurora Postgre 中過載的 Oracle 函數 SQL- 相容

由 Sumana Yanamandra 建立 (AWS)

環境:PoC 或試行

來源:Oracle 資料庫

目標:Aurora Postgre SQL- 相容

R 類型:Replatform

工作負載:Oracle

技術:資料庫;遷移

AWS 服務:Amazon Aurora

Summary

您從內部部署 Oracle 資料庫遷移至 Amazon Aurora Postgre SQL-Compatible Edition 的程式碼可能包含過載的函數。這些函數具有相同的定義,也就是相同的函數名稱和相同的輸入 (IN) 參數數目和資料類型,但資料類型或輸出 (OUT) 參數數目可能會不同。 

這些參數不相符可能會導致 Postgre 中的問題SQL,因為很難決定要執行哪個函數。此模式說明當您將資料庫程式碼遷移至 Aurora Postgre SQL-Compatible 時,如何處理過載的函數。

先決條件和限制

先決條件

產品版本

工具

AWS 服務

其他工具

  • Oracle SQL 開發人員是免費的整合開發環境,可在傳統和雲端部署的 SQL Oracle 資料庫中使用 。 

  • pgAdmin 是 Postgre 的開放原始碼管理工具SQL。它提供圖形界面,可協助您建立、維護和使用資料庫物件。

史詩

任務描述所需的技能
在 PostgreSQL 中建立具有一個輸入參數和一個輸出參數的函數。

下列範例說明在 Aurora Postgre SQL-Compatible test_overloading中名為 的函數。此函數有兩個參數:一個輸入文字參數和一個輸出文字參數。

CREATE OR REPLACE FUNCTION public.test_overloading(          str1 text,          OUT str2 text)     LANGUAGE 'plpgsql'     COST 100     VOLATILE AS $BODY$ DECLARE BEGIN          str2 := 'Success';     RETURN ;     EXCEPTION         WHEN others THEN              RETURN ; END; $BODY$;
資料工程師,Aurora Postgre SQL- 相容
在 Postgre 中執行 函數SQL。

執行您在上一個步驟中建立的函數。

select public.test_overloading('Test');

它應該顯示下列輸出。

Success
資料工程師,Aurora Postgre SQL- 相容
任務描述所需的技能
使用相同的函數名稱,在 Postgre 中建立過載函數SQL。

在 Aurora Postgre SQL-Compatible 中建立過載函數,該函數使用與先前函數相同的函數名稱。下列範例也命名為 test_overloading,但具有三個參數:一個輸入文字參數、一個輸出文字參數和一個輸出整數參數。

CREATE OR REPLACE FUNCTION public.test_overloading(          str1 text,          OUT str2 text,          OUT num1 integer)     LANGUAGE 'plpgsql'       COST 100     VOLATILE AS $BODY$ DECLARE str3 text;   BEGIN            str2 := 'Success';          num1 := 100;       RETURN ;     EXCEPTION         WHEN others THEN              RETURN ; END; $BODY$;
資料工程師,Aurora Postgre SQL- 相容
在 Postgre 中執行 函數SQL。

當您執行此函數時,它會失敗並顯示下列錯誤訊息。 

ERROR: cannot change return type of existing function HINT:      Use DROP FUNCTION test_overloading(text) first.

這是因為 Aurora Postgre SQL-Compatible 不支援函數直接超載。它無法識別要執行哪個函數,因為輸出參數的數量在函數的第二個版本中不同,雖然輸入參數相同。

資料工程師,Aurora Postgre SQL- 相容
任務描述所需的技能
INOUT 新增至第一個輸出參數。

作為解決方法,透過將第一個輸出參數表示為 來修改函數程式碼INOUT

CREATE OR REPLACE FUNCTION public.test_overloading(          str1 text,          INOUT str2 text,          OUT num1 integer)     LANGUAGE 'plpgsql'       COST 100     VOLATILE AS $BODY$ DECLARE str3 text; BEGIN            str2 := 'Success';          num1 := 100;       RETURN ;     EXCEPTION         WHEN others THEN              RETURN ; END; $BODY$;
資料工程師,Aurora Postgre SQL- 相容
執行修訂的函數。

使用以下查詢執行您更新過的函數。您傳遞 null 值作為此函數的第二個引數,因為您宣告此參數為 INOUT以避免錯誤。 

select public.test_overloading('Test', null);

現在已成功建立函數。

Success, 100
資料工程師,Aurora Postgre SQL- 相容
驗證結果。

確認具有過載函數的程式碼已成功轉換。

資料工程師,Aurora Postgre SQL- 相容

相關資源