【问题标题】:Insert into table using for loop index使用 for 循环索引插入表中
【发布时间】: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 那么应该使用什么?管道?

标签: sql oracle


【解决方案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 我刚刚在您的问题后发现:stackoverflow.com/questions/67167774/… 您根本不需要动态查询。只需在PARTITION 子句中指定所有分区
    猜你喜欢
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 2021-12-08
    • 2013-12-21
    • 2022-06-11
    • 2021-07-08
    相关资源
    最近更新 更多