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
相关产品推荐
相关产品推荐

