这是PL / SQL中的表格表(如果不是这个代码发生了什么?)

时间:2013-03-19 18:17:42

标签: oracle plsql

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

1 个答案:

答案 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中。你必须做一些像制作另一种类型并循环遍历第一个数组的东西。