我使用 ora2Pg 来转换 PL/SQL 过程,该过程使用用户定义的 Oracle 对象类型和相应的表对象类型。
对象类型和存储过程在 PostgreSQL 版本 15.1 中成功转换并安装/编译成功
但是,在尝试将对象类型实例分配给其相应的表对象类型时,我没有看到预期的行为。
使用精简的测试用例来演示这一点:
1:Oracle对象类型和对应的Table对象类型:
CREATE TYPE t_myobj AS OBJECT (rid NUMBER,
description VARCHAR2(100))
/
CREATE TYPE tab_myobjs AS TABLE OF t_myobj;
/
转换为以下 PostgreSQL 对象类型:
CREATE TYPE t_myobj AS (rid integer,
description varchar(100));
CREATE TYPE tab_myobjs AS (tab_myobjs t_myobj[]);
2:转换后的PostgreSQL存储过程如下:
CREATE OR REPLACE PROCEDURE test_prc() LANGUAGE PLPGSQL AS $$
DECLARE
v_myobj t_myobj;
v_myojbs_tab tab_myobjs;
v_error VARCHAR(100);
BEGIN
RAISE NOTICE '1: START: Assign v_myobj object type attributes';
v_myobj.rid := 1;
v_myobj.description := 'test';
RAISE NOTICE '2: Assign v_myobj object type to v_myojbs_tab';
v_myojbs_tab := tab_myobjs(v_myobj);
RAISE NOTICE '3: END';
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
v_error := SUBSTR(SQLERRM,1,512);
RAISE EXCEPTION '%', 'Unhandled Exception: '||v_error USING ERRCODE = '45000';
END; $$
3:当我调用TEST_PRC时,返回以下内容:
NOTICE: 1: START: Assign v_myobj object type attributes
NOTICE: 2: Assign v_myobj object type to v_myojbs_tab
ERROR: Unhandled Exception: function tab_myobjs(t_myobj) does not exist
CONTEXT: PL/pgSQL function test_prc() line 24 at RAISE
即此行 v_myojbs_tab := tab_myobjs(v_myobj); 抛出错误。
我的问题是 PostgreSQL 是否真的支持表对象类型的使用/分配,例如tab_myobjs,如果是这样,分配标准对象类型的语法是什么,例如表类型的 t_myobj 实例。
谢谢你 安德鲁
在 PostgreSQL 中以如此复杂的方式编写此代码并不容易。一个简单的版本是:
CREATE TYPE t_myobj AS (rid integer,
description varchar(100));
CREATE PROCEDURE test_prc() LANGUAGE PLPGSQL AS
$$DECLARE
v_myojbs_tab t_myobj[];
BEGIN
v_myojbs_tab[1] := (1, 'test');
END;$$;
简单的答案是ora2pg不支持使用自定义类型和/或集合类型(例如嵌套表)自动转换plsql。