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

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

處理 Aurora PostgreSQL 相容中的過載 Oracle 函數

Sumana Yanamandra,Amazon Web Services

Summary

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

這些參數不相符可能會導致 PostgreSQL 發生問題,因為很難判斷要執行哪個函數。此模式說明如何在將資料庫程式碼遷移至 Aurora PostgreSQL 相容時處理過載的函數。

先決條件和限制

先決條件

  • Oracle 資料庫執行個體做為來源資料庫

  • Aurora PostgreSQL 相容資料庫執行個體做為您的目標資料庫 (請參閱 Aurora 文件的說明)

產品版本

工具

AWS 服務

其他工具

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

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

史詩

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

下列範例說明在 Aurora PostgreSQL 相容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 PostgreSQL 相容
在 PostgreSQL 中執行 函數。

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

select public.test_overloading('Test');

它應該會顯示下列輸出。

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

在 Aurora PostgreSQL 相容中建立過載函數,該函數使用與先前函數相同的函數名稱。下列範例也稱為 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 PostgreSQL 相容
在 PostgreSQL 中執行 函數。

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

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

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

資料工程師,Aurora PostgreSQL 相容
任務描述所需的技能
將 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 PostgreSQL 相容
執行修訂的 函數。

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

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

函數現在已成功建立。

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

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

資料工程師,Aurora PostgreSQL 相容

相關資源