循环字符串时如何插入临时表 - Oracle - PL/SQL
Posted
技术标签:
【中文标题】循环字符串时如何插入临时表 - Oracle - PL/SQL【英文标题】:How to insert into temp table when looping through a string - Oracle - PL/SQL 【发布时间】:2018-11-12 14:41:44 【问题描述】:CREATE GLOBAL TEMPORARY TABLE tt_temptable(
RowNums NUMBER(3,0),
procNums NUMBER(18,0)
) ON COMMIT PRESERVE ROWS;
inputString VARCHAR2 ;
inputString := '12,13,14,15'
SELECT REGEXP_SUBSTR (inputString,'[^,]+',1,LEVEL) ProcNums
FROM dual CONNECT BY REGEXP_SUBSTR (inputString,'[^,]+',1,LEVEL) IS NOT NULL;
INSERT INTO tt_temptable(
SELECT identity(3) RowNums,procNums
FROM
);
想在 temptable 中插入 12 , 13, 14 , 15 和 3 长度的标识,所以 temptable 中总共有 4 行
【问题讨论】:
【参考方案1】:如果您使用Oracle 12c
,那么您可以在表定义中通过GENERATED ALWAYS AS IDENTITY
定义一个IDENTITY
列,并按照以下方式操作:
SQL> CREATE GLOBAL TEMPORARY TABLE tt_temptable(
2 RowNums NUMBER(3,0) GENERATED ALWAYS AS IDENTITY,
3 procNums NUMBER(18,0)
4 ) ON COMMIT PRESERVE ROWS;
Table created
SQL>
SQL> DECLARE
2 inputString VARCHAR2(50) := '12,13,14,15';
3 BEGIN
4 INSERT INTO tt_temptable(procNums)
5 SELECT REGEXP_SUBSTR (inputString,'[^,]+',1,LEVEL) ProcNums
6 FROM dual
7 CONNECT BY REGEXP_SUBSTR (inputString,'[^,]+',1,LEVEL) IS NOT NULL;
8 END;
9 /
PL/SQL procedure successfully completed
SQL> SELECT * FROM tt_temptable;
ROWNUMS PROCNUMS
------- -------------------
1 12
2 13
3 14
4 15
要重置 IDENTITY
列 (RowNums
),请使用:
SQL> ALTER TABLE tt_temptable MODIFY( RowNums Generated as Identity (START WITH 1));
每当表上的共享锁被释放时。
【讨论】:
知道如何重置此临时表的身份【参考方案2】:insert
into tt_temptable
select NVL((select max(a.rownums)
from tt_temptable a
),100)+rownum
,procNums
from (SELECT REGEXP_SUBSTR ('10,20,30','[^,]+',1,LEVEL) ProcNums,level as lvl
FROM dual
CONNECT BY REGEXP_SUBSTR ('10,20,30','[^,]+',1,LEVEL) IS NOT NULL
)x
【讨论】:
非常感谢,知道如何重置临时表上的身份以上是关于循环字符串时如何插入临时表 - Oracle - PL/SQL的主要内容,如果未能解决你的问题,请参考以下文章
oracle 怎么在存储过程中创建一个临时表,在里面插入数据,再查找这个临时表的所有数据,最后drop这个表。
oracle 怎么在存储过程中创建一个临时表,在里面插入数据,再查找这个临时表的所有数据,最后drop这个表。