Oracle 这是PL/SQL中的一个表表吗(如果不是,这段代码是怎么回事?)

Oracle 这是PL/SQL中的一个表表吗(如果不是,这段代码是怎么回事?),oracle,plsql,Oracle,Plsql,有人能澄清下面的PL/SQL代码在做什么吗?看起来资产类型是一个基本资产表。这就是一张桌子的桌子吗 在填充数据时,我很难将其可视化: assets(v_ref_key)(dbfields(i).field) := rtrim(replace(strbuf_long2,'''','''''')); 这类似于二维数组吗?这是否意味着用v_ref_key索引填充资产(临时)表中的字段列 PROCEDURE LOAD IS TYPE dbfields_rec IS RECORD (field

有人能澄清下面的PL/SQL代码在做什么吗?看起来资产类型是一个基本资产表。这就是一张桌子的桌子吗

在填充数据时,我很难将其可视化:

assets(v_ref_key)(dbfields(i).field) := rtrim(replace(strbuf_long2,'''',''''''));
这类似于二维数组吗?这是否意味着用v_ref_key索引填充资产(临时)表中的字段列

 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;

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

但是,此实现的“多维”方面并不完美:如果需要,您可以处理整行,例如:

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

您无法选择特定的列-无法将特定索引的行中所有元素的集合引用为行类型。你必须做一些事情,比如创建另一个类型并循环第一个数组。

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

但是,此实现的“多维”方面并不完美:如果需要,您可以处理整行,例如:

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

您不能选择特定列-无法将特定索引的行中所有元素集引用到行类型中。您必须执行类似于生成另一个类型并循环第一个数组的操作。

在哪里定义了“资产类型”?我在声明中没有看到它,这看起来像是处理EAV风格数据库模式所需的代码。“dbfields”等
资产
定义为
资产类型
,它是
资产类型
的表,而不是
基础资产
。看起来根本没有使用
base\u Asset
类型。在哪里定义了“Asset\u type”?我在声明中没有看到它,这看起来像是处理EAV风格数据库模式所需的代码。“dbfields”等
资产
定义为
资产类型
,它是
资产类型
的表,而不是
基础资产
。看起来根本没有使用
base\u资产
类型。