在 oracle 临时表中插入 1000 多个长数字

Posted

技术标签:

【中文标题】在 oracle 临时表中插入 1000 多个长数字【英文标题】:insert 1000+ long numbers into oracle temp table 【发布时间】:2018-05-29 06:43:15 【问题描述】:

我在 oracle 中对我的表进行选择操作,但得到 ORA-01795,所以, 然后我尝试将我的值插入到临时表中的顺序 1000+ (890623250,915941020,915941021,....1000+ 次) 的列表中,但我不知道该怎么做,以便以后我可以做一个从临时表中选择

所以基本上我的目标是将这 1000 个 id 插入到 schema 的临时表中 TEMP_LID INTEGER 像 INSERT INTO TEMP_LINK SELECT(890623254,915941020,1000+ 值)

【问题讨论】:

您能分享您的实际查询吗?这个问题有点不清楚,看到一些具体的东西可能有助于解决这个问题。 Is there a workaround for ORA-01795: maximum number of expressions in a list is 1000 error?的可能重复 其实我只是想将我的 id 列表(890623250,915941020,915941021,....1000+ 次)插入到模式 TEMP_LINT ID 的临时表中 请向我们展示实际的 SQL,并查看提供的 linkeThomas G 【参考方案1】:

使用集合。 SYS.ODCINUMERLIST 是一个内置的VARRAY

INSERT INTO TEMP_LINK ( value )
SELECT COLUMN_VALUE
FROM   TABLE( SYS.ODCINUMBERLIST( 890623254,915941020,1000 /* + values */ ) );

或者您可以定义自己的集合:

CREATE TYPE NumberList IS TABLE OF NUMBER;

INSERT INTO TEMP_LINK ( value )
SELECT COLUMN_VALUE
FROM   TABLE( NumberList( 890623254,915941020,1000 /* + values */ ) );

但是,如果您要使用集合,则不需要将它们加载到临时表中:

SELECT *
FROM   your_table
WHERE  your_id MEMBER OF NumberList( 890623254,915941020,1000 /* + values */ )

SELECT *
FROM   your_table
WHERE  your_id IN (
  SELECT COLUMN_VALUE
  FROM   TABLE( 890623254,915941020,1000 /* + values */ )
);

【讨论】:

【参考方案2】:

最好使用 SQL* Loader 进行批量插入。另一种选择是使用 Excel 或 notepad++ 为所有 ID 构建查询。

INSERT INTO mytable(id) 
select 890623250 FROM DUAL UNION ALL
select 915941020 FROM DUAL UNION ALL
...
..

【讨论】:

以上是关于在 oracle 临时表中插入 1000 多个长数字的主要内容,如果未能解决你的问题,请参考以下文章

避免多次插入到oracle表中[关闭]

oracle 11g 中有没有办法在表中存储临时值?

如何在截断并保留 ID 列值后从临时表中重新插入记录

在oracle中,如何利用sql语句,往一个表中插入1000行相同的数据。在线等,求解

Oracle数据去重

在Oracle中临时存储多个值[重复]