【问题标题】:How to insert into temp table when looping through a string - Oracle - PL/SQL循环字符串时如何插入临时表 - 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 行

【问题讨论】:

    标签: sql oracle plsql oracle12c


    【解决方案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
    

    【讨论】:

    • 非常感谢,知道如何重置临时表上的身份
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多