本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將甲骨文輸出綁定變量遷移到 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 函式,改為使用GET
和SET
封裝變數。若要套用這些變數,此模式中提供的範例包裝函數指令碼使用 AWS Schema Conversion Tool (AWS SCT) 延伸套件。
注意:如果 Oracle EXECUTE IMMEDIATE
陳述式是最多可傳回一個資料列的SELECT
陳述式,最佳作法是執行下列動作:
將
OUT
綁定變量(定義)放在子INTO
句中將
IN
綁定變量放在子USING
句中
如需詳細資訊,請參閱 Oracle 文件中的立即執行陳述式
先決條件和限制
先決條件
有效的 AWS 帳戶
內部部署資料中心中的 Oracle 資料庫 10g (或更新版本) 來源資料庫
架構
源, 技術, 堆棧
內部部署 Oracle 資料庫 10g (或更新版本) 資料庫
目標技術堆疊
Amazon RDS for PostgreSQL 的資料庫執行個體或相容於 Aurora 的資料庫執行個體
目標架構
下圖顯示將 Oracle 資料庫OUT
繫結變數遷移到 PostgreSQL 相容 AWS 資料庫的工作流程範例。
![遷移甲骨文數據庫輸出將變量綁定到與 PostgreSQL 兼容的 AWS 數據庫。](images/pattern-img/26919e74-b275-40a8-994f-84636327a334/images/b625aac5-0b8c-4054-ba0a-c96e5d5aa863.png)
該圖顯示以下工作流程:
AWS SCT 會將來源資料庫結構描述和大部分自訂程式碼轉換為與目標 PostgreSQL 相容 AWS 資料庫的格式。
PL/pgSQL 函數會標記任何無法自動轉換的資料庫物件。然後會手動轉換標記的物件以完成移轉。
工具
Amazon Aurora PostgreSQL 相容版本是全受管、符合 ACID 標準的關聯式資料庫引擎,可協助您設定、操作和擴展 PostgreSQL 部署。
適用於 PostgreSQL 的 Amazon Relational Database Service 服務 (Amazon RDS) 可協助您在 AWS 雲端中設定、操作和擴展 PostgreSQL 關聯式資料庫。
AWS Schema Conversion Tool (AWS SCT) 會自動將來源資料庫結構描述和大部分自訂程式碼轉換為與目標資料庫相容的格式,藉此支援異質資料庫遷移。
pgAdmin
是一個開放原始碼的管理工具。它提供了一個圖形界面,可幫助您創建,維護和使用數據庫對象。
史诗
任務 | 描述 | 所需技能 |
---|---|---|
Connect 到與 PostgreSQL 相容的 AWS 資料庫。 | 建立資料庫執行個體之後,您可以使用任何標準 SQL 用戶端應用程式連線到資料庫叢集中的資料庫。例如,您可以使用 pgAdmin 如需詳細資訊,請參閱下列其中一項: | 移民工程師 |
將此模式中的示例包裝函數腳本添加到目標數據庫的主模式中。 | 從此模式的其他資訊區段複製 PL/pgSQL 包裝函式指令碼範例。然後,將函數添加到目標數據庫的主模式中。 如需詳細資訊,請參閱 PostgreSQL 文件中的 CREATE FUNCTION | 移民工程師 |
(選擇性) 更新目標資料庫主要結構描述中的搜尋路徑,以便包含 Test_pg 結構描述。 | 若要改善效能,您可以更新 PostgreSQL 搜尋路徑變數,使其包含 TEST_ PG 結構描述名稱。如果您在搜尋路徑中包含結構描述名稱,則無論何時呼叫 PL/pgSQL 函數,都不需要指定名稱。 如需詳細資訊,請參閱 PostgreSQL 文件中的〈結構描述搜尋路徑〉第 5.9.3 | 移民工程師 |
相關資源
輸出連結變數
(Oracle 文件集) 使用連結變數來改善 SQL 查詢效能
(Oracle 部落格)
其他資訊
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 ; $$