问题标签 [bulk-collect]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
66 浏览

sql - 使用动态查询获取单个列

我想将单列提取到数组中。我正在使用以下代码

然后查询类似于

我正在尝试获取它

但为此我收到错误Error(1526,25): PLS-00597: expression 'ar_column' in the INTO list is of wrong type

0 投票
1 回答
231 浏览

sql - 在运行时创建 Oracle 动态表

我尝试使用搜索引擎。这样的场景;我有一个包含文本上下文的表,并且我正在根据我的查询获取一些适合的记录,然后我想将这个建立的 id 文本传输到在运行时动态创建的表上。我的sql代码如下但是这个错误

SQL

0 投票
2 回答
13836 浏览

oracle - 使用“更新”批量收集

在使用 BULK COLLECT 处理 Oracle (11g) 中的记录时,我遇到了一个有趣且意外的问题。

以下代码运行良好,处理了所有数百万多条记录而没有出现问题:

由于在处理每组 100 条记录(限制为 100)结束时,我们正在删除刚刚读取和处理的记录,我认为将“for update”语法添加到游标定义中是个好主意,以便另一个进程可以'在读取数据和删除记录之间不更新任何记录。

所以,我更改的代码中唯一的事情是……</p>

当我在此更改后运行 PL/SQL 包时,作业只处理 100 条记录,然后终止。我通过从游标中删除“for update”确认此更改导致了问题,并且包再次处理了源表中的所有记录。

任何想法为什么添加“for update”子句会导致这种行为变化?有关如何解决此问题的任何建议?我将尝试在流程开始时在表上启动独占事务,但这不是一个理想的解决方案,因为我真的不想锁定处理数据的整个表。

在此先感谢您的帮助,

授予

0 投票
2 回答
2779 浏览

sql - 在没有光标的选择查询中使用批量收集结果

我是 PL/SQL 的新手,我想知道是否可以像这样使用批量收集的结果:

我在编译时遇到错误:

PL/SQL:忽略 SQL 语句

PL/SQL:ORA-00932:不一致的数据类型:预期 NUMBER 得到 SYS_PLSQL_22223_23_1

谢谢你的帮助!

0 投票
2 回答
890 浏览

oracle - Oracle 数据转换 - Bulk/ForALL 不起作用

作为更大处理项目的一部分,我正在尝试找到一种更好的方法将数据从表中提取到另一个表中。我认为我可以通过 BULK COLLECT 和 FORALL 来完成,并获得显着的速度,但我认为我不能使用 BULK COLLECT 处理单个列引用......

我有一个关于继承的数据/应用程序迁移项目(MSSQL 到 Oracle 11.2)。我正在尝试优化和端到端检查...该过程的第一步是将遗留数据(数据库表,4.5M 记录,170 列,全部为字符串格式)导入另一个表。

最初的转换是基于游标的,逐行循环,每一列都经过至少一个用于清除/转换的函数。它有效,但在测试系统上花费了太长时间——用非常简单的函数将 450 万条记录从一个表转换到另一个表需要超过 12 个小时。在我可以访问的本地实现中,它们最终限制为 13000 个单元 ID 号 ID 超过 220k 记录。

我在我的笔记本电脑上设置了一个更有限的开发系统来测试替代技术——并且可以获得超过 5 倍的导入速度,但这仍然是光标/行。我已将表设置为 NOLOGGING 并使用 APPEND 提示。我已经测试了有/没有索引。我不能用那个尺寸的桌子做 SELECT INTO —— 它只是窒息。

还有另一种/更好的技术吗?我还能如何提高转换速度?我用 BULK COLLECT 做错了吗(即有没有办法引用各个字段?)

如果有人有任何见解,请插播!我包含了一个非常精简的过程版本,所以我可以展示我的使用尝试。同样的事情(几乎)作为常规游标循环运行,只是不使用 FORALL 和 (i) 下标。我得到的错误是 ORA-00913: Too Many Values。我已经完成了完整的插入语句,将字段与值匹配。我检查了数据转换函数——它们适用于常规列作为参数。我想知道他们是否因为下标而无法使用 BULK COLLECT 和/或 FORALL ?

更新信息: 这是在一个访问受限的系统上,直到现在(等待帐户),我一直不得不通过在本地系统上运行来远程诊断“真实”(客户)DEV系统——分析代码,数据,时间等。我的建议是由另一位开发人员提出的,他会反馈我的结果。严重地。但是...... @Mark,@Justin - 通常情况下,我会摆脱任何游标而不是?绝对?需要,并尽可能使用 SELECT INTO。这通常是我对旧 PL/SQL 代码的第一个建议......(“为什么。所以。光标?”穿着小丑化妆)。这是我在本地系统上尝试的第一件事,但它只是让服务器慢下来,我退出了测试。那是在减少 NOLOGGING 实施之前 - 这就是我
在查看了时间、查询、连接、索引和哭泣之后,我推荐了 NOLOGGING 并转换为 INSERT /*+ APPEND */ -- 这在其他进程中赢得了时间,主要是由连接构建的表。

回复:“OID <= '000052000'” - 当他们在 cust 开发系统上设置第一次转换代码时,他们必须限制从 PMS_OHF 表转换的记录数量。最初,他们可以在合理的时间内处理 13000 个人员标识符。这 13000 个 ID 将在大约 220K 记录中,所以,当我加入时,这就是他们正在移动的内容。一些重写、加入更正和 NOLOGGING/Insert Append 产生了足够大的差异,他们继续进行。在本地系统上,我认为 13000 太小了——我认为我无法与遗留结果进行有意义的比较——所以我提高了它,并提高了它。我应该勇敢地尝试在笔记本电脑开发系统上进行全面转换——在这里我至少可以通过 EM 观察正在发生的事情......政府不会 不允许他们的 DBA 使用它。(!?)

更大的信息:-- 在再次思考 00913 错误并回想其他项目之后,我意识到早期的错误是当多个元素被传递给一个期望单个元素的函数时......这让我回到了我试图使用下标BULK COLLECT 循环中的字段名称。我重新观看了几个 Steven Feuerstein YT 的演讲,我认为它终于融入了。简单的网络示例......我正在水平制作我的类型,而不是垂直(反之亦然)......为了得到我的函数调用才能工作,我想我必须为每个字段创建一个类型,以及该类型的数组/表。突然(170 次)我想我会看一些关于手动并行的 Tom Kyte 课程,然后问 wx 我可以访问新的(11.2?)DBMS_PARALLEL_EXECUTE 接口——我对此表示怀疑。还,不知道更多关于 cust 开发系统的信息,除了最好称为“不充分”的描述,我不知道 wx //ism 会是一个巨大的帮助。我需要阅读 //ism

我所知道的是,我必须完成一些完整的运行,否则我会不愿意说我们的结果“足够接近”遗留结果。对于我们的测试,我们可能没有太多选择来进行多天的完整运行。

0 投票
0 回答
66 浏览

oracle - 从过程返回 TABLE 类型

我正在测试此代码以从过程中返回 TABLE 类型,但我收到了一个错误,我认为这是不应该发生的,因为我正在获取员工表的整行的表类型。

6/65 PL/SQL:ORA-00913:值太多 6/1
PL/SQL:SQL 语句被忽略

另外使用 TABLE 类型而不是 REF CURSOR 从过程返回值的优点和缺点是什么?

0 投票
1 回答
1158 浏览

oracle - 批量收集到内部 for 循环

我已经声明了一个自定义类型

在我的程序中,我写了一个 for 循环

但我在 mytab 中只看到一行。我知道每次获取数据时批量收集都会覆盖 mytab 的内容。我如何避免这种情况并将数据附加到“mytab”的末尾

0 投票
2 回答
11798 浏览

oracle - 批量收集到表类型的对象

BULK COLLECT尝试对对象表使用语句时出现错误ORA-00947: not enough values

线路发生错误from (select jta.nobject_id,

是什么原因?

0 投票
1 回答
6787 浏览

plsql - 使用 Bulk Collect 跳到 pl sql 游标中的下一条记录

请分析下面的代码片段并提出一种跳到光标中下一条记录的方法。

开始

0 投票
1 回答
629 浏览

sql - 在 PL SQL 中,我想通过使用 BULK COLLECT 和 FORALL 来重构这个带有插入的 for 循环

出于性能原因,我想重写以下内容以使用 BULK COLLECT 和 FORALL,而不是在循环中进行插入。我遇到的问题是,必须在循环的每次迭代中生成 empID,或者我需要使用 BULK COLLECT 执行类似的操作来创建一个集合以使用 FORALL。

...

BULK COLLECT 和 FORALL 的示例似乎主要包括创建一个游标,您可以在其中从 [some table] 中选择 *,然后获取该游标并执行 BULK COLLECT。但是,我需要以某种方式使用下一个连续的“numberOfEmployeesToAdd”ID 数在游标内动态分配值,然后执行 FORALL 来进行插入。