You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle转PostgreSQL迁移至Azure云:DBMS_UTILITY编译报错求助

解决Oracle迁移PostgreSQL时DBMS_UTILITY.UNCL_ARRAY不存在的错误

错误原因

PostgreSQL没有Oracle专属的DBMS_UTILITY.UNCL_ARRAY集合类型,这是Oracle PL/SQL特有的字符串数组类型,直接迁移代码会因找不到该类型触发报错。

解决方案

方案1:替换为PostgreSQL原生文本数组(推荐)

直接将代码中DBMS_UTILITY.UNCL_ARRAY类型替换为PostgreSQL原生的text[](文本数组类型),修改后的变量定义如下:

i   integer       :=0;
tmp_cnt               integer;
tmp_Tab_Str           text[];
tmp_Str_List_Quote    varchar(3000);

tmp_cnt_val               integer;
tmp_Tab_Str_val           text[];
tmp_Str_List_Quote_val    varchar(3000);

tmp_attribute_id      bigint;
tmp_sysdate           timestamp;

BEGIN
    out_error_code := 0;

如果后续代码中用到了Oracle数组的操作方法(如EXTEND、TRIM、元素赋值),需要对应替换为PostgreSQL数组的操作:

  • Oracle的tmp_Tab_Str.EXTEND(1) → PostgreSQL用tmp_Tab_Str := array_append(tmp_Tab_Str, '目标字符串') 或 tmp_Tab_Str := tmp_Tab_Str || '目标字符串'
  • Oracle的tmp_Tab_Str(i) := '值' → PostgreSQL直接写tmp_Tab_Str[i] := '值'(注意PostgreSQL数组下标从1开始,和Oracle一致)
  • Oracle的tmp_Tab_Str.TRIM() → PostgreSQL用tmp_Tab_Str := tmp_Tab_Str[1:array_length(tmp_Tab_Str, 1)-1]

方案2:自定义兼容类型

如果需要尽量贴合原有代码结构,可以手动创建一个与UNCL_ARRAY功能类似的自定义类型:

CREATE TYPE uncl_array AS TABLE OF text;

但PostgreSQL中这种表类型的使用方式和Oracle集合略有差异,比如添加元素需要用INSERT INTO语法,操作复杂度高于原生数组,因此更推荐方案1。

额外提醒

迁移过程中Oracle的内置包(如DBMS_UTILITY、DBMS_OUTPUT等)在PostgreSQL中无直接对应实现,后续遇到其他相关报错时,需要逐个替换为PostgreSQL原生函数或第三方扩展(如orafce扩展,部分实现了Oracle兼容函数)。

内容的提问来源于stack exchange,提问作者vana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:42:15