使用 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 循环索引插入表中的主要内容,如果未能解决你的问题,请参考以下文章