首页 > 解决方案 > 如何将 3.5k 整数插入 Oracle DB 中的数组

问题描述

我有自定义类型:

create or replace type integer_varray as varray (4000) of int;

然后使用这个数组的表:

create table plan_capacities
(
  id       int generated by default as identity not null constraint plan_capacities_pkey primary key,
  line_id  int references lines (id) on delete cascade,
  model_id int references models (id) on delete cascade,
  plan_id  int references plans (id) on delete cascade,
  capacity integer_varray
);

然后我想插入一些数据。问题是在Oracle中我不能在数组“构造函数”中使用超过1000个项目(我有3 500个项目)这么简单的语句

INSERT INTO plan_capacities ("model_id", "line_id", "plan_id", "capacity") VALUES (1,1,1,integer_varray(1,2,3.....35000))

是不可能使用的。(数据是一些容量,必须按特定顺序排列)。

应该插入数组的数据在我必须放入脚本的字符串中。->{1,10,11,10,20,0,0,0,1,10 ....}

如何插入大量数据?

我试图将它们插入到临时表中,然后用它们填充数组 - 这可行,但该 sql 脚本有 3500 行(仅创建一个记录plan_capacities),这太糟糕了而且很大。

标签: sqloracle

解决方案


您可以将数组用作表,通过一条 SQL 语句将其值插入到表中;例如:

declare
    vArray integer_varray;
begin
    -- some code to populate vArray

    insert into someTable(col)
    select column_value from table(vArray);
end;  

如果可以使用查询填充数组,则不需要数组,只需将查询用作插入语句的数据源;例如:

insert into someTable(col)
select something
from someOtherTable

如果您需要一种方法来创建一组数字,例如 1、2、... 3500,这是一种常用的方法:

select level 
from dual 
connect by level <= 3500 

关于从字符串构建一组数字的方法,这是一种非常常用的方法:

SQL> create or replace type integer_varray as varray (4000) of int
  2  /

Type created.

SQL> create table someTable(n number);

Table created.

SQL> declare
  2      vString     varchar2(32000) := '1,10,11,10,20,0,0,0,1,10';
  3      vArray      integer_varray;
  4  begin
  5      insert into someTable(n)
  6      select to_number(regexp_substr(vString, '[^,]+', 1, level))
  7      from dual
  8      connect by instr(vString, ',', 1, level - 1) > 0;
  9  end;
 10  /

PL/SQL procedure successfully completed.

SQL> select * from someTable;

         N
----------
         1
        10
        11
        10
        20
         0
         0
         0
         1
        10

10 rows selected.

SQL>

推荐阅读