使用 for 循环索引插入表中

Posted

技术标签:

【中文标题】使用 for 循环索引插入表中【英文标题】:Insert into table using for loop index 【发布时间】:2021-04-19 14:48:02 【问题描述】:

尝试使用 for 循环将数据插入表中,对于表客户,我将数据放入 3 个分区。

这里是代码

begin
FOR var_1 in 1 .. 3
LOOP
INSERT into tmp_table
(
        SELECT cust_no FROM customer PARTITION (customer_PR$var_1)
        WHERE city='ba' AND first_name='john'
        AND salary=1000);
commit;
END LOOP;
END;
/

我得到结果

Error report -
ORA-02149: Specified partition does not exist
ORA-06512: at line 4
02149. 00000 -  "Specified partition does not exist"
*Cause:    Partition not found for the object.
*Action:   Retry with correct partition name.

但是当我正常运行时(对于分区1),

SELECT cust_no FROM customer PARTITION (customer_PR1);

我得到了预期的输出。

【问题讨论】:

$ 不是在 PL/SQL 中引用变量的方式 @CyrilleMODIANO 那么应该使用什么?管道? 【参考方案1】:

我认为您需要在这里使用动态 SQL 来实现您的目标 -

Declare
       sql_text varchar2(500);
begin
     FOR var_1 in 1 .. 3
     LOOP
         sql_text := 'INSERT into tmp_table
                      (SELECT cust_no FROM customer PARTITION (customer_PR' || var_1 || ')
                        WHERE city=''ba'' AND first_name=''john''
                          AND salary=1000)';
         EXECUTE IMMEDIATE sql_text;
         COMMIT;
     END LOOP;
END;
/

【讨论】:

【参考方案2】:

您不需要 3 个不同的查询,只需正确使用 PARTITION() 子句 - 指定所需的所有分区:

    INSERT into tmp_table
        SELECT cust_no 
        FROM customer PARTITION (customer_PR1,customer_PR3,customer_PR3)
        WHERE city='ba' AND first_name='john'
        AND salary=1000;

如果你真的需要动态 sql,你可以连接你的查询:

begin
FOR var_1 in 1 .. 3
LOOP
  execute immediate q'[
    INSERT into tmp_table
        SELECT cust_no FROM customer PARTITION (customer_PR]'||var_1||q'[
        WHERE city='ba' AND first_name='john'
        AND salary=1000)
        ]';
  commit;
END LOOP;
END;
/

或者根据您的分区规则,您可以使用partition for 子句:

begin
FOR partitioning_key in your_partitioning keys
LOOP
INSERT into tmp_table
(
        SELECT cust_no FROM customer PARTITION FOR (partitioning_key)
        WHERE city='ba' AND first_name='john'
        AND salary=1000);
commit;
END LOOP;
END;
/

https://www.oracle.com/technical-resources/articles/database/sql-11g-partitioning.html

【讨论】:

对于第二个答案,我们如何定义 your_partitioning keys 的范围? @roger 我不知道你的分区方案,请提供你表的完整 DDL,我会显示 让我检查一下....对于答案之一,如果您解释一下答案会很有帮助。 @Roger 我刚刚在您的问题后发现:***.com/questions/67167774/… 您根本不需要动态查询。只需在PARTITION 子句中指定所有分区

以上是关于使用 for 循环索引插入表中的主要内容,如果未能解决你的问题,请参考以下文章

Jquery在某个索引处将新行插入表中

MongoDB中的索引

使用索引 Batch 在 for 循环中设置变量

使用无符号索引执行反向“for”循环的最佳方法是啥?

为啥不总是在 vue.js for 循环中使用索引作为键?

RcppArmadillo:for循环中的负索引