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_arr2
从apex_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?的主要内容,如果未能解决你的问题,请参考以下文章