0

我正在从 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;

提前感谢您的帮助!

4

0 回答 0