Sql 如何遍历id列表并在表中为oracle中的每个id插入一条记录

Sql 如何遍历id列表并在表中为oracle中的每个id插入一条记录,sql,oracle,stored-procedures,plsql,Sql,Oracle,Stored Procedures,Plsql,嗨,我有一个ID列表,比如1,6,8,9,12,45,67,。。。。 我希望遍历这些id,并在表中为每个id示例插入一条记录- for each id { insert into table_name(user_id, sys_id, crt_tsp) values (nextval,{this value is from above list}, current_timestamp) } 如何在sql中实现这一点我的数据库是oracle?您可以使用集合。SYS.ODCINUMBERLIS

嗨,我有一个ID列表,比如1,6,8,9,12,45,67,。。。。 我希望遍历这些id,并在表中为每个id示例插入一条记录-

for each id {
  insert into table_name(user_id, sys_id, crt_tsp) values (nextval,{this value is from above list}, current_timestamp)
}
如何在sql中实现这一点我的数据库是oracle?

您可以使用集合。SYS.ODCINUMBERLIST是一个内置的VARRAY,您可以使用:

Oracle 11g R2架构设置:

问题1:

:

或者您可以创建自己的类型:

CREATE TYPE NumberList IS TABLE OF NUMBER;

INSERT INTO table_name( user_id, sys_id, crt_tsp) 
SELECT sequence_name.NEXTVAL,
       COLUMN_VALUE,
       current_timestamp
FROM   TABLE( NumberList( 1,6,8,9,12,45,67 ) );
更新:

根据OP对另一个答案的评论:

我想从另一个表中获取数字列表

select id from table_name
您可以直接从该表中选择:

INSERT INTO table_name( user_id, sys_id, crt_tsp) 
SELECT sequence_name.NEXTVAL,
       id,
       current_timestamp
FROM   table_name;

下面是匿名块的一些伪代码,它将按照您的要求执行。您需要创建一个具有所需ID的临时表

declare
  cursor c0 is
    select 
    a.id_value,
    b.user_id,
    b.crt_tsp
    from temporary_table a
    join data_table b on b.id_value = a.id_value;

begin
for rec in c0 loop
  insert into table_name (...) values(rec.id_value, rec.user_id, rec.crt_tsp ...);
end loop;
end;

除了@MT0的答案之外,在Oracle 12.2及更高版本中,您甚至不需要TABLEfunction,您可以直接从SYS.ODCINUMBERLIST或NumberList1、6、8、9、12、45、67中进行选择

如果您可以传递包含在字符串中的逗号分隔的数字列表,XMLTABLE也可以用于11g中

INSERT INTO table_name (
    user_id
    ,sys_id
    ,crt_tsp
    )
SELECT sequence_name.NEXTVAL
    ,to_number(COLUMN_VALUE)
    ,current_timestamp
FROM XMLTABLE('1, 6, 8, 9, 12, 45, 67');

将该列表放在临时表中。JOIN.您是否从表中创建ID列表?如果是,您可以通过查询来执行此操作,如果不是,您可以创建一个存储过程,其中该列表是一个文件,在某种语言的数组中,在一个表中?。你打算用哪种语言写这篇文章?为什么不直接用INSERT-INTO。。。选择从临时表中,您可以去掉整个PL/SQL块、游标和循环?但是,你也可以问OP是如何将列表放入临时表的,你有一个鸡和蛋的问题,这并不能解决。我非常喜欢你的回答。如果没有额外的逻辑,效率会更高。但是你的答案不允许他按照OP的要求迭代ID。我的答案是。这将是有用的信息,可以添加到你的答案中,说明这个版本的好处,而不是简单的东西——你可以在代码段中添加注释,指出你将在循环中的何处执行预处理,或者是一些简单的示例附加逻辑。谢谢,我想从另一个表中获取数字列表。示例..从SYS.ODCINUMBERLISTselect id FROM table_name;但我一直在下面得到错误SQL错误:ORA-00936:缺少表达式00936。00000-失踪expression@question_tech:数字列表,它是以id形式存储在多行中还是以字符串形式存储在一行中?谢谢。我想从另一个表中获取数字列表。实例从表编号列表中,从表名称中选择id;但我一直在下面得到错误SQL错误:ORA-00936:缺少表达式00936。00000-缺少表达式
INSERT INTO table_name( user_id, sys_id, crt_tsp) 
SELECT sequence_name.NEXTVAL,
       id,
       current_timestamp
FROM   table_name;
declare
  cursor c0 is
    select 
    a.id_value,
    b.user_id,
    b.crt_tsp
    from temporary_table a
    join data_table b on b.id_value = a.id_value;

begin
for rec in c0 loop
  insert into table_name (...) values(rec.id_value, rec.user_id, rec.crt_tsp ...);
end loop;
end;
INSERT INTO table_name (
    user_id
    ,sys_id
    ,crt_tsp
    )
SELECT sequence_name.NEXTVAL
    ,COLUMN_VALUE
    ,current_timestamp
FROM SYS.ODCINUMBERLIST(1, 6, 8, 9, 12, 45, 67);
INSERT INTO table_name (
    user_id
    ,sys_id
    ,crt_tsp
    )
SELECT sequence_name.NEXTVAL
    ,to_number(COLUMN_VALUE)
    ,current_timestamp
FROM XMLTABLE('1, 6, 8, 9, 12, 45, 67');