嗨我有一个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?
答案 0 :(得分:2)
您可以使用集合。 SYS.ODCINUMBERLIST
是您可以使用的内置VARRAY
:
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.ODCINUMBERLIST
或FROM 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