循环字符串时如何插入临时表 - 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这个表。

SQL用循环查询的结果 建临时表

如何使用 jdbc oracle 插入和选择全局临时表? [复制]

ORACLE存储过程创建临时表并插入数据。

Oracle 中临时表的替代方案