来自 Oracle 的 PostgreSQL 用户定义类型转换 - CREATE TYPE <name> AS TABLE OF <type>

问题描述 投票:0回答:2

我使用 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 user-defined-types ora2pg postgresql-15
2个回答
0
投票

在 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;$$;

0
投票

简单的答案是ora2pg不支持使用自定义类型和/或集合类型(例如嵌套表)自动转换plsql。

© www.soinside.com 2019 - 2024. All rights reserved.