2

有人可以澄清下面的 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;
4

1 回答 1

4

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')是电子表格类型数组的索引,它将保存特定“行”的所有列;第二个('column A')是 rows_type 数组的索引。

但是,此实现的“多维”方面并不完美:虽然您可以根据需要使用整行,例如:

my_row rows_type;
...
my_row := spreadsheet ('row 1');

您无法选择特定列 - 无法将特定索引的行中所有元素的集合引用到 rows_type。你必须做一些事情,比如制作另一种类型并遍历第一个数组。

于 2013-03-20T03:28:20.667 回答