【发布时间】:2016-11-08 06:39:28
【问题描述】:
我已经在整个互联网上搜索了一些示例,但我仍然无法理解为什么我不能在此光标内使用 DML 语句。我有点错过它背后的理论,但我不会否认如何正确编写这个的例子也会让我的生活更轻松。这是我正在处理的查询(注意:我在未找到结果时删除了退出,如果光标已经打开则关闭,类似的事情只是为了关注这里的要点):
DECLARE
// lots of vars
// the cursor below gets all datasources connected to Node XXYZ123
CURSOR DataSourceCheck
IS
SELECT NODENAAM, NAAM, URL, DBNODE1, DBNODE2, DBUSERNAAM, DBNAAM
FROM SCHEMA.TABLENAME
WHERE NODENAAM = 'XXYZ123';
// this cursor will execute row-by-row based on the result set of above cursor
CURSOR CheckIfOnlyDataSource
IS
SELECT NODENAAM, NAAM, URL, DBNODE1, DBNODE2, DBUSERNAAM, DBNAAM
FROM SCHEMA.TABLENAME
WHERE DBUSERNAAM = var_dbusernaam AND (DBNode1 = var_dbnode1 OR DBNode2 = var_dbnode2);
BEGIN
OPEN DataSourceCheck;
LOOP
FETCH DataSourceCheck into var_nodenaam, var_naam, var_URL, var_dbnode1, var_dbnode2, var_dbusernaam, var_dbnaam;
var_rowcount:= 0;
OPEN CheckIfOnlyDataSource;
LOOP
FETCH CheckIfOnlyDataSource into var_nodenaam2, var_naam2, var_URL2, var_dbnode12, var_dbnode22, var_dbusernaam2, var_dbnaam2;
var_rowcount:= var_rowcount + 1;
END LOOP;
// only save result in a temp table when var_rowcount is 1 and not higher.
IF var_rowcount = 1
THEN
INSERT INTO global_temp_table
(t_dbusernaam, t_nodenaam, t_dbnode1, t_dbnode2, t_distinctcount)
VALUES
(var_dbusernaam2, var_nodenaam2, var_dbnode12, var_dbnode22, var_rowcount)
END IF;
CLOSE CheckIfOnlyDataSource;
END LOOP;
END;
失败点是这部分,带有应将 DML 重新配置为 FORALL 或 BULK INTO 语句的消息:
IF var_rowcount = 1
THEN
INSERT INTO global_temp_table
(t_dbusernaam, t_nodenaam, t_dbnode1, t_dbnode2, t_distinctcount)
VALUES
(var_dbusernaam2, var_nodenaam2, var_dbnode12, var_dbnode22, var_rowcount)
END IF;
我不明白为什么 DML 不能以逐行方式工作?输出清楚地存储在变量var_dbusernaam2、var_nodenaam2、var_dbnode12 和var_dbnode22 中,因此我可以使用dbms_output.put_line 来显示它们。但是如果已经存储到变量中,那我为什么不能直接存储到表中(这不是数十亿的批量数据,甚至不是 1000 条记录!)。
没有简单的解决方法吗?我尝试了 BULK COLLECT 和 FORALL,但我需要更多时间来理解它并正确查询 - 游标中的游标肯定不会让它变得更容易。
【问题讨论】:
-
您确定这是一个错误而不是建议吗?我是 TOAD 规则 4809 的建议。错误的编号是多少?
-
你是对的。我想提一下使用 TOAD。我希望这是一个建议,但是当我添加那部分时,我到处都是错误。让我多看看!
-
哦,哇,我的插入语句末尾缺少分号
-
这个可以优化。只告诉我这里为什么是 OR(DBNode1 = var_dbnode1 OR DBNode2 = var_dbnode2)以及第二个查询是否使用同一个表
-
欢迎回答问题,以便我关闭它。我本可以发誓规则得到执行,但很高兴知道他们没有!至少现在它正在工作。查询需要优化,真的。正在努力:)
标签: oracle bulkinsert dml