將甲骨文輸出綁定變量遷移到 PostgreSQL 數據庫 - AWS 方案指引

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

將甲骨文輸出綁定變量遷移到 PostgreSQL 數據庫

由比卡什錢德拉魯(AWS)和維奈帕拉迪(AWS)創建

環境:PoC 或試點

來源:數據庫關係

目標:RDS/ Aurora

R 類型:重新平台

工作量:甲骨文

技術:資料庫;移轉

AWS 服務:Amazon Aurora; Amazon RDS; AWS SCT

Summary

此模式顯示如何將 Oracle 資料庫OUT繫結變數遷移到下列其中一個與 PostgreSQL 相容的 AWS 資料庫服務:

  • Amazon Relational Database Service 服務 (Amazon RDS)

  • Amazon Aurora PostgreSQL-Compatible Edition

不支持OUT綁定變量。若要在 Python 陳述式中取得相同的功能,您可以建立自訂 PL/pgSQL 函式,改為使用GETSET封裝變數。若要套用這些變數,此模式中提供的範例包裝函數指令碼使用 AWS Schema Conversion Tool (AWS SCT) 延伸套件

注意:如果 Oracle EXECUTE IMMEDIATE 陳述式是最多可傳回一個資料列的SELECT陳述式,最佳作法是執行下列動作:

  • OUT綁定變量(定義)放在子INTO句中

  • IN綁定變量放在子USING句中

如需詳細資訊,請參閱 Oracle 文件中的立即執行陳述式

先決條件和限制

先決條件

架構

源, 技術, 堆棧

  • 內部部署 Oracle 資料庫 10g (或更新版本) 資料庫 

目標技術堆疊

  • Amazon RDS for PostgreSQL 的資料庫執行個體或相容於 Aurora 的資料庫執行個體

目標架構

下圖顯示將 Oracle 資料庫OUT繫結變數遷移到 PostgreSQL 相容 AWS 資料庫的工作流程範例。

遷移甲骨文數據庫輸出將變量綁定到與 PostgreSQL 兼容的 AWS 數據庫。

該圖顯示以下工作流程:

  1. AWS SCT 會將來源資料庫結構描述和大部分自訂程式碼轉換為與目標 PostgreSQL 相容 AWS 資料庫的格式。

  2. PL/pgSQL 函數會標記任何無法自動轉換的資料庫物件。然後會手動轉換標記的物件以完成移轉。

工具

史诗

任務描述所需技能

Connect 到與 PostgreSQL 相容的 AWS 資料庫。

建立資料庫執行個體之後,您可以使用任何標準 SQL 用戶端應用程式連線到資料庫叢集中的資料庫。例如,您可以使用 pgAdmin 連線到資料庫執行個體。

如需詳細資訊,請參閱下列其中一項:

移民工程師

將此模式中的示例包裝函數腳本添加到目標數據庫的主模式中。

從此模式的其他資訊區段複製 PL/pgSQL 包裝函式指令碼範例。然後,將函數添加到目標數據庫的主模式中。

如需詳細資訊,請參閱 PostgreSQL 文件中的 CREATE FUNCTION

移民工程師

(選擇性) 更新目標資料庫主要結構描述中的搜尋路徑,以便包含 Test_pg 結構描述。

若要改善效能,您可以更新 PostgreSQL 搜尋路徑變數,使其包含 TEST_ PG 結構描述名稱。如果您在搜尋路徑中包含結構描述名稱,則無論何時呼叫 PL/pgSQL 函數,都不需要指定名稱。

如需詳細資訊,請參閱 PostgreSQL 文件中的〈結構描述搜尋路徑〉第 5.9.3 節。

移民工程師

相關資源

其他資訊

PL/PGSQL 函數示例

/* Oracle */ CREATE or replace PROCEDURE test_pg.calc_stats_new1 ( a NUMBER, b NUMBER, result out NUMBER ) IS BEGIN result:=a+b; END; / /* Testing */ set serveroutput on DECLARE a NUMBER := 4; b NUMBER := 7; plsql_block VARCHAR2(100); output number; BEGIN plsql_block := 'BEGIN test_pg.calc_stats_new1(:a, :b,:output); END;'; EXECUTE IMMEDIATE plsql_block USING a, b,out output; -- calc_stats(a, a, b, a) DBMS_OUTPUT.PUT_LINE('output:'||output); END; output:11 PL/SQL procedure successfully completed. --Postgres-- /* Example : 1 */ CREATE OR REPLACE FUNCTION test_pg.calc_stats_new1( w integer, x integer ) RETURNS integer AS $BODY$ begin return w + x ; end; $BODY$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION aws_oracle_ext.set_package_variable( package_name name, variable_name name, variable_value anyelement ) RETURNS void LANGUAGE 'plpgsql' COST 100 VOLATILE AS $BODY$ begin perform set_config ( format( '%s.%s',package_name, variable_name ) , variable_value::text , false ); end; $BODY$; CREATE OR REPLACE FUNCTION aws_oracle_ext.get_package_variable_record( package_name name, record_name name ) RETURNS text LANGUAGE 'plpgsql' COST 100 VOLATILE AS $BODY$ begin execute 'select ' || package_name || '$Init()'; return aws_oracle_ext.get_package_variable ( package_name := package_name , variable_name := record_name || '$REC' ); end; $BODY$; --init()-- CREATE OR REPLACE FUNCTION test_pg.init() RETURNS void AS $BODY$ BEGIN if aws_oracle_ext.is_package_initialized('test_pg' ) then return; end if; perform aws_oracle_ext.set_package_initialized ('test_pg' ); PERFORM aws_oracle_ext.set_package_variable('test_pg', 'v_output', NULL::INTEGER); PERFORM aws_oracle_ext.set_package_variable('test_pg', 'v_status', NULL::text); END; $BODY$ LANGUAGE plpgsql; /* callable for 1st Example */ DO $$ declare v_sql text; v_output_loc int; a integer :=1; b integer :=2; BEGIN perform test_pg.init(); --raise notice 'v_sql %',v_sql; execute 'do $a$ declare v_output_l int; begin select * from test_pg.calc_stats_new1('||a||','||b||') into v_output_l; PERFORM aws_oracle_ext.set_package_variable(''test_pg'', ''v_output'', v_output_l) ; end; $a$' ; v_output_loc := aws_oracle_ext.get_package_variable('test_pg', 'v_output'); raise notice 'v_output_loc %',v_output_loc; END ; $$ /*In above Postgres example we have set the value of v_output using v_output_l in the dynamic anonymous block to mimic the behaviour of oracle out-bind variable .*/ --Postgres Example : 2 -- CREATE OR REPLACE FUNCTION test_pg.calc_stats_new2( w integer, x integer, inout status text, out result integer) AS $BODY$ DECLARE begin result := w + x ; status := 'ok'; end; $BODY$ LANGUAGE plpgsql; /* callable for 2nd Example */ DO $$ declare v_sql text; v_output_loc int; v_staus text:= 'no'; a integer :=1; b integer :=2; BEGIN perform test_pg.init(); execute 'do $a$ declare v_output_l int; v_status_l text; begin select * from test_pg.calc_stats_new2('||a||','||b||','''||v_staus||''') into v_status_l,v_output_l; PERFORM aws_oracle_ext.set_package_variable(''test_pg'', ''v_output'', v_output_l) ; PERFORM aws_oracle_ext.set_package_variable(''test_pg'', ''v_status'', v_status_l) ; end; $a$' ; v_output_loc := aws_oracle_ext.get_package_variable('test_pg', 'v_output'); v_staus := aws_oracle_ext.get_package_variable('test_pg', 'v_status'); raise notice 'v_output_loc %',v_output_loc; raise notice 'v_staus %',v_staus; END ; $$