【发布时间】:2017-01-03 05:32:41
【问题描述】:
我有一个表,其中包含存储为 varchars 的选择查询和插入查询。我必须使用过程执行选择查询并使用插入查询插入选择查询的结果。现在我正在执行立即和批量将选择查询收集到 varchars 表中。
在此之后,我转到 vartable 的每一行并获取值并将其放入插入查询中。我有许多对许多表的选择和插入查询。所以这必须动态完成。 我的问题是,有没有更好的方法来存储选择查询的结果?除了使用 varchar 表?因为选择查询的结果集可能有数百万条记录,这可能会导致问题。 使用嵌套表类型并在其上使用 EXTEND 会解决问题吗?
PROCEDURE SEL_INS
AS
CURSOR C
IS
SELECT
SELEQRY SELQRY,
INSQUERY INSERTQRY,
cols COLS
FROM TAB1;
selqry VARCHAR2(1000);
insqry VARCHAR2(1000);
tab1 vartable:=vartable();
cols NUMBER;
BEGIN
tab1:=vartable(NULL);
FOR X IN C
LOOP
selqry:= X.SELQRY;
cols:=X.COLS;
EXECUTE immediate selqry bulk collect INTO tab1;
-- select statement is concatenated before executing. so that each index has one record
--with values separated by commas
--- a sample column in tab1 will have values like (abc,abc1,abc2)
FOR i IN 1..tab1.count
LOOP
insqry :=X.INSERTQRY;
--- insert query will have values like insert into tab2 values('abc,'abc1','abc2')
EXECUTE immediate insqry;
END LOOP;
END LOOP;
END SEL_INS;
vartable 是 varchars2(4000) 类型的表
【问题讨论】:
-
我很困惑
SELECT和INSERT如何协同工作。这些“插入查询”是什么?它们只是要插入数据的表吗?你能重新写这个吗:execute immediate 'insert into '||var_insert_table||' '||var_selquery;? -
@cumberdame 你能举一些简单的例子来说明这些语句的样子吗?我想知道是否有一种方法可以直接插入表而不将数据存储在 PL/SQL 数组中。
-
您可以选择使用
open ... for ...打开动态sql游标,而不是将结果存储在大数组中,参见docs.oracle.com/cd/B28359_01/appdev.111/b28370/…,而不是execute immediate -
为什么要分开插入和选择语句?为什么不在你的表中存储一个
insert into ... select ....语句呢?然后运行execute immediate v_sql_statement;就变得很简单了。或者,如果您的插入和选择语句位于不同的列中,而不是将插入语句存储为insert into .... values (...),为什么不将其设为insert into ....,这样您就可以执行execute immediate v_ins_statement||chr(10)||v_sel_statement; -
插入语句长什么样子?也许可以收集 Insert into ... Select ... 语句并动态执行它。或者作为其他方式将 Select query result 插入临时表并在 Insert statement 中使用
标签: oracle plsql execute-immediate bulk-collect