如何遍历id列表并在表中为oracle

时间:2018-05-14 13:53:01

标签: 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?

3 个答案:

答案 0 :(得分:2)

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

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE table_name(
  user_id NUMBER,
  sys_id  NUMBER,
  crt_tsp TIMESTAMP
);

CREATE SEQUENCE sequence_name;

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

查询1

SELECT * FROM table_name

<强> Results

| USER_ID | SYS_ID |                    CRT_TSP |
|---------|--------|----------------------------|
|       1 |      1 | 2018-05-14 14:14:08.157393 |
|       2 |      6 | 2018-05-14 14:14:08.157393 |
|       3 |      8 | 2018-05-14 14:14:08.157393 |
|       4 |      9 | 2018-05-14 14:14:08.157393 |
|       5 |     12 | 2018-05-14 14:14:08.157393 |
|       6 |     45 | 2018-05-14 14:14:08.157393 |
|       7 |     67 | 2018-05-14 14:14:08.157393 |

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

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;

答案 1 :(得分:1)

在Oracle 12.2及更高版本中添加@ MT0&#39的答案,您甚至不需要TABLE功能,您可以直接从SYS.ODCINUMBERLISTFROM NumberList(1, 6, 8, 9, 12, 45, 67)中选择

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);

如果您可以传递逗号分隔的字符串中包含的数字列表,也可以使用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');

答案 2 :(得分:0)

以下是匿名块的一些伪代码,可以按照您的要求执行。您需要使用所需的ID创建临时表。

Locked Screen and Security