我正在从 Oracle 12 迁移到 EnterpriseDB(EDB) Postgre 13。在编译包 TEST_KV_T 的 Oracle 版本期间(如下所示)我收到错误:
ERROR: syntax error at or near "("
LINE 29: v_arr_books('1').dtls(0).a_name := 'Piglet';
看来问题是由于dtls之后的括号引起的。将上面的行替换为以下行后,EDB 编译包体:
v_arr_details:=v_arr_books('1').dtls;
v_arr_details(0).a_name := 'Piglet';
v_arr_books('1').dtls:=v_arr_details;
如果我没记错的话,这样的替换将对大型数组产生开销。从性能的角度来看,有没有比使用过的更好的方法?
完整源 Oracle 版本:
create or replace package test_kv_p is
procedure p;
end test_kv_p;
create or replace package body test_kv_p is
TYPE t_details IS RECORD
(
a_type varchar2(30),
a_name varchar2(30)
);
TYPE t_arr_details IS TABLE OF t_details INDEX BY PLS_INTEGER;
TYPE a_book IS RECORD
(
title varchar2(30),
dtls t_arr_details
);
TYPE t_books IS TABLE OF a_book INDEX BY varchar2(30);
v_arr_details t_arr_details;
procedure p is
v_arr_books t_books;
begin
v_arr_books('1').title := 'Winnie the Pooh';
v_arr_books('1').dtls(0).a_name := 'Piglet';
dbms_output.put_line('test');
end;
end test_kv_p;
包体的EDB版本(包与Oracle相同):
create or replace package body test_kv_p is
TYPE t_details IS RECORD
(
a_type varchar2(30),
a_name varchar2(30)
);
TYPE t_arr_details IS TABLE OF t_details INDEX BY PLS_INTEGER;
TYPE a_book IS RECORD
(
title varchar2(30),
dtls t_arr_details
);
TYPE t_books IS TABLE OF a_book INDEX BY varchar2(30);
v_arr_details t_arr_details; -- this variable is used only in EDB
procedure p is
v_arr_books t_books;
begin
v_arr_books('1').title := 'Winnie the Pooh';
-- EDB:
v_arr_details:=v_arr_books('1').dtls;
v_arr_details(0).a_name := 'Piglet';
v_arr_books('1').dtls:=v_arr_details;
dbms_output.put_line('test');
end;
end test_kv_p;
以(适用于 EDB 和 Oracle)开始该过程:
begin
test_kv_p.p;
end;
提前感谢您的帮助!