有人可以澄清下面的PL / SQL代码在做什么吗?看起来assets_type是base_Asset的表。这会使它成为表格表吗?
当它填充数据时,我很难想象这个:
assets(v_ref_key)(dbfields(i).field) := rtrim(replace(strbuf_long2,'''',''''''));
这类似于二维数组吗?这是否意味着使用索引v_ref_key填充assets(临时)表中的字段列?
PROCEDURE LOAD
IS
TYPE dbfields_rec IS RECORD (field dbfields.field%TYPE,
article_title dbfields.title%TYPE,
image_title dbfields.title%TYPE);
TYPE dbfields_type IS TABLE OF dbfields_rec INDEX BY BINARY_INTEGER;
TYPE base_Asset IS TABLE OF VARCHAR2(4000) INDEX BY VARCHAR2(32);
TYPE assets_type IS TABLE OF asset_type INDEX BY VARCHAR2(4000);
dbfields dbfields_type;
assets assets_type;
v_ref_key assets.ref_key%TYPE;
-- CLIPPED Populate dbfields array code
-- It correctly populates
FOR i IN 1..dbfields.COUNT LOOP
BEGIN
sqlbuf := '(select rtrim(ufld3), ' || dbfields(i).field ||
' as col_label from assetstable ' ||
' where rtrim(ufld3) = ' || '''' || in_id || '''' || ' )';
OPEN assets_cur FOR
sqlbuf;
LOOP
FETCH assets_cur INTO v_ref_key, strbuf_long2;
EXIT WHEN assets_cur%NOTFOUND;
IF (trim(strbuf_long2) is not null and dbfields(i).field is not null) THEN
assets(v_ref_key) (dbfields(i).field)
:= rtrim(replace(strbuf_long2,'''',''''''));
END IF;
END LOOP;
close assets_cur;
END;
END LOOP;
END LOAD;
答案 0 :(得分:3)
PL / SQL实际上只提供一维数组 - 但是如果你想让数组像多维数组一样,那么数组的每个元素都可以是另一个数组。
这是一个非常人为的例子来说明:
DECLARE
TYPE rows_type IS TABLE OF VARCHAR2(4000) INDEX BY VARCHAR2(4000);
TYPE spreadsheet_type IS TABLE OF row_type INDEX BY VARCHAR2(4000);
spreadsheet spreadsheet_type;
BEGIN
spreadsheet ('row 1') ('column A') := 'XYZ';
END;
第一个('row 1')
是spreadsheet_type数组的索引,它包含特定“行”的所有列;第二个('column A')
是rows_type数组的索引。
此实现的“多维”方面并不完美:如果您愿意,可以使用整行:例如:
my_row rows_type;
...
my_row := spreadsheet ('row 1');
你不能挑选出一个特定的列 - 没有办法将特定索引的行中所有元素的集合引用到rows_type中。你必须做一些像制作另一种类型并循环遍历第一个数组的东西。