Oracle PL/SQL 数组的索引是从 0 还是从 1?

Posted

技术标签:

【中文标题】Oracle PL/SQL 数组的索引是从 0 还是从 1?【英文标题】:Are Oracle PL/SQL arrays indexed from 0 or from 1? 【发布时间】:2012-07-25 17:45:54 【问题描述】:

我面前有这样一段代码:

FOR row IN 1..l_RowSet(1).count 
LOOP
   l_a_variable := l_RowSet(1)(row);
END LOOP;

l_RowSet 是 ApEx 类型 -- apex_plugin_util.t_column_value_list -- 定义如下:

type t_column_value_list  is table of wwv_flow_global.vc_arr2 index by pls_integer;

其中wwv_flow_global.vc_arr2 定义为

type vc_arr2 is table of varchar2(32767) index by binary_integer;

vc_arr2apex_plugin_util.get_data 函数传回我的代码。 vc_arr2 由 column 编号索引,而不是按行。

尽我所能,这意味着数据有效地存储在二维数组中,按列索引,然后按行索引。

当使用 LOOP 语句时,它是从零开始索引还是从一开始?因为在我看来,我应该能够使那个 LOOP 变得多余,即:

l_a_variable := l_RowSet(1)(1);

但我需要提前知道是否将 0 或 1 作为初始行。

我在 Oracle 文档中找不到明确的答案(不出所料,“索引”是一个相当广泛使用的术语),通过 SO 也没有看到其他人有同样的问题。

【问题讨论】:

PL/SQL 没有名为“数组”的概念。它有两种(或三种,取决于您选择计算的内容)类似于“数组”的数据类型(例如,“数组”在 C 或 FORTRAN 中定义):关联数组和 VARRAY。 (或者您也可以选择在这里计算 NESTED TABLE)。您正在查看的类型是关联数组。然而,真正像“数组”的数据类型是 PL/SQL 中的 VARRAY。 VARRAY 索引是从 1 开始,而不是从 0 开始。关联数组甚至没有“从”某物索引的概念;它们只是......好吧......关联数组。 【参考方案1】:

关联数组不一定是密集的。索引 0 处可能有一个元素,索引 -1 处可能有一个元素,索引 1 处可能有一个元素。或者您可能在索引 17、42 和 127 处有元素。您发布的代码暗示关联数组很密集,索引从 1 开始。

apex_plugin_util.get_data 的特定情况下,集合应该是密集的并且应该从 1 开始。如果循环实际上除了您发布的内容之外没有做任何事情,您可以通过获取 l_RowSet(1) 的最后一个元素来替换它,即

l_a_variable := l_RowSet(1)(l_RowSet(1).count);

【讨论】:

谢谢。我已经更新了问题以更好地解释 get_data 的作用。它一个二维集合,按列然后按行。鉴于 PL/SQL 数组可能很稀疏,我需要进一步挖掘,看看它“实时”返回给我的是什么。 @JacquesChester - apex_plugin_util.get_data 返回一个类型为 t_column_value_list 的集合,它是一个多维数组。更新了问题并从我的回答中删除了 1D/2D 讨论。

以上是关于Oracle PL/SQL 数组的索引是从 0 还是从 1?的主要内容,如果未能解决你的问题,请参考以下文章

oracle pl/sql 分页

PL/SQL集合(table)嵌套表操作实例讲解实例

SQL记录-PLSQL集合

在 Oracle PL/SQL 中获取具有索引而不是列名的字段

PL/SQL数组

PL/SQL 关联数组验证索引是不是存在